1- import { useEffect , useState } from "react" ;
21import { Button , Card , Checkbox , ColorPicker , Input , Message , Select , Space } from "@arco-design/web-react" ;
32import { IconQuestionCircleFill } from "@arco-design/web-react/icon" ;
43import prettier from "prettier/standalone" ;
54import * as babel from "prettier/parser-babel" ;
65import prettierPluginEstree from "prettier/plugins/estree" ;
76import GMApiSetting from "@App/pages/components/GMApiSetting" ;
8- import { systemConfig } from "@App/pages/store/global" ;
97import i18n from "@App/locales/locales" ;
108import { useTranslation } from "react-i18next" ;
119import Logger from "@App/app/logger/logger" ;
12- import type { FileSystemType } from "@Packages/filesystem/factory" ;
1310import FileSystemFactory from "@Packages/filesystem/factory" ;
1411import FileSystemParams from "@App/pages/components/FileSystemParams" ;
1512import { blackListSelfCheck } from "@App/pkg/utils/match" ;
1613import { obtainBlackList } from "@App/pkg/utils/utils" ;
1714import CustomTrans from "@App/pages/components/CustomTrans" ;
15+ import { useSystemConfig } from "./utils" ;
1816
1917function Setting ( ) {
20- const [ syncDelete , setSyncDelete ] = useState < boolean > ( ) ;
21- const [ syncScriptStatus , setSyncScriptStatus ] = useState < boolean > ( ) ;
22- const [ enableCloudSync , setEnableCloudSync ] = useState < boolean > ( ) ;
23- const [ fileSystemType , setFilesystemType ] = useState < FileSystemType > ( "webdav" ) ;
24- const [ fileSystemParams , setFilesystemParam ] = useState < {
25- [ key : string ] : any ;
26- } > ( { } ) ;
27- const [ language , setLanguage ] = useState ( i18n . language ) ;
28- const [ menuExpandNum , setMenuExpandNum ] = useState ( 5 ) ;
29- const [ checkScriptUpdateCycle , setCheckScriptUpdateCycle ] = useState ( 0 ) ;
30- const [ updateDisableScript , setUpdateDisableScript ] = useState ( false ) ;
31- const [ silenceUpdateScript , setSilenceUpdateScript ] = useState ( false ) ;
32- const [ enableEslint , setEnableEslint ] = useState ( false ) ;
33- const [ editorConfig , setEditorConfig ] = useState ( "" ) ;
34- const [ editorTypeDefinition , setEditorTypeDefinition ] = useState ( "" ) ;
35- const [ eslintConfig , setEslintConfig ] = useState ( "" ) ;
36- const [ blacklist , setBlacklist ] = useState < string > ( "" ) ;
37- const [ badgeNumberType , setBadgeNumberType ] = useState < "none" | "run_count" | "script_count" > ( "run_count" ) ;
38- const [ badgeBackgroundColor , setBadgeBackgroundColor ] = useState ( "#4e5969" ) ;
39- const [ badgeTextColor , setBadgeTextColor ] = useState ( "#ffffff" ) ;
40- const [ scriptMenuDisplayType , setScriptMenuDisplayType ] = useState < "no_browser" | "all" > ( "all" ) ;
18+ const [ editorConfig , setEditorConfig , submitEditorConfig ] = useSystemConfig ( "editor_config" ) ;
19+ const [ cloudSync , setCloudSync , submitCloudSync ] = useSystemConfig ( "cloud_sync" ) ;
20+ const [ language , , submitLanguage ] = useSystemConfig ( "language" ) ;
21+ const [ menuExpandNum , , submitMenuExpandNum ] = useSystemConfig ( "menu_expand_num" ) ;
22+ const [ checkScriptUpdateCycle , , submitCheckScriptUpdateCycle ] = useSystemConfig ( "check_script_update_cycle" ) ;
23+ const [ updateDisableScript , , submitUpdateDisableScript ] = useSystemConfig ( "update_disable_script" ) ;
24+ const [ silenceUpdateScript , , submitSilenceUpdateScript ] = useSystemConfig ( "silence_update_script" ) ;
25+ const [ enableEslint , , submitEnableEslint ] = useSystemConfig ( "enable_eslint" ) ;
26+ const [ eslintConfig , setEslintConfig , submitEslintConfig ] = useSystemConfig ( "eslint_config" ) ;
27+ const [ blacklist , setBlacklist , submitBlacklist ] = useSystemConfig ( "blacklist" ) ;
28+ const [ badgeNumberType , , submitBadgeNumberType ] = useSystemConfig ( "badge_number_type" ) ;
29+ const [ badgeBackgroundColor , , submitBadgeBackgroundColor ] = useSystemConfig ( "badge_background_color" ) ;
30+ const [ badgeTextColor , , submitBadgeTextColor ] = useSystemConfig ( "badge_text_color" ) ;
31+ const [ scriptMenuDisplayType , , submitScriptMenuDisplayType ] = useSystemConfig ( "script_menu_display_type" ) ;
32+ const [ editorTypeDefinition , setEditorTypeDefinition , submitEditorTypeDefinition ] =
33+ useSystemConfig ( "editor_type_definition" ) ;
4134 const languageList : { key : string ; title : string } [ ] = [ ] ;
4235 const { t } = useTranslation ( ) ;
4336 for ( const key of Object . keys ( i18n . store . data ) ) {
@@ -54,68 +47,6 @@ function Setting() {
5447 title : t ( "help_translate" ) ,
5548 } ) ;
5649
57- useEffect ( ( ) => {
58- const loadConfigs = ( ) => {
59- Promise . all ( [
60- systemConfig . getCloudSync ( ) ,
61- systemConfig . getMenuExpandNum ( ) ,
62- systemConfig . getCheckScriptUpdateCycle ( ) ,
63- systemConfig . getUpdateDisableScript ( ) ,
64- systemConfig . getSilenceUpdateScript ( ) ,
65- systemConfig . getEslintConfig ( ) ,
66- systemConfig . getEnableEslint ( ) ,
67- systemConfig . getLanguage ( ) ,
68- systemConfig . getBlacklist ( ) ,
69- systemConfig . getBadgeNumberType ( ) ,
70- systemConfig . getBadgeBackgroundColor ( ) ,
71- systemConfig . getBadgeTextColor ( ) ,
72- systemConfig . getScriptMenuDisplayType ( ) ,
73- systemConfig . getEditorConfig ( ) ,
74- systemConfig . getEditorTypeDefinition ( ) ,
75- ] ) . then (
76- ( [
77- cloudSync ,
78- menuExpandNum ,
79- checkCycle ,
80- updateDisabled ,
81- silenceUpdate ,
82- eslintConfig ,
83- enableEslint ,
84- language ,
85- blacklist ,
86- badgeNumberType ,
87- badgeBackgroundColor ,
88- badgeTextColor ,
89- scriptMenuDisplayType ,
90- editorConfig ,
91- editorTypeDefinition ,
92- ] ) => {
93- setSyncDelete ( cloudSync . syncDelete ) ;
94- setSyncScriptStatus ( cloudSync . syncStatus ) ;
95- setEnableCloudSync ( cloudSync . enable ) ;
96- setFilesystemType ( cloudSync . filesystem ) ;
97- setFilesystemParam ( cloudSync . params [ cloudSync . filesystem ] || { } ) ;
98- setMenuExpandNum ( menuExpandNum ) ;
99- setCheckScriptUpdateCycle ( checkCycle ) ;
100- setUpdateDisableScript ( updateDisabled ) ;
101- setSilenceUpdateScript ( silenceUpdate ) ;
102- setEslintConfig ( eslintConfig ) ;
103- setEnableEslint ( enableEslint ) ;
104- setLanguage ( language ) ;
105- setBlacklist ( blacklist ) ;
106- setBadgeNumberType ( badgeNumberType ) ;
107- setBadgeBackgroundColor ( badgeBackgroundColor ) ;
108- setBadgeTextColor ( badgeTextColor ) ;
109- setScriptMenuDisplayType ( scriptMenuDisplayType ) ;
110- setEditorConfig ( editorConfig ) ;
111- setEditorTypeDefinition ( editorTypeDefinition ) ;
112- }
113- ) ;
114- } ;
115-
116- loadConfigs ( ) ;
117- } , [ ] ) ;
118-
11950 return (
12051 < Space className = "setting w-full h-full overflow-auto relative" direction = "vertical" >
12152 { /* 基本设置 */ }
@@ -131,8 +62,7 @@ function Setting() {
13162 window . open ( "https://crowdin.com/project/scriptcat" , "_blank" ) ;
13263 return ;
13364 }
134- setLanguage ( value ) ;
135- systemConfig . setLanguage ( value ) ;
65+ submitLanguage ( value ) ;
13666 Message . success ( t ( "language_change_tip" ) ! ) ;
13767 } }
13868 >
@@ -152,17 +82,17 @@ function Setting() {
15282 < Space direction = "vertical" className = { "w-full" } >
15383 < Space direction = "horizontal" className = { "w-full" } >
15484 < Checkbox
155- checked = { syncDelete }
85+ checked = { cloudSync . syncDelete }
15686 onChange = { ( checked ) => {
157- setSyncDelete ( checked ) ;
87+ setCloudSync ( { ... cloudSync , syncDelete : checked } ) ;
15888 } }
15989 >
16090 { t ( "sync_delete" ) }
16191 </ Checkbox >
16292 < Checkbox
163- checked = { syncScriptStatus }
93+ checked = { cloudSync . syncStatus }
16494 onChange = { ( checked ) => {
165- setSyncScriptStatus ( checked ) ;
95+ setCloudSync ( { ... cloudSync , syncStatus : checked } ) ;
16696 } }
16797 >
16898 { t ( "sync_status" ) }
@@ -171,9 +101,9 @@ function Setting() {
171101 < FileSystemParams
172102 preNode = {
173103 < Checkbox
174- checked = { enableCloudSync }
104+ checked = { cloudSync . enable }
175105 onChange = { ( checked ) => {
176- setEnableCloudSync ( checked ) ;
106+ setCloudSync ( { ... cloudSync , enable : checked } ) ;
177107 } }
178108 >
179109 { t ( "enable_script_sync_to" ) }
@@ -186,38 +116,29 @@ function Setting() {
186116 onClick = { async ( ) => {
187117 // Save to the configuration
188118 // Perform validation if enabled
189- if ( enableCloudSync ) {
119+ if ( cloudSync . enable ) {
190120 Message . info ( t ( "cloud_sync_account_verification" ) ! ) ;
191121 try {
192- await FileSystemFactory . create ( fileSystemType , fileSystemParams ) ;
122+ await FileSystemFactory . create ( cloudSync . filesystem , cloudSync . params [ cloudSync . filesystem ] ) ;
193123 } catch ( e ) {
194124 Message . error ( `${ t ( "cloud_sync_verification_failed" ) } : ${ JSON . stringify ( Logger . E ( e ) ) } ` ) ;
195125 return ;
196126 }
197127 }
198- const cloudSync = await systemConfig . getCloudSync ( ) ;
199- const params = { ...cloudSync . params } ;
200- params [ fileSystemType ] = fileSystemParams ;
201- systemConfig . setCloudSync ( {
202- enable : enableCloudSync || false ,
203- syncDelete : syncDelete || false ,
204- syncStatus : syncScriptStatus || false ,
205- filesystem : fileSystemType ,
206- params,
207- } ) ;
128+ submitCloudSync ( ) ;
208129 Message . success ( t ( "save_success" ) ! ) ;
209130 } }
210131 >
211132 { t ( "save" ) }
212133 </ Button > ,
213134 ] }
214- fileSystemType = { fileSystemType }
215- fileSystemParams = { fileSystemParams }
135+ fileSystemType = { cloudSync . filesystem }
136+ fileSystemParams = { cloudSync . params [ cloudSync . filesystem ] || { } }
216137 onChangeFileSystemType = { ( type ) => {
217- setFilesystemType ( type ) ;
138+ setCloudSync ( { ... cloudSync , filesystem : type } ) ;
218139 } }
219140 onChangeFileSystemParams = { ( params ) => {
220- setFilesystemParam ( params ) ;
141+ setCloudSync ( { ... cloudSync , params : { ... cloudSync . params , [ cloudSync . filesystem ] : params } } ) ;
221142 } }
222143 />
223144 </ Space >
@@ -237,8 +158,7 @@ function Setting() {
237158 value = { badgeNumberType }
238159 className = "w-40 max-w-50"
239160 onChange = { ( value ) => {
240- setBadgeNumberType ( value ) ;
241- systemConfig . setBadgeNumberType ( value ) ;
161+ submitBadgeNumberType ( value ) ;
242162 } }
243163 >
244164 < Select . Option value = "none" > { t ( "badge_type_none" ) } </ Select . Option >
@@ -255,8 +175,7 @@ function Setting() {
255175 value = { badgeBackgroundColor }
256176 onChange = { ( value ) => {
257177 const colorValue = typeof value === "string" ? value : value [ 0 ] ?. color || "#4e5969" ;
258- setBadgeBackgroundColor ( colorValue ) ;
259- systemConfig . setBadgeBackgroundColor ( colorValue ) ;
178+ submitBadgeBackgroundColor ( colorValue ) ;
260179 } }
261180 showText
262181 disabledAlpha
@@ -272,8 +191,7 @@ function Setting() {
272191 value = { badgeTextColor }
273192 onChange = { ( value ) => {
274193 const colorValue = typeof value === "string" ? value : value [ 0 ] ?. color || "#ffffff" ;
275- setBadgeTextColor ( colorValue ) ;
276- systemConfig . setBadgeTextColor ( colorValue ) ;
194+ submitBadgeTextColor ( colorValue ) ;
277195 } }
278196 showText
279197 disabledAlpha
@@ -295,8 +213,7 @@ function Setting() {
295213 checked = { scriptMenuDisplayType === "all" }
296214 onChange = { ( e ) => {
297215 const checked = e ;
298- setScriptMenuDisplayType ( checked ? "all" : "no_browser" ) ;
299- systemConfig . setScriptMenuDisplayType ( checked ? "all" : "no_browser" ) ;
216+ submitScriptMenuDisplayType ( checked ? "all" : "no_browser" ) ;
300217 } }
301218 >
302219 { t ( "display_right_click_menu" ) }
@@ -313,8 +230,7 @@ function Setting() {
313230 value = { menuExpandNum . toString ( ) }
314231 onChange = { ( val ) => {
315232 const num = parseInt ( val , 10 ) ;
316- setMenuExpandNum ( num ) ;
317- systemConfig . setMenuExpandNum ( num ) ;
233+ submitMenuExpandNum ( num ) ;
318234 } }
319235 />
320236 </ div >
@@ -336,8 +252,7 @@ function Setting() {
336252 className = "w-35 max-w-45"
337253 onChange = { ( value ) => {
338254 const num = parseInt ( value , 10 ) ;
339- setCheckScriptUpdateCycle ( num ) ;
340- systemConfig . setCheckScriptUpdateCycle ( num ) ;
255+ submitCheckScriptUpdateCycle ( num ) ;
341256 } }
342257 >
343258 < Select . Option value = "0" > { t ( "never" ) } </ Select . Option >
@@ -355,17 +270,15 @@ function Setting() {
355270 < span className = "font-medium mb-1" > { t ( "update_options" ) } </ span >
356271 < Checkbox
357272 onChange = { ( checked ) => {
358- setUpdateDisableScript ( checked ) ;
359- systemConfig . setUpdateDisableScript ( checked ) ;
273+ submitUpdateDisableScript ( checked ) ;
360274 } }
361275 checked = { updateDisableScript }
362276 >
363277 { t ( "update_disabled_scripts" ) }
364278 </ Checkbox >
365279 < Checkbox
366280 onChange = { ( checked ) => {
367- setSilenceUpdateScript ( checked ) ;
368- systemConfig . setSilenceUpdateScript ( checked ) ;
281+ submitSilenceUpdateScript ( checked ) ;
369282 } }
370283 checked = { silenceUpdateScript }
371284 >
@@ -405,7 +318,7 @@ function Setting() {
405318 Message . error ( `${ t ( "expression_format_error" ) } : ${ ret . line } ` ) ;
406319 return ;
407320 }
408- systemConfig . setBlacklist ( val ) ;
321+ submitBlacklist ( val ) ;
409322 } }
410323 />
411324 </ div >
@@ -417,8 +330,7 @@ function Setting() {
417330 < div className = "flex items-center gap-4 flex-1" >
418331 < Checkbox
419332 onChange = { ( checked ) => {
420- setEnableEslint ( checked ) ;
421- systemConfig . setEnableEslint ( checked ) ;
333+ submitEnableEslint ( checked ) ;
422334 } }
423335 checked = { enableEslint }
424336 >
@@ -466,7 +378,7 @@ function Setting() {
466378 } else {
467379 Message . success ( t ( "eslint_rules_saved" ) ) ;
468380 }
469- systemConfig . setEslintConfig ( value ) ;
381+ submitEslintConfig ( value ) ;
470382 } )
471383 . catch ( ( e ) => {
472384 Message . error ( `${ t ( "eslint_config_format_error" ) } : ${ JSON . stringify ( Logger . E ( e ) ) } ` ) ;
@@ -505,7 +417,7 @@ function Setting() {
505417 } else {
506418 Message . success ( t ( "editor_config_saved" ) ) ;
507419 }
508- systemConfig . setEditorConfig ( value ) ;
420+ submitEditorConfig ( value ) ;
509421 } )
510422 . catch ( ( e ) => {
511423 Message . error ( `${ t ( "editor_config_format_error" ) } : ${ JSON . stringify ( Logger . E ( e ) ) } ` ) ;
@@ -529,7 +441,7 @@ function Setting() {
529441 minRows : 4 ,
530442 maxRows : 8 ,
531443 } }
532- value = { editorTypeDefinition }
444+ value = { editorTypeDefinition as string }
533445 onChange = { ( v ) => {
534446 setEditorTypeDefinition ( v ) ;
535447 } }
@@ -539,7 +451,7 @@ function Setting() {
539451 } else {
540452 Message . success ( t ( "editor_type_definition_saved" ) ) ;
541453 }
542- systemConfig . setEditorTypeDefinition ( editorTypeDefinition ) ;
454+ submitEditorTypeDefinition ( editorTypeDefinition as string ) ;
543455 } }
544456 />
545457 </ div >
0 commit comments