Skip to content

Commit e9d9e03

Browse files
committed
fix: improve model picker refresh handling and API config updates
- Add proper change detection for refreshValues using deep comparison - Increase debounce timing from 50ms to 100ms for better performance - Add proper error handling for missing Requesty API key - Fix apiConfiguration update to properly merge with existing state - Remove debug console logs
1 parent 793b13e commit e9d9e03

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

src/core/webview/ClineProvider.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1834,6 +1834,12 @@ export class ClineProvider implements vscode.WebviewViewProvider {
18341834
if (!apiKey) {
18351835
apiKey = (await this.getSecret("requestyApiKey")) as string
18361836
}
1837+
1838+
if (!apiKey) {
1839+
this.outputChannel.appendLine("No Requesty API key found")
1840+
return models
1841+
}
1842+
18371843
if (apiKey) {
18381844
config["headers"] = { Authorization: `Bearer ${apiKey}` }
18391845
}

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
22
import debounce from "debounce"
3-
import { useMemo, useState, useCallback, useEffect } from "react"
3+
import { useMemo, useState, useCallback, useEffect, useRef } from "react"
44
import { useMount } from "react-use"
55
import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
66

@@ -54,8 +54,10 @@ export const ModelPicker = ({
5454
const [open, setOpen] = useState(false)
5555
const [value, setValue] = useState(defaultModelId)
5656
const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false)
57+
const prevRefreshValuesRef = useRef<Record<string, any> | undefined>()
58+
59+
const { apiConfiguration, [modelsKey]: models, onUpdateApiConfig, setApiConfiguration } = useExtensionState()
5760

58-
const { apiConfiguration, setApiConfiguration, [modelsKey]: models, onUpdateApiConfig } = useExtensionState()
5961
const modelIds = useMemo(
6062
() => (Array.isArray(models) ? models : Object.keys(models)).sort((a, b) => a.localeCompare(b)),
6163
[models],
@@ -80,22 +82,42 @@ export const ModelPicker = ({
8082
[apiConfiguration, configKey, infoKey, models, onUpdateApiConfig, setApiConfiguration],
8183
)
8284

83-
const debouncedRefreshModels = useMemo(
84-
() =>
85-
debounce(() => {
86-
const message = refreshValues
87-
? { type: refreshMessageType, values: refreshValues }
88-
: { type: refreshMessageType }
89-
vscode.postMessage(message)
90-
}, 50),
91-
[refreshMessageType, refreshValues],
92-
)
85+
const debouncedRefreshModels = useMemo(() => {
86+
return debounce(() => {
87+
const message = refreshValues
88+
? { type: refreshMessageType, values: refreshValues }
89+
: { type: refreshMessageType }
90+
vscode.postMessage(message)
91+
}, 100)
92+
}, [refreshMessageType, refreshValues])
9393

9494
useMount(() => {
9595
debouncedRefreshModels()
9696
return () => debouncedRefreshModels.clear()
9797
})
9898

99+
useEffect(() => {
100+
if (!refreshValues) {
101+
prevRefreshValuesRef.current = undefined
102+
return
103+
}
104+
105+
// Check if all values in refreshValues are truthy
106+
if (Object.values(refreshValues).some((value) => !value)) {
107+
prevRefreshValuesRef.current = undefined
108+
return
109+
}
110+
111+
// Compare with previous values
112+
const prevValues = prevRefreshValuesRef.current
113+
if (prevValues && JSON.stringify(prevValues) === JSON.stringify(refreshValues)) {
114+
return
115+
}
116+
117+
prevRefreshValuesRef.current = refreshValues
118+
debouncedRefreshModels()
119+
}, [debouncedRefreshModels, refreshValues])
120+
99121
useEffect(() => setValue(selectedModelId), [selectedModelId])
100122

101123
return (

webview-ui/src/context/ExtensionStateContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
151151
vscode.postMessage({
152152
type: "upsertApiConfiguration",
153153
text: currentState.currentApiConfigName,
154-
apiConfiguration: apiConfig,
154+
apiConfiguration: { ...currentState.apiConfiguration, ...apiConfig },
155155
})
156156
return currentState // No state update needed
157157
})

0 commit comments

Comments
 (0)