@@ -50,6 +50,8 @@ export type PreferencesSyncState = {
5050 pending : boolean ;
5151} ;
5252
53+ const IMAGE_RESIZE_MAX_ID = 3 ;
54+
5355type UserPreferencesContextValue = {
5456 preferences : UserPreferences ;
5557 setDefaultServerUrl : ( url : string | null ) => void ;
@@ -61,6 +63,9 @@ type UserPreferencesContextValue = {
6163 setShowListPreviews : ( value : boolean ) => void ;
6264 setKeepSearchExpanded : ( value : boolean ) => void ;
6365 setTheme : ( theme : "dark" | "light" ) => void ;
66+ setOptimizeImageUploadsByDefault : ( value : boolean ) => void ;
67+ setStripImageMetadataByDefault : ( value : boolean ) => void ;
68+ setDefaultImageResizeOption : ( value : number ) => void ;
6469 setSyncEnabled : ( value : boolean ) => Promise < void > ;
6570 syncState : PreferencesSyncState ;
6671 preferencesReady : boolean ;
@@ -99,7 +104,10 @@ const preferencesEqual = (a: UserPreferences, b: UserPreferences) =>
99104 a . showGridPreviews === b . showGridPreviews &&
100105 a . showListPreviews === b . showListPreviews &&
101106 a . keepSearchExpanded === b . keepSearchExpanded &&
102- a . theme === b . theme ;
107+ a . theme === b . theme &&
108+ a . optimizeImageUploadsByDefault === b . optimizeImageUploadsByDefault &&
109+ a . stripImageMetadataByDefault === b . stripImageMetadataByDefault &&
110+ a . defaultImageResizeOption === b . defaultImageResizeOption ;
103111
104112export const UserPreferencesProvider : React . FC < { children : React . ReactNode } > = ( { children } ) => {
105113 const { ndk, signer, user, ensureConnection } = useNdk ( ) ;
@@ -517,6 +525,37 @@ export const UserPreferencesProvider: React.FC<{ children: React.ReactNode }> =
517525 [ mutatePreferences ] ,
518526 ) ;
519527
528+ const setOptimizeImageUploadsByDefault = useCallback (
529+ ( value : boolean ) => {
530+ mutatePreferences ( prev => {
531+ if ( prev . optimizeImageUploadsByDefault === value ) return prev ;
532+ return { ...prev , optimizeImageUploadsByDefault : value } ;
533+ } ) ;
534+ } ,
535+ [ mutatePreferences ] ,
536+ ) ;
537+
538+ const setStripImageMetadataByDefault = useCallback (
539+ ( value : boolean ) => {
540+ mutatePreferences ( prev => {
541+ if ( prev . stripImageMetadataByDefault === value ) return prev ;
542+ return { ...prev , stripImageMetadataByDefault : value } ;
543+ } ) ;
544+ } ,
545+ [ mutatePreferences ] ,
546+ ) ;
547+
548+ const setDefaultImageResizeOption = useCallback (
549+ ( value : number ) => {
550+ const clamped = Math . max ( 0 , Math . min ( IMAGE_RESIZE_MAX_ID , Math . trunc ( value ) ) ) ;
551+ mutatePreferences ( prev => {
552+ if ( prev . defaultImageResizeOption === clamped ) return prev ;
553+ return { ...prev , defaultImageResizeOption : clamped } ;
554+ } ) ;
555+ } ,
556+ [ mutatePreferences ] ,
557+ ) ;
558+
520559 const setSyncEnabled = useCallback (
521560 async ( value : boolean ) => {
522561 if ( value === syncEnabled ) return ;
@@ -569,6 +608,9 @@ export const UserPreferencesProvider: React.FC<{ children: React.ReactNode }> =
569608 setShowListPreviews,
570609 setKeepSearchExpanded,
571610 setTheme,
611+ setOptimizeImageUploadsByDefault,
612+ setStripImageMetadataByDefault,
613+ setDefaultImageResizeOption,
572614 setSyncEnabled,
573615 syncState,
574616 preferencesReady : initialSyncReady ,
@@ -584,6 +626,9 @@ export const UserPreferencesProvider: React.FC<{ children: React.ReactNode }> =
584626 setShowListPreviews ,
585627 setKeepSearchExpanded ,
586628 setTheme ,
629+ setOptimizeImageUploadsByDefault ,
630+ setStripImageMetadataByDefault ,
631+ setDefaultImageResizeOption ,
587632 setSyncEnabled ,
588633 syncState ,
589634 initialSyncReady ,
0 commit comments