77 DialogHeader ,
88 DialogTitle ,
99} from "@workspace/ui/components/shadcn/dialog" ;
10- import { useEffect , useState } from "react" ;
10+ import { Loader2 } from "@workspace/ui/icons" ;
11+ import { useEffect , useState , useTransition } from "react" ;
1112import {
1213 AlertTriangle ,
1314 CheckCircle2 ,
@@ -24,6 +25,7 @@ export const SettingsDialog = () => {
2425 const setRestarting = useStore ( ( s ) => s . setRestarting ) ;
2526 const [ localConfig , setLocalConfig ] = useState < ConfigData | null > ( null ) ;
2627 const [ isSynced , setIsSynced ] = useState ( false ) ;
28+ const [ isSaving , startSaving ] = useTransition ( ) ;
2729
2830 const loadConfig = async ( ) => {
2931 if ( window . electronAPI ) {
@@ -54,24 +56,26 @@ export const SettingsDialog = () => {
5456 } , [ isSettingsOpen ] ) ;
5557
5658 const handleSave = async ( ) => {
57- if ( window . electronAPI ) {
58- await window . electronAPI . saveConfig ( localConfig ) ;
59- } else {
60- console . log ( "Electron API not available. Using default config." ) ;
61- }
59+ startSaving ( async ( ) => {
60+ if ( window . electronAPI ) {
61+ await window . electronAPI . saveConfig ( localConfig ) ;
62+ } else {
63+ console . log ( "Electron API not available. Using default config." ) ;
64+ }
6265
63- setRestarting ( true ) ;
66+ setRestarting ( true ) ;
6467
65- setTimeout ( ( ) => {
66- socketService . connect ( ) ;
67- setSettingsOpen ( false ) ;
68- setRestarting ( false ) ;
69- } , config . SETTINGS_RESPONSE_TIMEOUT ) ;
68+ setTimeout ( ( ) => {
69+ socketService . connect ( ) ;
70+ setSettingsOpen ( false ) ;
71+ setRestarting ( false ) ;
72+ } , config . SETTINGS_RESPONSE_TIMEOUT ) ;
73+ } ) ;
7074 } ;
7175
7276 return (
7377 < Dialog open = { isSettingsOpen } onOpenChange = { setSettingsOpen } >
74- < DialogContent className = "flex max-h-[85vh] max-w-2xl min-w-[800px] flex-col" >
78+ < DialogContent className = "flex max-h-[85vh] min-w-[800px] max-w-2xl flex-col" >
7579 < DialogHeader className = "pr-5" >
7680 < div className = "flex items-center justify-between" >
7781 < DialogTitle > System Configuration</ DialogTitle >
@@ -101,7 +105,15 @@ export const SettingsDialog = () => {
101105 < Button variant = "ghost" onClick = { ( ) => setSettingsOpen ( false ) } >
102106 Cancel
103107 </ Button >
104- < Button onClick = { handleSave } > Save Changes</ Button >
108+ < Button onClick = { handleSave } disabled = { isSaving } >
109+ { isSaving ? (
110+ < >
111+ < Loader2 className = "h-4 w-4 animate-spin" /> Saving...
112+ </ >
113+ ) : (
114+ "Save Changes"
115+ ) }
116+ </ Button >
105117 </ DialogFooter >
106118 </ DialogContent >
107119 </ Dialog >
0 commit comments