@@ -43,6 +43,30 @@ const THEME_KEYS = {
4343 CSS : 'THEME_CUSTOM_CSS' ,
4444} ;
4545
46+ const CONFIG_DEFAULTS : Record < string , string > = {
47+ ...Object . fromEntries ( APP_CONFIG_KEYS . map ( ( { key, default : def } ) => [ key , def ?? '' ] ) ) ,
48+ APP_DEFAULT_LANGUAGE : 'zh' ,
49+ AUTH_ALLOW_REGISTER : 'false' ,
50+ AUTH_DEFAULT_REGISTER_ROLE_ID : '' ,
51+ DEFAULT_FILE_VIEW_MODE : 'grid' ,
52+ [ THEME_KEYS . MODE ] : 'light' ,
53+ [ THEME_KEYS . PRIMARY ] : '#111111' ,
54+ [ THEME_KEYS . RADIUS ] : '10' ,
55+ [ THEME_KEYS . TOKENS ] : '' ,
56+ [ THEME_KEYS . CSS ] : '' ,
57+ WEBDAV_MAPPING_ENABLED : '1' ,
58+ S3_MAPPING_ENABLED : '1' ,
59+ S3_MAPPING_BUCKET : 'foxel' ,
60+ S3_MAPPING_REGION : '' ,
61+ S3_MAPPING_BASE_PATH : '/' ,
62+ S3_MAPPING_ACCESS_KEY : '' ,
63+ S3_MAPPING_SECRET_KEY : '' ,
64+ EMAIL_CONFIG : '' ,
65+ EMAIL_PASSWORD_RESET_TEMPLATE : '' ,
66+ } ;
67+
68+ const stringifyConfigValue = ( value : unknown ) => String ( value ?? '' ) ;
69+
4670export default function SystemSettingsPage ( { tabKey, onTabNavigate } : SystemSettingsPageProps ) {
4771 const [ loading , setLoading ] = useState ( false ) ;
4872 const [ config , setConfigState ] = useState < Record < string , string > | null > ( null ) ;
@@ -69,16 +93,21 @@ export default function SystemSettingsPage({ tabKey, onTabNavigate }: SystemSett
6993 const handleSave = async ( values : Record < string , unknown > ) : Promise < boolean > => {
7094 setLoading ( true ) ;
7195 try {
72- for ( const [ key , value ] of Object . entries ( values ) ) {
73- await setConfig ( key , String ( value ?? '' ) ) ;
96+ const currentConfig = config ?? { } ;
97+ const changedValues = Object . fromEntries (
98+ Object . entries ( values )
99+ . map ( ( [ key , value ] ) => [ key , stringifyConfigValue ( value ) ] as const )
100+ . filter ( ( [ key , value ] ) => value !== ( currentConfig [ key ] ?? CONFIG_DEFAULTS [ key ] ?? '' ) ) ,
101+ ) as Record < string , string > ;
102+
103+ for ( const [ key , value ] of Object . entries ( changedValues ) ) {
104+ await setConfig ( key , value ) ;
74105 }
106+
75107 message . success ( t ( 'Saved successfully' ) ) ;
76- const stringValues = Object . fromEntries (
77- Object . entries ( values ) . map ( ( [ key , value ] ) => [ key , String ( value ?? '' ) ] ) ,
78- ) as Record < string , string > ;
79- setConfigState ( ( prev ) => ( { ...( prev ?? { } ) , ...stringValues } ) ) ;
108+ setConfigState ( ( prev ) => ( { ...( prev ?? { } ) , ...changedValues } ) ) ;
80109 // trigger theme refresh if related keys changed
81- if ( Object . keys ( values ) . some ( k => Object . values ( THEME_KEYS ) . includes ( k ) ) ) {
110+ if ( Object . keys ( changedValues ) . some ( k => Object . values ( THEME_KEYS ) . includes ( k ) ) ) {
82111 await refreshTheme ( ) ;
83112 }
84113 return true ;
0 commit comments