mirror of
https://github.com/voideditor/void
synced 2026-05-24 09:58:23 +00:00
fix react state sync bug
This commit is contained in:
parent
5dad4c8f06
commit
9b427c78bf
3 changed files with 15 additions and 8 deletions
|
|
@ -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()
|
||||
})
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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])}
|
||||
/>}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
Loading…
Reference in a new issue