fix react state sync bug

This commit is contained in:
Andrew Pareles 2024-12-13 01:28:55 -08:00
parent 5dad4c8f06
commit 9b427c78bf
3 changed files with 15 additions and 8 deletions

View file

@ -36,7 +36,6 @@ export interface IVoidConfigStateService {
readonly _serviceBrand: undefined;
readonly state: VoidConfigState;
onDidChangeState: Event<void>;
onDidGetInitState: Event<void>;
setSettingOfProvider: SetSettingOfProviderFn;
setModelSelectionOfFeature: SetModelSelectionOfFeature;
}
@ -58,9 +57,6 @@ class VoidConfigService extends Disposable implements IVoidConfigStateService {
private readonly _onDidChangeState = new Emitter<void>();
readonly onDidChangeState: Event<void> = this._onDidChangeState.event; // this is primarily for use in react, so react can listen + update on state changes
private readonly _onDidGetInitState = new Emitter<void>();
readonly onDidGetInitState: Event<void> = this._onDidGetInitState.event;
state: VoidConfigState;
constructor(
@ -77,7 +73,6 @@ class VoidConfigService extends Disposable implements IVoidConfigStateService {
// read and update the actual state immediately
this._readVoidConfigState().then(voidConfigState => {
this._setState(voidConfigState)
this._onDidGetInitState.fire()
})
}

View file

@ -36,6 +36,8 @@ export const ModelSelectionOfFeature = ({ featureName }: { featureName: FeatureN
}
}
let weChangedText = false
return <>
<h2>{featureName}</h2>
{
@ -43,6 +45,8 @@ export const ModelSelectionOfFeature = ({ featureName }: { featureName: FeatureN
options={modelOptions}
onChangeSelection={useCallback((newVal: [string, string]) => {
if (isDummy) return // don't set state to the dummy value
if (weChangedText) return
voidConfigService.setModelSelectionOfFeature(featureName, { providerName: newVal[0] as ProviderName, modelName: newVal[1] })
}, [voidConfigService, featureName, isDummy])}
// we are responsible for setting the initial state here
@ -50,11 +54,14 @@ export const ModelSelectionOfFeature = ({ featureName }: { featureName: FeatureN
const updateInstance = () => {
const settingsAtProvider = voidConfigService.state.modelSelectionOfFeature[featureName]
const index = modelOptions.findIndex(v => v.value[0] === settingsAtProvider?.providerName && v.value[1] === settingsAtProvider?.modelName)
if (index !== -1)
if (index !== -1) {
weChangedText = true
instance.select(index)
weChangedText = false
}
}
updateInstance()
const disposable = voidConfigService.onDidGetInitState(updateInstance)
const disposable = voidConfigService.onDidChangeState(updateInstance)
return [disposable]
}, [voidConfigService, modelOptions, featureName])}
/>}

View file

@ -17,11 +17,14 @@ const Setting = ({ providerName, settingName }: { providerName: ProviderName, se
const voidConfigService = useService('configStateService')
let weChangedText = false
return <><ErrorBoundary>
<label>{title}</label>
<VoidInputBox
placeholder={placeholder}
onChangeText={useCallback((newVal) => {
if (weChangedText) return
voidConfigService.setSettingOfProvider(providerName, settingName, newVal)
// if we just disabeld this provider, we should unselect all models that use it
@ -39,10 +42,12 @@ const Setting = ({ providerName, settingName }: { providerName: ProviderName, se
const settingsAtProvider = voidConfigService.state.settingsOfProvider[providerName];
// @ts-ignore
const stateVal = settingsAtProvider[settingName]
weChangedText = true
instance.value = stateVal
weChangedText = false
}
updateInstance()
const disposable = voidConfigService.onDidGetInitState(updateInstance)
const disposable = voidConfigService.onDidChangeState(updateInstance)
return [disposable]
}, [voidConfigService, providerName, settingName])}
multiline={false}