Skip to content

Commit e513a5c

Browse files
committed
fix: simplify openRouterSpecificProvider handling without complex state tracking
- Remove userModifiedFields state tracking and isUserAction parameter - Initialize openRouterSpecificProvider with default value when dropdown becomes visible - Use useEffect to handle initialization cleanly without modifying state during render - Addresses feedback about unnecessary complexity in the original implementation
1 parent 28ea03f commit e513a5c

File tree

2 files changed

+21
-20
lines changed

2 files changed

+21
-20
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,23 @@ const ApiOptions = ({
178178
apiConfiguration.openRouterModelId in routerModels.openrouter,
179179
})
180180

181+
// Initialize openRouterSpecificProvider with default value when the dropdown becomes available
182+
useEffect(() => {
183+
if (
184+
selectedProvider === "openrouter" &&
185+
openRouterModelProviders &&
186+
Object.keys(openRouterModelProviders).length > 0 &&
187+
apiConfiguration?.openRouterSpecificProvider === undefined
188+
) {
189+
setApiConfigurationField("openRouterSpecificProvider", OPENROUTER_DEFAULT_PROVIDER_NAME)
190+
}
191+
}, [
192+
selectedProvider,
193+
openRouterModelProviders,
194+
apiConfiguration?.openRouterSpecificProvider,
195+
setApiConfigurationField,
196+
])
197+
181198
// Update `apiModelId` whenever `selectedModelId` changes.
182199
useEffect(() => {
183200
if (selectedModelId && apiConfiguration.apiModelId !== selectedModelId) {

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

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -197,17 +197,13 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
197197
setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState }))
198198
prevApiConfigName.current = currentApiConfigName
199199
setChangeDetected(false)
200-
// Reset user modified fields when loading new configuration
201-
setUserModifiedFields(new Set())
202200
}, [currentApiConfigName, extensionState, isChangeDetected])
203201

204202
// Bust the cache when settings are imported.
205203
useEffect(() => {
206204
if (settingsImportedAt) {
207205
setCachedState((prevCachedState) => ({ ...prevCachedState, ...extensionState }))
208206
setChangeDetected(false)
209-
// Reset user modified fields when importing settings
210-
setUserModifiedFields(new Set())
211207
}
212208
}, [settingsImportedAt, extensionState])
213209

@@ -222,35 +218,26 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
222218
})
223219
}, [])
224220

225-
// Track which fields have been explicitly set by user interaction
226-
const [userModifiedFields, setUserModifiedFields] = useState<Set<keyof ProviderSettings>>(new Set())
227-
228221
const setApiConfigurationField = useCallback(
229-
<K extends keyof ProviderSettings>(field: K, value: ProviderSettings[K], isUserAction: boolean = true) => {
222+
<K extends keyof ProviderSettings>(field: K, value: ProviderSettings[K]) => {
230223
setCachedState((prevState) => {
231224
if (prevState.apiConfiguration?.[field] === value) {
232225
return prevState
233226
}
234227

235228
const previousValue = prevState.apiConfiguration?.[field]
236229

237-
// Track if this field has been modified by the user
238-
if (isUserAction) {
239-
setUserModifiedFields((prev) => new Set(prev).add(field))
240-
}
241-
242230
// Don't treat initial sync from undefined to a defined value as a user change
243-
// unless this field has been explicitly modified by the user before
244-
const isInitialSync =
245-
previousValue === undefined && value !== undefined && !userModifiedFields.has(field)
231+
// This prevents the dirty state when the component initializes and auto-syncs the model ID
232+
const isInitialSync = previousValue === undefined && value !== undefined
246233

247234
if (!isInitialSync) {
248235
setChangeDetected(true)
249236
}
250237
return { ...prevState, apiConfiguration: { ...prevState.apiConfiguration, [field]: value } }
251238
})
252239
},
253-
[userModifiedFields],
240+
[],
254241
)
255242

256243
const setExperimentEnabled: SetExperimentEnabled = useCallback((id: ExperimentId, enabled: boolean) => {
@@ -359,8 +346,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
359346
vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting })
360347
vscode.postMessage({ type: "profileThresholds", values: profileThresholds })
361348
setChangeDetected(false)
362-
// Reset user modified fields after saving
363-
setUserModifiedFields(new Set())
364349
}
365350
}
366351

@@ -384,7 +369,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
384369
// Discard changes: Reset state and flag
385370
setCachedState(extensionState) // Revert to original state
386371
setChangeDetected(false) // Reset change flag
387-
setUserModifiedFields(new Set()) // Reset user modified fields
388372
confirmDialogHandler.current?.() // Execute the pending action (e.g., tab switch)
389373
}
390374
// If confirm is false (Cancel), do nothing, dialog closes automatically

0 commit comments

Comments
 (0)