@@ -12,11 +12,16 @@ export function SignalKSettingsPanel(): JSX.Element {
1212 const [ config , setConfig ] = useState ( { } ) ;
1313 const [ errorText , setErrorText ] = useState ( "" ) ;
1414
15- async function handleSave ( ) : Promise < void > {
15+ async function handleSave ( configOverride ?: JsonObject ) : Promise < void > {
1616 try {
17- await saveConfigData ( CONFIG_PATH , JSON . stringify ( config ) , ( e : Error ) => {
18- setErrorText ( e . message ) ;
19- } ) ;
17+ const configToSave = configOverride ?? config ;
18+ await saveConfigData (
19+ CONFIG_PATH ,
20+ JSON . stringify ( configToSave ) ,
21+ ( e : Error ) => {
22+ setErrorText ( e . message ) ;
23+ } ,
24+ ) ;
2025 } catch ( e ) {
2126 setErrorText ( e . message ) ;
2227 }
@@ -51,18 +56,18 @@ export function SignalKSettingsPanel(): JSX.Element {
5156 < SKConnectionSettings
5257 config = { config }
5358 setConfig = { setConfig }
54- setRequestSave = { handleSave }
59+ onSave = { handleSave }
5560 />
5661 < SKSSLSettings
5762 config = { config }
5863 setConfig = { setConfig }
59- setRequestSave = { handleSave }
64+ onSave = { handleSave }
6065 onConfigUpdate = { updateConfig }
6166 />
6267 < SKAuthToken
6368 config = { config }
6469 setConfig = { setConfig }
65- setRequestSave = { handleSave }
70+ onSave = { handleSave }
6671 />
6772 </ div >
6873 </ >
@@ -72,14 +77,15 @@ export function SignalKSettingsPanel(): JSX.Element {
7277interface SKConnectionSettingsProps {
7378 config : JsonObject ;
7479 setConfig : ( cfg : JsonObject ) => void ;
75- setRequestSave : ( b : boolean ) => void ;
80+ onSave : ( configOverride ?: JsonObject ) => Promise < void > ;
7681}
7782
7883function SKConnectionSettings ( {
7984 config,
8085 setConfig,
81- setRequestSave ,
86+ onSave ,
8287} : SKConnectionSettingsProps ) : JSX . Element {
88+ const [ saving , setSaving ] = useState ( false ) ;
8389 const id = useId ( ) ;
8490
8591 const mdns = config . use_mdns === true ;
@@ -151,12 +157,15 @@ function SKConnectionSettings({
151157 < button
152158 type = "submit"
153159 className = "btn btn-primary"
154- onClick = { ( e ) => {
160+ disabled = { saving }
161+ onClick = { async ( e ) => {
155162 e . preventDefault ( ) ;
156- setRequestSave ( true ) ;
163+ setSaving ( true ) ;
164+ await onSave ( ) ;
165+ setSaving ( false ) ;
157166 } }
158167 >
159- Save
168+ { saving ? "Saving..." : " Save" }
160169 </ button >
161170 </ form >
162171 </ div >
@@ -168,17 +177,22 @@ function SKConnectionSettings({
168177interface SKAuthTokenProps {
169178 config : JsonObject ;
170179 setConfig : ( cfg : JsonObject ) => void ;
171- setRequestSave : ( b : boolean ) => void ;
180+ onSave : ( configOverride ?: JsonObject ) => Promise < void > ;
172181}
173182
174183function SKAuthToken ( {
175184 config,
176185 setConfig,
177- setRequestSave ,
186+ onSave ,
178187} : SKAuthTokenProps ) : JSX . Element {
179- function handleClearToken ( ) : void {
180- setConfig ( { ...config , token : "" } ) ;
181- setRequestSave ( true ) ;
188+ const [ clearing , setClearing ] = useState ( false ) ;
189+
190+ async function handleClearToken ( ) : Promise < void > {
191+ const newConfig = { ...config , token : "" } ;
192+ setConfig ( newConfig ) ;
193+ setClearing ( true ) ;
194+ await onSave ( newConfig ) ;
195+ setClearing ( false ) ;
182196 }
183197
184198 return (
@@ -187,8 +201,12 @@ function SKAuthToken({
187201 Click the button to clear the Signal K authentication token. This causes
188202 the device to request re-authorization from the Signal K server.
189203 </ p >
190- < button className = "btn btn-primary" onClick = { handleClearToken } >
191- Clear Token
204+ < button
205+ className = "btn btn-primary"
206+ disabled = { clearing }
207+ onClick = { handleClearToken }
208+ >
209+ { clearing ? "Clearing..." : "Clear Token" }
192210 </ button >
193211 </ Card >
194212 ) ;
@@ -197,16 +215,17 @@ function SKAuthToken({
197215interface SKSSLSettingsProps {
198216 config : JsonObject ;
199217 setConfig : ( cfg : JsonObject ) => void ;
200- setRequestSave : ( b : boolean ) => void ;
218+ onSave : ( configOverride ?: JsonObject ) => Promise < void > ;
201219 onConfigUpdate : ( ) => Promise < void > ;
202220}
203221
204222function SKSSLSettings ( {
205223 config,
206224 setConfig,
207- setRequestSave ,
225+ onSave ,
208226 onConfigUpdate,
209227} : SKSSLSettingsProps ) : JSX . Element {
228+ const [ saving , setSaving ] = useState ( false ) ;
210229 const [ resetting , setResetting ] = useState ( false ) ;
211230 const id = useId ( ) ;
212231
@@ -313,12 +332,15 @@ function SKSSLSettings({
313332 < button
314333 type = "submit"
315334 className = "btn btn-primary"
316- onClick = { ( e ) => {
335+ disabled = { saving }
336+ onClick = { async ( e ) => {
317337 e . preventDefault ( ) ;
318- setRequestSave ( true ) ;
338+ setSaving ( true ) ;
339+ await onSave ( ) ;
340+ setSaving ( false ) ;
319341 } }
320342 >
321- Save
343+ { saving ? "Saving..." : " Save" }
322344 </ button >
323345 </ form >
324346 </ div >
0 commit comments