@@ -39,6 +39,18 @@ interface ModalProps {
3939 theme : string ;
4040}
4141
42+ interface ConfirmModalProps {
43+ isOpen : boolean ;
44+ onClose : ( ) => void ;
45+ onConfirm : ( ) => void ;
46+ theme : string ;
47+ title : string ;
48+ message : string ;
49+ confirmText : string ;
50+ cancelText : string ;
51+ fontSize : number ;
52+ }
53+
4254const Modal : React . FC < ModalProps > = ( { isOpen, onClose, children, theme } ) => {
4355 if ( ! isOpen ) return null ;
4456 const isDarkTheme = darkThemes . includes ( theme ) ;
@@ -61,6 +73,59 @@ const Modal: React.FC<ModalProps> = ({ isOpen, onClose, children, theme }) => {
6173 ) ;
6274} ;
6375
76+ const ConfirmModal : React . FC < ConfirmModalProps > = ( {
77+ isOpen,
78+ onClose,
79+ onConfirm,
80+ theme,
81+ title,
82+ message,
83+ confirmText,
84+ cancelText,
85+ fontSize,
86+ } ) => {
87+ if ( ! isOpen ) return null ;
88+ const isDarkTheme = darkThemes . includes ( theme ) ;
89+
90+ return (
91+ < div
92+ className = { `modal-overlay ${ isDarkTheme ? 'dark-theme' : '' } ` }
93+ onClick = { onClose }
94+ style = { { zIndex : 1100 } } >
95+ < div
96+ className = { `modal-content ${ isDarkTheme ? 'dark-theme' : '' } ` }
97+ onClick = { e => e . stopPropagation ( ) }
98+ style = { { maxWidth : '25em' } } >
99+ < button
100+ className = { `modal-close-button ${ isDarkTheme ? 'dark-theme' : '' } ` }
101+ onClick = { onClose } >
102+ ×
103+ </ button >
104+ < div
105+ className = "modal-settings-content"
106+ style = { { fontSize : `${ fontSize } px` } } >
107+ < h2 > { title } </ h2 >
108+ < div className = "reset-confirmation" >
109+ < p className = "reset-confirmation-text" > { message } </ p >
110+ < div className = "reset-button-group" >
111+ < button
112+ onClick = { onConfirm }
113+ className = "reset-button reset-button-danger" >
114+ { confirmText }
115+ </ button >
116+ < button
117+ onClick = { onClose }
118+ className = "reset-button reset-button-secondary" >
119+ { cancelText }
120+ </ button >
121+ </ div >
122+ </ div >
123+ </ div >
124+ </ div >
125+ </ div >
126+ ) ;
127+ } ;
128+
64129function App ( ) {
65130 const [ formattedString , setFormattedString ] = useState ( '' ) ;
66131 const [ isError , setIsError ] = useState ( false ) ;
@@ -74,15 +139,31 @@ function App() {
74139 const [ isCopied , setIsCopied ] = useState ( false ) ;
75140 const [ canUndo , setCanUndo ] = useState ( false ) ;
76141 const [ canRedo , setCanRedo ] = useState ( false ) ;
142+ const [ isResetConfirmOpen , setIsResetConfirmOpen ] = useState ( false ) ;
77143 const editorRef = useRef < any > ( null ) ;
78144
145+ const getSystemTheme = ( ) => {
146+ if ( window . matchMedia && window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches ) {
147+ return 'vs-dark' ;
148+ }
149+ return 'vs-light' ;
150+ } ;
151+
79152 useEffect ( ( ) => {
80153 const loadData = async ( ) => {
81154 try {
82155 const appData = ( await invoke ( 'load_app_data' ) ) as AppData ;
83156
84157 setFontSize ( appData . settings . font_size ) ;
85- setTheme ( appData . settings . theme ) ;
158+
159+ const savedTheme = appData . settings . theme ;
160+ if ( savedTheme && savedTheme !== '' ) {
161+ setTheme ( savedTheme ) ;
162+ } else {
163+ const systemTheme = getSystemTheme ( ) ;
164+ setTheme ( systemTheme ) ;
165+ }
166+
86167 setIndentType ( appData . settings . indent_type as 'space' | 'tab' ) ;
87168 setIndentWidth ( appData . settings . indent_width ) ;
88169
@@ -96,6 +177,8 @@ function App() {
96177 }
97178 } catch ( error ) {
98179 console . error ( 'Failed to load data:' , error ) ;
180+ const systemTheme = getSystemTheme ( ) ;
181+ setTheme ( systemTheme ) ;
99182 }
100183 } ;
101184
@@ -187,6 +270,27 @@ function App() {
187270
188271 const openAboutModal = ( ) => setIsAboutModalOpen ( true ) ;
189272 const closeAboutModal = ( ) => setIsAboutModalOpen ( false ) ;
273+ const handleResetSettings = async ( ) => {
274+ try {
275+ await invoke ( 'reset_app_data' ) ;
276+ const systemTheme = getSystemTheme ( ) ;
277+
278+ setFontSize ( 14 ) ;
279+ setTheme ( systemTheme ) ;
280+ setIndentType ( 'space' ) ;
281+ setIndentWidth ( 4 ) ;
282+ setIsError ( false ) ;
283+
284+ if ( inputString . trim ( ) !== '' ) {
285+ formatString ( inputString , { indentType : 'space' , indentWidth : 4 } ) ;
286+ }
287+
288+ setIsResetConfirmOpen ( false ) ;
289+ closeModal ( ) ;
290+ } catch ( error ) {
291+ console . error ( 'Failed to reset settings:' , error ) ;
292+ }
293+ } ;
190294
191295 const handleCopy = async ( ) => {
192296 try {
@@ -299,7 +403,9 @@ function App() {
299403 useEffect ( ( ) => {
300404 const handleEsc = ( event : KeyboardEvent ) => {
301405 if ( event . key === 'Escape' ) {
302- if ( isAboutModalOpen ) {
406+ if ( isResetConfirmOpen ) {
407+ setIsResetConfirmOpen ( false ) ;
408+ } else if ( isAboutModalOpen ) {
303409 closeAboutModal ( ) ;
304410 } else if ( isModalOpen ) {
305411 closeModal ( ) ;
@@ -310,7 +416,7 @@ function App() {
310416 return ( ) => {
311417 window . removeEventListener ( 'keydown' , handleEsc ) ;
312418 } ;
313- } , [ isModalOpen , isAboutModalOpen ] ) ;
419+ } , [ isModalOpen , isAboutModalOpen , isResetConfirmOpen ] ) ;
314420
315421 const isDarkTheme = darkThemes . includes ( theme ) ;
316422
@@ -581,7 +687,7 @@ function App() {
581687 < div
582688 className = "modal-settings-content"
583689 style = { { fontSize : `${ fontSize } px` } } >
584- < h2 > Editor Settings</ h2 >
690+ < h2 > Settings</ h2 >
585691 < div className = "setting-item" >
586692 < label htmlFor = "font-size-select" > Font Size</ label >
587693 < select
@@ -636,8 +742,28 @@ function App() {
636742 </ select >
637743 </ div >
638744 ) }
745+
746+ < div className = "reset-settings-section" >
747+ < button
748+ onClick = { ( ) => setIsResetConfirmOpen ( true ) }
749+ className = "reset-button reset-button-danger reset-button-full" >
750+ Reset All Settings
751+ </ button >
752+ </ div >
639753 </ div >
640754 </ Modal >
755+
756+ < ConfirmModal
757+ isOpen = { isResetConfirmOpen }
758+ onClose = { ( ) => setIsResetConfirmOpen ( false ) }
759+ onConfirm = { handleResetSettings }
760+ theme = { theme }
761+ title = "Reset Settings"
762+ message = "This will reset font size, theme, and formatting settings to defaults."
763+ confirmText = "Yes, Reset Settings"
764+ cancelText = "Cancel"
765+ fontSize = { fontSize }
766+ />
641767 </ main >
642768 ) ;
643769}
0 commit comments