Skip to content

Commit f9cf6e5

Browse files
committed
fix: prevent false unsaved changes notification when mode/API changes externally
- Added logic to detect and handle external changes (from main interface) - External changes to mode or API configuration no longer mark settings as dirty - Only changes made within the Settings dialog itself trigger unsaved changes warning - Fixes #7417
1 parent a79c3d0 commit f9cf6e5

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

webview-ui/src/components/settings/SettingsView.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,44 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
196196

197197
setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState }))
198198
prevApiConfigName.current = currentApiConfigName
199+
// Reset change detection when API config changes externally
199200
setChangeDetected(false)
200-
}, [currentApiConfigName, extensionState, isChangeDetected])
201+
}, [currentApiConfigName, extensionState])
201202

202203
// Bust the cache when settings are imported.
203204
useEffect(() => {
204205
if (settingsImportedAt) {
205206
setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState }))
207+
// Reset change detection when settings are imported
206208
setChangeDetected(false)
207209
}
208210
}, [settingsImportedAt, extensionState])
209211

212+
// Reset change detection when extensionState changes from outside the settings dialog
213+
// This prevents false positives when mode or API config changes in the main interface
214+
useEffect(() => {
215+
// Check if the changes are coming from outside the settings dialog
216+
// by comparing the extension state with our cached state
217+
const isExternalChange =
218+
extensionState.mode !== cachedState.mode ||
219+
JSON.stringify(extensionState.apiConfiguration) !== JSON.stringify(cachedState.apiConfiguration)
220+
221+
if (isExternalChange && !isChangeDetected) {
222+
// Update cached state to match extension state for external changes
223+
setCachedState((prevCachedState) => ({
224+
...prevCachedState,
225+
mode: extensionState.mode,
226+
apiConfiguration: extensionState.apiConfiguration,
227+
}))
228+
}
229+
}, [
230+
extensionState.mode,
231+
extensionState.apiConfiguration,
232+
cachedState.mode,
233+
cachedState.apiConfiguration,
234+
isChangeDetected,
235+
])
236+
210237
const setCachedStateField: SetCachedStateField<keyof ExtensionStateContextType> = useCallback((field, value) => {
211238
setCachedState((prevState) => {
212239
if (prevState[field] === value) {

0 commit comments

Comments
 (0)