1- import { useEffect , useState } from "react" ;
1+ import { useEffect , useMemo , useState } from "react" ;
22import { Alert , Button , Col , Input , Row , Space } from "antd" ;
33import { getLogger } from "@cocalc/frontend/logger" ;
44import { query } from "@cocalc/frontend/frame-editors/generic/client" ;
55import { Gap , Loading } from "@cocalc/frontend/components" ;
6+ import { redux } from "@cocalc/frontend/app-framework" ;
67
78const log = getLogger ( "account:lite-ai-settings" ) ;
89
@@ -42,6 +43,7 @@ type State = "load" | "ready" | "save" | "error";
4243
4344export default function LiteAISettings ( ) {
4445 const [ values , setValues ] = useState < Record < string , string > > ( { } ) ;
46+ const [ savedValues , setSavedValues ] = useState < Record < string , string > > ( { } ) ;
4547 const [ state , setState ] = useState < State > ( "load" ) ;
4648 const [ error , setError ] = useState < string > ( "" ) ;
4749
@@ -62,6 +64,7 @@ export default function LiteAISettings() {
6264 next [ row . name ] = row . value ;
6365 }
6466 setValues ( next ) ;
67+ setSavedValues ( next ) ;
6568 setError ( "" ) ;
6669 setState ( "ready" ) ;
6770 } catch ( err ) {
@@ -75,13 +78,24 @@ export default function LiteAISettings() {
7578 setValues ( ( cur ) => ( { ...cur , [ key ] : val } ) ) ;
7679 }
7780
81+ const saving = state === "save" ;
82+ const dirty = useMemo ( ( ) => {
83+ for ( const { keyField } of PROVIDERS ) {
84+ if ( ( values [ keyField ] ?? "" ) !== ( savedValues [ keyField ] ?? "" ) ) {
85+ return true ;
86+ }
87+ }
88+ return false ;
89+ } , [ values , savedValues ] ) ;
90+
7891 async function save ( ) : Promise < void > {
92+ if ( saving || ! dirty ) return ;
7993 setState ( "save" ) ;
8094 try {
8195 for ( const { keyField, enableField } of PROVIDERS ) {
8296 const val = values [ keyField ] ?? "" ;
8397 await query ( {
84- query : { server_settings : { name : keyField , value : val } } ,
98+ query : { site_settings : { name : keyField , value : val } } ,
8599 } ) ;
86100 await query ( {
87101 query : {
@@ -92,6 +106,10 @@ export default function LiteAISettings() {
92106 } ,
93107 } ) ;
94108 }
109+ redux . getStore ( "projects" ) . clearOpenAICache ( ) ;
110+ // @ts -ignore
111+ await redux . getActions ( "customize" ) ?. reload ( ) ;
112+ setSavedValues ( values ) ;
95113 setState ( "ready" ) ;
96114 } catch ( err ) {
97115 log . info ( "failed to save llm settings" , err ) ;
@@ -126,8 +144,13 @@ export default function LiteAISettings() {
126144 ) ) }
127145 </ Space >
128146 < Gap />
129- < Button type = "primary" onClick = { save } disabled = { state === "save" } >
130- { state === "save" ? < Loading text = "Saving" /> : "Save" }
147+ < Button
148+ type = "primary"
149+ onClick = { save }
150+ disabled = { saving || ! dirty }
151+ style = { { marginTop : 8 } }
152+ >
153+ { saving ? < Loading text = "Saving" /> : "Save" }
131154 </ Button >
132155 </ div >
133156 ) ;
0 commit comments