From f9cf6e5fcccafac8bc2a889da5becef221c3595b Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 26 Aug 2025 17:07:57 +0000 Subject: [PATCH] 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 --- .../src/components/settings/SettingsView.tsx | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 2738b82632..3d3c3ab54a 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -196,17 +196,44 @@ const SettingsView = forwardRef(({ onDone, t setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState })) prevApiConfigName.current = currentApiConfigName + // Reset change detection when API config changes externally setChangeDetected(false) - }, [currentApiConfigName, extensionState, isChangeDetected]) + }, [currentApiConfigName, extensionState]) // Bust the cache when settings are imported. useEffect(() => { if (settingsImportedAt) { setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState })) + // Reset change detection when settings are imported setChangeDetected(false) } }, [settingsImportedAt, extensionState]) + // Reset change detection when extensionState changes from outside the settings dialog + // This prevents false positives when mode or API config changes in the main interface + useEffect(() => { + // Check if the changes are coming from outside the settings dialog + // by comparing the extension state with our cached state + const isExternalChange = + extensionState.mode !== cachedState.mode || + JSON.stringify(extensionState.apiConfiguration) !== JSON.stringify(cachedState.apiConfiguration) + + if (isExternalChange && !isChangeDetected) { + // Update cached state to match extension state for external changes + setCachedState((prevCachedState) => ({ + ...prevCachedState, + mode: extensionState.mode, + apiConfiguration: extensionState.apiConfiguration, + })) + } + }, [ + extensionState.mode, + extensionState.apiConfiguration, + cachedState.mode, + cachedState.apiConfiguration, + isChangeDetected, + ]) + const setCachedStateField: SetCachedStateField = useCallback((field, value) => { setCachedState((prevState) => { if (prevState[field] === value) {