diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 6c521ecfdf..dffcc99268 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -178,6 +178,23 @@ const ApiOptions = ({ apiConfiguration.openRouterModelId in routerModels.openrouter, }) + // Initialize openRouterSpecificProvider with default value when the dropdown becomes available + useEffect(() => { + if ( + selectedProvider === "openrouter" && + openRouterModelProviders && + Object.keys(openRouterModelProviders).length > 0 && + apiConfiguration?.openRouterSpecificProvider === undefined + ) { + setApiConfigurationField("openRouterSpecificProvider", OPENROUTER_DEFAULT_PROVIDER_NAME) + } + }, [ + selectedProvider, + openRouterModelProviders, + apiConfiguration?.openRouterSpecificProvider, + setApiConfigurationField, + ]) + // Update `apiModelId` whenever `selectedModelId` changes. useEffect(() => { if (selectedModelId && apiConfiguration.apiModelId !== selectedModelId) { diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 18c83ff893..630b59485d 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -197,8 +197,6 @@ const SettingsView = forwardRef(({ onDone, t setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState })) prevApiConfigName.current = currentApiConfigName setChangeDetected(false) - // Reset user modified fields when loading new configuration - setUserModifiedFields(new Set()) }, [currentApiConfigName, extensionState, isChangeDetected]) // Bust the cache when settings are imported. @@ -206,8 +204,6 @@ const SettingsView = forwardRef(({ onDone, t if (settingsImportedAt) { setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState })) setChangeDetected(false) - // Reset user modified fields when importing settings - setUserModifiedFields(new Set()) } }, [settingsImportedAt, extensionState]) @@ -222,11 +218,8 @@ const SettingsView = forwardRef(({ onDone, t }) }, []) - // Track which fields have been explicitly set by user interaction - const [userModifiedFields, setUserModifiedFields] = useState>(new Set()) - const setApiConfigurationField = useCallback( - (field: K, value: ProviderSettings[K], isUserAction: boolean = true) => { + (field: K, value: ProviderSettings[K]) => { setCachedState((prevState) => { if (prevState.apiConfiguration?.[field] === value) { return prevState @@ -234,15 +227,9 @@ const SettingsView = forwardRef(({ onDone, t const previousValue = prevState.apiConfiguration?.[field] - // Track if this field has been modified by the user - if (isUserAction) { - setUserModifiedFields((prev) => new Set(prev).add(field)) - } - // Don't treat initial sync from undefined to a defined value as a user change - // unless this field has been explicitly modified by the user before - const isInitialSync = - previousValue === undefined && value !== undefined && !userModifiedFields.has(field) + // This prevents the dirty state when the component initializes and auto-syncs the model ID + const isInitialSync = previousValue === undefined && value !== undefined if (!isInitialSync) { setChangeDetected(true) @@ -250,7 +237,7 @@ const SettingsView = forwardRef(({ onDone, t return { ...prevState, apiConfiguration: { ...prevState.apiConfiguration, [field]: value } } }) }, - [userModifiedFields], + [], ) const setExperimentEnabled: SetExperimentEnabled = useCallback((id: ExperimentId, enabled: boolean) => { @@ -359,8 +346,6 @@ const SettingsView = forwardRef(({ onDone, t vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting }) vscode.postMessage({ type: "profileThresholds", values: profileThresholds }) setChangeDetected(false) - // Reset user modified fields after saving - setUserModifiedFields(new Set()) } } @@ -384,7 +369,6 @@ const SettingsView = forwardRef(({ onDone, t // Discard changes: Reset state and flag setCachedState(extensionState) // Revert to original state setChangeDetected(false) // Reset change flag - setUserModifiedFields(new Set()) // Reset user modified fields confirmDialogHandler.current?.() // Execute the pending action (e.g., tab switch) } // If confirm is false (Cancel), do nothing, dialog closes automatically