authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-03 14:49:50-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-03 18:22:29-08:00
log326595b148e410174e79c9a6e7f63006478ffaf6
treee9aee918fc8ebdc54fcd4808965254df8561afd8
parent41a8468b08e9a33ea2418fefc16f7c68e3778d7e

Add Vitest to web app and remove unused composer/env props

- add `vitest` to `apps/web` devDependencies and lockfile - remove unused `envMode` prop from `BranchToolbar` usage and signature - drop unused composer command input ref in `ChatView`

4 files changed, 34 insertions(+), 29 deletions(-)

apps/web/package.json+2-1
......@@ -44,6 +44,7 @@
4444 "babel-plugin-react-compiler": "^19.0.0-beta-e552027-20250112",
4545 "tailwindcss": "^4.0.0",
4646 "typescript": "catalog:",
47 "vite": "^8.0.0-beta.12"
47 "vite": "^8.0.0-beta.12",
48 "vitest": "catalog:"
4849 }
4950}
apps/web/src/components/BranchToolbar.tsx-2
......@@ -15,7 +15,6 @@ import { Button } from "./ui/button";
1515
1616interface BranchToolbarProps {
1717 threadId: ThreadId;
18 envMode: EnvMode;
1918 onEnvModeChange: (mode: EnvMode) => void;
2019 envLocked: boolean;
2120 onComposerFocusRequest?: () => void;
......@@ -23,7 +22,6 @@ interface BranchToolbarProps {
2322
2423export default function BranchToolbar({
2524 threadId,
26 envMode,
2725 onEnvModeChange,
2826 envLocked,
2927 onComposerFocusRequest,
apps/web/src/components/ChatView.tsx+31-26
......@@ -524,7 +524,6 @@ export default function ChatView({ threadId }: ChatViewProps) {
524524 const pendingUserScrollUpIntentRef = useRef(false);
525525 const pendingAutoScrollFrameRef = useRef<number | null>(null);
526526 const composerEditorRef = useRef<ComposerPromptEditorHandle>(null);
527 const composerCommandInputRef = useRef<HTMLInputElement>(null);
528527 const composerFormRef = useRef<HTMLFormElement>(null);
529528 const composerFormHeightRef = useRef(0);
530529 const composerImagesRef = useRef<ComposerImageAttachment[]>([]);
......@@ -633,7 +632,8 @@ export default function ChatView({ threadId }: ChatViewProps) {
633632 [selectedModel, settings.customCodexModels],
634633 );
635634 const slashModelOptions = useMemo(
636 () => getSlashModelOptions(settings.customCodexModels, composerTrigger?.query ?? "", selectedModel),
635 () =>
636 getSlashModelOptions(settings.customCodexModels, composerTrigger?.query ?? "", selectedModel),
637637 [composerTrigger?.query, selectedModel, settings.customCodexModels],
638638 );
639639 const phase = derivePhase(activeThread?.session ?? null);
......@@ -912,12 +912,12 @@ export default function ChatView({ threadId }: ChatViewProps) {
912912 }
913913
914914 return slashModelOptions.map(({ slug, name }) => ({
915 id: `model:${slug}`,
916 type: "model" as const,
917 model: slug,
918 label: name,
919 description: slug,
920 }));
915 id: `model:${slug}`,
916 type: "model" as const,
917 model: slug,
918 label: name,
919 description: slug,
920 }));
921921 }, [composerTrigger, slashModelOptions, workspaceEntries]);
922922 const composerMenuOpen = Boolean(composerTrigger);
923923 const activeComposerMenuItem = useMemo(
......@@ -2312,12 +2312,9 @@ export default function ChatView({ threadId }: ChatViewProps) {
23122312 return;
23132313 }
23142314 if (item.type === "slash-command") {
2315 const applied = applyPromptReplacement(
2316 trigger.rangeStart,
2317 trigger.rangeEnd,
2318 "/model ",
2319 { expectedText: expectedToken },
2320 );
2315 const applied = applyPromptReplacement(trigger.rangeStart, trigger.rangeEnd, "/model ", {
2316 expectedText: expectedToken,
2317 });
23212318 if (applied) {
23222319 setComposerHighlightedItemId(null);
23232320 }
......@@ -2360,18 +2357,27 @@ export default function ChatView({ threadId }: ChatViewProps) {
23602357 workspaceEntriesQuery.isLoading ||
23612358 workspaceEntriesQuery.isFetching);
23622359
2363 const onPromptChange = useCallback((nextPrompt: string, nextCursor: number, cursorAdjacentToMention: boolean) => {
2364 promptRef.current = nextPrompt;
2365 setPrompt(nextPrompt);
2366 setComposerCursor(nextCursor);
2367 setComposerTrigger(
2368 cursorAdjacentToMention
2369 ? null
2370 : detectComposerTrigger(nextPrompt, expandCollapsedComposerCursor(nextPrompt, nextCursor)),
2371 );
2372 }, [setPrompt]);
2360 const onPromptChange = useCallback(
2361 (nextPrompt: string, nextCursor: number, cursorAdjacentToMention: boolean) => {
2362 promptRef.current = nextPrompt;
2363 setPrompt(nextPrompt);
2364 setComposerCursor(nextCursor);
2365 setComposerTrigger(
2366 cursorAdjacentToMention
2367 ? null
2368 : detectComposerTrigger(
2369 nextPrompt,
2370 expandCollapsedComposerCursor(nextPrompt, nextCursor),
2371 ),
2372 );
2373 },
2374 [setPrompt],
2375 );
23732376
2374 const onComposerCommandKey = (key: "ArrowDown" | "ArrowUp" | "Enter" | "Tab", event: KeyboardEvent) => {
2377 const onComposerCommandKey = (
2378 key: "ArrowDown" | "ArrowUp" | "Enter" | "Tab",
2379 event: KeyboardEvent,
2380 ) => {
23752381 const { trigger } = resolveActiveComposerTrigger();
23762382 const menuIsActive = composerMenuOpenRef.current || trigger !== null;
23772383
......@@ -2778,7 +2784,6 @@ export default function ChatView({ threadId }: ChatViewProps) {
27782784 {isGitRepo && (
27792785 <BranchToolbar
27802786 threadId={activeThread.id}
2781 envMode={envMode}
27822787 onEnvModeChange={onEnvModeChange}
27832788 envLocked={envLocked}
27842789 onComposerFocusRequest={scheduleComposerFocus}
bun.lock+1
......@@ -95,6 +95,7 @@
9595 "tailwindcss": "^4.0.0",
9696 "typescript": "catalog:",
9797 "vite": "^8.0.0-beta.12",
98 "vitest": "catalog:",
9899 },
99100 },
100101 "packages/contracts": {