@@ -72,10 +72,10 @@ export class AiSettings extends React.Component<
7272 this . _settingConnector = props . formContext . settingConnector ?? null ;
7373 this . _settings = props . formContext . settings ;
7474
75- this . _useSecretsManager =
75+ const useSecretsManagerSetting =
7676 ( this . _settings . get ( 'UseSecretsManager' ) . composite as boolean ) ?? true ;
77- this . _hideSecretFields =
78- ( this . _settings . get ( 'HideSecretFields' ) . composite as boolean ) ?? true ;
77+ this . _useSecretsManager =
78+ useSecretsManagerSetting && this . _secretsManager !== null ;
7979
8080 // Initialize the providers schema.
8181 const providerSchema = JSONExt . deepCopy ( baseSettings ) as any ;
@@ -124,19 +124,11 @@ export class AiSettings extends React.Component<
124124 // Update the setting registry.
125125 this . saveSettingsToRegistry ( ) ;
126126
127- this . _settings . changed . connect ( ( ) => {
128- const useSecretsManager =
129- ( this . _settings . get ( 'UseSecretsManager' ) . composite as boolean ) ?? true ;
130- if ( useSecretsManager !== this . _useSecretsManager ) {
131- this . _updateUseSecretsManager ( useSecretsManager ) ;
132- }
133- const hideSecretFields =
134- ( this . _settings . get ( 'HideSecretFields' ) . composite as boolean ) ?? true ;
135- if ( hideSecretFields !== this . _hideSecretFields ) {
136- this . _hideSecretFields = hideSecretFields ;
137- this . _updateSchema ( ) ;
138- }
139- } ) ;
127+ this . _secretsManager ?. fieldVisibilityChanged . connect (
128+ this . _fieldVisibilityChanged
129+ ) ;
130+
131+ this . _settings . changed . connect ( this . _settingsChanged ) ;
140132 }
141133
142134 async componentDidUpdate ( ) : Promise < void > {
@@ -165,6 +157,10 @@ export class AiSettings extends React.Component<
165157 }
166158
167159 componentWillUnmount ( ) : void {
160+ this . _settings . changed . disconnect ( this . _settingsChanged ) ;
161+ this . _secretsManager ?. fieldVisibilityChanged . disconnect (
162+ this . _fieldVisibilityChanged
163+ ) ;
168164 if ( ! this . _secretsManager || ! this . _useSecretsManager ) {
169165 return ;
170166 }
@@ -199,11 +195,11 @@ export class AiSettings extends React.Component<
199195 /**
200196 * Save settings in local storage for a given provider.
201197 */
202- saveSettingsToLocalStorage ( value : IDict < any > ) {
203- const currentSettings = { ...value } ;
198+ saveSettingsToLocalStorage ( ) {
199+ const currentSettings = { ...this . _currentSettings } ;
204200 const settings = JSON . parse ( localStorage . getItem ( STORAGE_NAME ) ?? '{}' ) ;
205201 // Do not save secrets in local storage if using the secrets manager.
206- if ( this . _secretsManager && this . _useSecretsManager ) {
202+ if ( this . _useSecretsManager ) {
207203 this . _secretFields . forEach ( field => delete currentSettings [ field ] ) ;
208204 }
209205 settings [ this . _provider ] = currentSettings ;
@@ -219,21 +215,44 @@ export class AiSettings extends React.Component<
219215 . catch ( console . error ) ;
220216 }
221217
218+ /**
219+ * Triggered when the settings has changed.
220+ */
221+ private _settingsChanged = ( settings : ISettingRegistry . ISettings ) => {
222+ this . _updateUseSecretsManager (
223+ ( this . _settings . get ( 'UseSecretsManager' ) . composite as boolean ) ?? true
224+ ) ;
225+ } ;
226+
227+ /**
228+ * Triggered when the secret fields visibility has changed.
229+ */
230+ private _fieldVisibilityChanged = (
231+ _ : ISecretsManager ,
232+ value : boolean
233+ ) : void => {
234+ if ( this . _useSecretsManager ) {
235+ this . _updateSchema ( ) ;
236+ }
237+ } ;
238+
222239 /**
223240 * Update the settings whether the secrets manager is used or not.
224241 *
225242 * @param value - whether to use the secrets manager or not.
226243 */
227244 private _updateUseSecretsManager = ( value : boolean ) => {
245+ // No-op if the value did not change or the secrets manager has not been provided.
246+ if ( value === this . _useSecretsManager || this . _secretsManager === null ) {
247+ return ;
248+ }
249+
250+ // Update the secrets manager.
228251 this . _useSecretsManager = value ;
229252 if ( ! value ) {
230253 // Detach all the password inputs attached to the secrets manager, and save the
231254 // current settings to the local storage to save the password.
232- this . _secretsManager ?. detachAll ( Private . getToken ( ) , SECRETS_NAMESPACE ) ;
233- if ( this . _settingConnector instanceof SettingConnector ) {
234- this . _settingConnector . doNotSave = [ ] ;
235- }
236- this . saveSettingsToLocalStorage ( this . _currentSettings ) ;
255+ this . _secretsManager . detachAll ( Private . getToken ( ) , SECRETS_NAMESPACE ) ;
237256 } else {
238257 // Remove all the keys stored locally.
239258 const settings = JSON . parse ( localStorage . getItem ( STORAGE_NAME ) || '{}' ) ;
@@ -245,13 +264,9 @@ export class AiSettings extends React.Component<
245264 } ) ;
246265 } ) ;
247266 localStorage . setItem ( STORAGE_NAME , JSON . stringify ( settings ) ) ;
248- // Update the fields not to save in settings.
249- if ( this . _settingConnector instanceof SettingConnector ) {
250- this . _settingConnector . doNotSave = this . _secretFields ;
251- }
252- // Attach the password inputs to the secrets manager.
253- this . componentDidUpdate ( ) ;
254267 }
268+ this . _updateSchema ( ) ;
269+ this . saveSettingsToLocalStorage ( ) ;
255270 this . saveSettingsToRegistry ( ) ;
256271 } ;
257272
@@ -271,9 +286,16 @@ export class AiSettings extends React.Component<
271286 Object . entries ( settingsSchema ) . forEach ( ( [ key , value ] ) => {
272287 if ( key . toLowerCase ( ) . includes ( 'key' ) ) {
273288 this . _secretFields . push ( key ) ;
274- if ( this . _hideSecretFields ) {
289+
290+ // If the secrets manager is not used, do not show the secrets fields.
291+ // If the secrets manager is used, check if the fields should be visible.
292+ const showSecretFields =
293+ ! this . _useSecretsManager ||
294+ ( this . _secretsManager ?. secretFieldsVisibility ?? true ) ;
295+ if ( ! showSecretFields ) {
275296 return ;
276297 }
298+
277299 this . _uiSchema [ key ] = { 'ui:widget' : 'password' } ;
278300 }
279301 schema . properties [ key ] = value ;
@@ -284,12 +306,12 @@ export class AiSettings extends React.Component<
284306 }
285307
286308 // Do not save secrets in settings if using the secrets manager.
287- if (
288- this . _secretsManager &&
289- this . _useSecretsManager &&
290- this . _settingConnector instanceof SettingConnector
291- ) {
292- this . _settingConnector . doNotSave = this . _secretFields ;
309+ if ( this . _settingConnector instanceof SettingConnector ) {
310+ if ( this . _useSecretsManager ) {
311+ this . _settingConnector . doNotSave = this . _secretFields ;
312+ } else {
313+ this . _settingConnector . doNotSave = [ ] ;
314+ }
293315 }
294316 return schema as JSONSchema7 ;
295317 }
@@ -389,7 +411,7 @@ export class AiSettings extends React.Component<
389411 private _onFormChanged = ( e : IChangeEvent ) : void => {
390412 const { formData } = e ;
391413 const isModified = this . _updatedFormData ( formData ) ;
392- this . saveSettingsToLocalStorage ( this . _currentSettings ) ;
414+ this . saveSettingsToLocalStorage ( ) ;
393415 this . saveSettingsToRegistry ( ) ;
394416 if ( isModified !== this . state . isModified ) {
395417 this . setState ( { isModified } ) ;
@@ -407,7 +429,7 @@ export class AiSettings extends React.Component<
407429 ...this . _currentSettings ,
408430 ...this . _defaultFormData
409431 } ;
410- this . saveSettingsToLocalStorage ( this . _currentSettings ) ;
432+ this . saveSettingsToLocalStorage ( ) ;
411433 this . saveSettingsToRegistry ( ) ;
412434 this . setState ( { isModified : false } ) ;
413435 } ;
@@ -459,7 +481,6 @@ export class AiSettings extends React.Component<
459481 private _provider : string ;
460482 private _providerSchema : JSONSchema7 ;
461483 private _useSecretsManager : boolean ;
462- private _hideSecretFields : boolean ;
463484 private _rmRegistry : IRenderMimeRegistry | null ;
464485 private _secretsManager : ISecretsManager | null ;
465486 private _settingConnector : ISettingConnector | null ;
0 commit comments