Skip to content

Commit 24f44be

Browse files
committed
refactor: simplify useModelLRU hook and ModelSelector handlers
1 parent 60e7550 commit 24f44be

File tree

5 files changed

+25
-47
lines changed

5 files changed

+25
-47
lines changed

src/browser/components/ModelSelector.tsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface ModelSelectorProps {
1717
onRemoveModel?: (model: string) => void;
1818
onComplete?: () => void;
1919
defaultModel?: string | null;
20-
onSetDefaultModel?: (model: string | null) => void;
20+
onSetDefaultModel?: (model: string) => void;
2121
}
2222

2323
export interface ModelSelectorRef {
@@ -186,6 +186,14 @@ export const ModelSelector = forwardRef<ModelSelectorRef, ModelSelectorProps>(
186186
setHighlightedIndex(currentIndex);
187187
}, [recentModels, value]);
188188

189+
const handleSetDefault = (e: React.MouseEvent, model: string) => {
190+
e.preventDefault();
191+
e.stopPropagation();
192+
if (defaultModel !== model && onSetDefaultModel) {
193+
onSetDefaultModel(model);
194+
}
195+
};
196+
189197
// Expose open method to parent via ref
190198
useImperativeHandle(
191199
ref,
@@ -256,15 +264,7 @@ export const ModelSelector = forwardRef<ModelSelectorRef, ModelSelectorProps>(
256264
<button
257265
type="button"
258266
onMouseDown={(e) => e.preventDefault()}
259-
onClick={(event) => {
260-
event.preventDefault();
261-
event.stopPropagation();
262-
const isDefault = defaultModel === model;
263-
// If it's already the default, do nothing (cannot unset)
264-
if (!isDefault) {
265-
onSetDefaultModel(model);
266-
}
267-
}}
267+
onClick={(e) => handleSetDefault(e, model)}
268268
className={cn(
269269
"rounded-sm border px-1 py-0.5 transition-colors duration-150 flex items-center justify-center",
270270
defaultModel === model
@@ -276,12 +276,12 @@ export const ModelSelector = forwardRef<ModelSelectorRef, ModelSelectorProps>(
276276
}
277277
disabled={defaultModel === model}
278278
>
279-
<Star
280-
className={cn("h-3 w-3")}
281-
/>
279+
<Star className={cn("h-3 w-3")} />
282280
</button>
283281
<Tooltip className="tooltip" align="center">
284-
{defaultModel === model ? "Current default model" : "Set as default model"}
282+
{defaultModel === model
283+
? "Current default model"
284+
: "Set as default model"}
285285
</Tooltip>
286286
</TooltipWrapper>
287287
)}

src/browser/hooks/useAIViewKeybinds.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { updatePersistedState, readPersistedState } from "@/browser/hooks/usePer
66
import type { ThinkingLevel, ThinkingLevelOn } from "@/common/types/thinking";
77
import { DEFAULT_THINKING_LEVEL } from "@/common/types/thinking";
88
import { getThinkingPolicyForModel } from "@/browser/utils/thinking/policy";
9-
import { getDefaultModelFromLRU } from "@/browser/hooks/useModelLRU";
9+
import { getDefaultModel } from "@/browser/hooks/useModelLRU";
1010
import type { StreamingMessageAggregator } from "@/browser/utils/messages/StreamingMessageAggregator";
1111
import { isCompactingStream, cancelCompaction } from "@/browser/utils/compaction/handler";
1212

@@ -116,7 +116,7 @@ export function useAIViewKeybinds({
116116
// Fall back to message history model, then to most recent model from LRU
117117
// This matches the same logic as useSendMessageOptions
118118
const selectedModel = readPersistedState<string | null>(getModelKey(workspaceId), null);
119-
const modelToUse = selectedModel ?? currentModel ?? getDefaultModelFromLRU();
119+
const modelToUse = selectedModel ?? currentModel ?? getDefaultModel();
120120

121121
// Storage key for remembering this model's last-used active thinking level
122122
const lastThinkingKey = getLastThinkingByModelKey(modelToUse);

src/browser/hooks/useModelLRU.ts

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,11 @@ export function evictModelFromLRU(model: string): void {
3333
persistModels(nextList);
3434
}
3535

36-
export function getExplicitDefaultModel(): string {
36+
export function getDefaultModel(): string {
3737
const persisted = readPersistedState<string | null>(DEFAULT_MODEL_KEY, null);
3838
return persisted ?? FALLBACK_MODEL;
3939
}
4040

41-
/**
42-
* Get the default model.
43-
* Prioritizes the explicit default model if set.
44-
* Otherwise, falls back to LRU behavior (most recently used).
45-
*/
46-
export function getDefaultModelFromLRU(): string {
47-
// Always return the explicit default (which falls back to hardcoded default)
48-
return getExplicitDefaultModel();
49-
}
50-
5141
/**
5242
* Hook to manage a Least Recently Used (LRU) cache of AI models.
5343
* Stores up to 8 recently used models in localStorage.
@@ -60,24 +50,12 @@ export function useModelLRU() {
6050
{ listener: true }
6151
);
6252

63-
const [defaultModel, setDefaultModel] = usePersistedState<string | null>(
53+
const [defaultModel, setDefaultModel] = usePersistedState<string>(
6454
DEFAULT_MODEL_KEY,
65-
null,
55+
FALLBACK_MODEL,
6656
{ listener: true }
6757
);
6858

69-
// Return the effective default model (never null)
70-
const effectiveDefaultModel = defaultModel ?? FALLBACK_MODEL;
71-
72-
// Wrapper for setDefaultModel that prevents null/clearing
73-
const handleSetDefaultModel = useCallback(
74-
(model: string | null) => {
75-
if (!model) return;
76-
setDefaultModel(model);
77-
},
78-
[setDefaultModel]
79-
);
80-
8159
// Merge any new defaults from MODEL_ABBREVIATIONS (only once on mount)
8260
useEffect(() => {
8361
setRecentModels((prev) => {
@@ -131,7 +109,7 @@ export function useModelLRU() {
131109
evictModel,
132110
getRecentModels,
133111
recentModels,
134-
defaultModel: effectiveDefaultModel,
135-
setDefaultModel: handleSetDefaultModel,
112+
defaultModel,
113+
setDefaultModel,
136114
};
137115
}

src/browser/hooks/useSendMessageOptions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useThinkingLevel } from "./useThinkingLevel";
22
import { useMode } from "@/browser/contexts/ModeContext";
33
import { usePersistedState } from "./usePersistedState";
4-
import { getDefaultModelFromLRU } from "./useModelLRU";
4+
import { getDefaultModel } from "./useModelLRU";
55
import { modeToToolPolicy, PLAN_MODE_INSTRUCTION } from "@/common/utils/ui/modeUtils";
66
import { getModelKey } from "@/common/constants/storage";
77
import type { SendMessageOptions } from "@/common/types/ipc";
@@ -56,7 +56,7 @@ export function useSendMessageOptions(workspaceId: string): SendMessageOptions {
5656
const [thinkingLevel] = useThinkingLevel();
5757
const [mode] = useMode();
5858
const { options: providerOptions } = useProviderOptions();
59-
const defaultModel = getDefaultModelFromLRU();
59+
const defaultModel = getDefaultModel();
6060
const [preferredModel] = usePersistedState<string>(
6161
getModelKey(workspaceId),
6262
defaultModel, // Default to most recently used model

src/browser/utils/messages/sendOptions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getModelKey, getThinkingLevelKey, getModeKey } from "@/common/constants/storage";
22
import { modeToToolPolicy, PLAN_MODE_INSTRUCTION } from "@/common/utils/ui/modeUtils";
33
import { readPersistedState } from "@/browser/hooks/usePersistedState";
4-
import { getDefaultModelFromLRU } from "@/browser/hooks/useModelLRU";
4+
import { getDefaultModel } from "@/browser/hooks/useModelLRU";
55
import type { SendMessageOptions } from "@/common/types/ipc";
66
import type { UIMode } from "@/common/types/mode";
77
import type { ThinkingLevel } from "@/common/types/thinking";
@@ -38,7 +38,7 @@ function getProviderOptions(): MuxProviderOptions {
3838
*/
3939
export function getSendOptionsFromStorage(workspaceId: string): SendMessageOptions {
4040
// Read model preference (workspace-specific), fallback to LRU default
41-
const model = readPersistedState<string>(getModelKey(workspaceId), getDefaultModelFromLRU());
41+
const model = readPersistedState<string>(getModelKey(workspaceId), getDefaultModel());
4242

4343
// Read thinking level (workspace-specific)
4444
const thinkingLevel = readPersistedState<ThinkingLevel>(

0 commit comments

Comments
 (0)