Skip to content

Commit 253b055

Browse files
small tweaks here and there
1 parent da21a5b commit 253b055

12 files changed

Lines changed: 60 additions & 65 deletions

File tree

packages/web/src/app/[domain]/chat/[id]/components/chatThreadPanel.tsx

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,34 @@
11
'use client';
22

3+
import { ResizablePanel } from '@/components/ui/resizable';
4+
import { ChatBoxToolbarProps } from '@/features/chat/components/chatBox/chatBoxToolbar';
35
import { ChatThread } from '@/features/chat/components/chatThread';
4-
import { useDomain } from '@/hooks/useDomain';
5-
import { useQuery } from '@tanstack/react-query';
6-
import { Loader2 } from 'lucide-react';
7-
import { useEffect, useState } from 'react';
8-
import { useRouter, useSearchParams } from 'next/navigation';
96
import { SBChatMessage, SET_CHAT_STATE_QUERY_PARAM, SetChatStatePayload } from '@/features/chat/types';
10-
import { loadChatMessages } from '@/features/chat/actions';
11-
import { unwrapServiceError } from '@/lib/utils';
12-
import { ResizablePanel } from '@/components/ui/resizable';
13-
import { useChatId } from '../../useChatId';
147
import { CreateUIMessage } from 'ai';
15-
import { ChatBoxToolbarProps } from '@/features/chat/components/chatBox/chatBoxToolbar';
8+
import { useRouter, useSearchParams } from 'next/navigation';
9+
import { useEffect, useState } from 'react';
10+
import { useChatId } from '../../useChatId';
1611

1712
interface ChatThreadPanelProps {
1813
chatBoxToolbarProps: Omit<ChatBoxToolbarProps, "selectedRepos" | "onSelectedReposChange">;
1914
order: number;
15+
messages: SBChatMessage[];
2016
}
2117

2218
export const ChatThreadPanel = ({
2319
chatBoxToolbarProps,
2420
order,
21+
messages,
2522
}: ChatThreadPanelProps) => {
2623
// @note: we are guaranteed to have a chatId because this component will only be
2724
// mounted when on a /chat/[id] route.
2825
const chatId = useChatId()!;
29-
const domain = useDomain();
3026
const router = useRouter();
3127
const searchParams = useSearchParams();
3228
const [inputMessage, setInputMessage] = useState<CreateUIMessage<SBChatMessage> | undefined>(undefined);
3329
const [selectedRepos, setSelectedRepos] = useState<string[]>([]);
3430

35-
const { data: messages, isPending, isError } = useQuery({
36-
queryKey: ['load-chat', chatId, domain],
37-
queryFn: () => unwrapServiceError(loadChatMessages({ chatId }, domain)),
38-
});
39-
4031
useEffect(() => {
41-
// @note: there was a bug when navigating from the home page to a chat thread with
42-
// the setChatState query param would cause the `isPending` flag to never be set to false.
43-
// The workaround was to only set the input message if the `loadChatMessages` query was not pending.
44-
if (isPending) {
45-
return;
46-
}
47-
4832
const setChatState = searchParams.get(SET_CHAT_STATE_QUERY_PARAM);
4933
if (!setChatState) {
5034
return;
@@ -62,7 +46,7 @@ export const ChatThreadPanel = ({
6246
const newSearchParams = new URLSearchParams(searchParams.toString());
6347
newSearchParams.delete(SET_CHAT_STATE_QUERY_PARAM);
6448
router.replace(`?${newSearchParams.toString()}`, { scroll: false });
65-
}, [searchParams, router, isPending]);
49+
}, [searchParams, router]);
6650

6751
return (
6852
<ResizablePanel
@@ -71,25 +55,14 @@ export const ChatThreadPanel = ({
7155
defaultSize={85}
7256
>
7357
<div className="flex flex-col h-full w-full">
74-
{isPending ? (
75-
<div className="flex-1 flex flex-col items-center gap-2 justify-center text-muted-foreground">
76-
<Loader2 className="w-4 h-4 animate-spin" />
77-
<p>Loading chat...</p>
78-
</div>
79-
) : isError ? (
80-
<div className="flex-1 flex items-center justify-center">
81-
<p>Error loading chat</p>
82-
</div>
83-
) : (
84-
<ChatThread
85-
id={chatId}
86-
initialMessages={messages}
87-
inputMessage={inputMessage}
88-
chatBoxToolbarProps={chatBoxToolbarProps}
89-
selectedRepos={selectedRepos}
90-
onSelectedReposChange={setSelectedRepos}
91-
/>
92-
)}
58+
<ChatThread
59+
id={chatId}
60+
initialMessages={messages}
61+
inputMessage={inputMessage}
62+
chatBoxToolbarProps={chatBoxToolbarProps}
63+
selectedRepos={selectedRepos}
64+
onSelectedReposChange={setSelectedRepos}
65+
/>
9366
</div>
9467
</ResizablePanel>
9568
)

packages/web/src/app/[domain]/chat/[id]/page.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,38 @@
11
import { getRepos } from '@/actions';
2-
import { getConfiguredLanguageModelsInfo } from '@/features/chat/actions';
2+
import { getConfiguredLanguageModelsInfo, loadChatMessages } from '@/features/chat/actions';
33
import { ServiceErrorException } from '@/lib/serviceError';
44
import { isServiceError } from '@/lib/utils';
55
import { ChatThreadPanel } from './components/chatThreadPanel';
66

77
interface PageProps {
88
params: {
99
domain: string;
10+
id: string;
1011
};
1112
}
1213

1314
export default async function Page({ params }: PageProps) {
1415
const languageModels = await getConfiguredLanguageModelsInfo();
1516
const repos = await getRepos(params.domain);
17+
const chatMessages = await loadChatMessages({ chatId: params.id }, params.domain);
1618

1719
if (isServiceError(repos)) {
1820
throw new ServiceErrorException(repos);
1921
}
2022

23+
if (isServiceError(chatMessages)) {
24+
throw new ServiceErrorException(chatMessages);
25+
}
26+
27+
const indexedRepos = repos.filter((repo) => repo.indexedAt !== undefined);
28+
2129
return (
2230
<ChatThreadPanel
2331
chatBoxToolbarProps={{
2432
languageModels,
25-
repos,
33+
repos: indexedRepos,
2634
}}
35+
messages={chatMessages}
2736
order={2}
2837
/>
2938
)

packages/web/src/app/[domain]/chat/components/chatSidePanel.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { useChatId } from "../useChatId";
2424
import { RenameChatDialog } from "./renameChatDialog";
2525
import { DeleteChatDialog } from "./deleteChatDialog";
2626
import Link from "next/link";
27-
import { useSession } from "next-auth/react";
2827

2928
interface ChatSidePanelProps {
3029
order: number;
@@ -33,11 +32,13 @@ interface ChatSidePanelProps {
3332
name: string | null;
3433
createdAt: Date;
3534
}[];
35+
isAuthenticated: boolean;
3636
}
3737

3838
export const ChatSidePanel = ({
3939
order,
4040
chatHistory,
41+
isAuthenticated,
4142
}: ChatSidePanelProps) => {
4243
const domain = useDomain();
4344
const [isCollapsed, setIsCollapsed] = useState(false);
@@ -49,7 +50,6 @@ export const ChatSidePanel = ({
4950
const [chatIdToRename, setChatIdToRename] = useState<string | null>(null);
5051
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
5152
const [chatIdToDelete, setChatIdToDelete] = useState<string | null>(null);
52-
const { status: authStatus } = useSession();
5353

5454
useHotkeys("mod+b", () => {
5555
if (isCollapsed) {
@@ -140,9 +140,7 @@ export const ChatSidePanel = ({
140140
<ScrollArea className="flex flex-col h-full px-2.5">
141141
<p className="text-sm font-medium mb-4">Recent Chats</p>
142142
<div className="flex flex-col gap-1">
143-
{authStatus === 'loading' ? (
144-
<ChatHistorySkeleton />
145-
) : authStatus === 'unauthenticated' ? (
143+
{!isAuthenticated ? (
146144
<div className="flex flex-col">
147145
<p className="text-sm text-muted-foreground mb-4">
148146
<Link

packages/web/src/app/[domain]/chat/components/newChatPanel.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const NewChatPanel = ({
4040
className="min-h-[80px]"
4141
preferredSuggestionsBoxPlacement="bottom-start"
4242
isRedirecting={isLoading}
43+
languageModels={chatBoxToolbarProps.languageModels}
4344
/>
4445
<div className="w-full flex flex-row items-center bg-accent rounded-b-md px-2">
4546
<ChatBoxToolbar

packages/web/src/app/[domain]/chat/layout.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export default async function Layout({ children, params: { domain } }: LayoutPro
4646
<ChatSidePanel
4747
order={1}
4848
chatHistory={chatHistory}
49+
isAuthenticated={!!session}
4950
/>
5051
<AnimatedResizableHandle />
5152
{children}

packages/web/src/app/[domain]/chat/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ export default async function Page({ params }: PageProps) {
1818
throw new ServiceErrorException(repos);
1919
}
2020

21+
const indexedRepos = repos.filter((repo) => repo.indexedAt !== undefined);
22+
2123
return (
2224
<NewChatPanel
2325
chatBoxToolbarProps={{
2426
languageModels,
25-
repos,
27+
repos: indexedRepos,
2628
}}
2729
order={2}
2830
/>

packages/web/src/app/[domain]/components/homepage/agenticSearch.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ export const AgenticSearch = ({
128128
}}
129129
className="min-h-[50px]"
130130
isRedirecting={isLoading}
131+
languageModels={chatBoxToolbarProps.languageModels}
131132
/>
132133
<Separator />
133134
<div className="relative">

packages/web/src/app/[domain]/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export default async function Home({ params: { domain } }: { params: { domain: s
3030
throw new ServiceErrorException(chatHistory);
3131
}
3232

33+
const indexedRepos = repos.filter((repo) => repo.indexedAt !== undefined);
34+
3335
return (
3436
<div className="flex flex-col items-center overflow-hidden min-h-screen">
3537
<NavigationMenu
@@ -38,7 +40,7 @@ export default async function Home({ params: { domain } }: { params: { domain: s
3840
<UpgradeToast />
3941

4042
<Homepage
41-
initialRepos={repos}
43+
initialRepos={indexedRepos}
4244
languageModels={models}
4345
chatHistory={chatHistory}
4446
/>

packages/web/src/features/chat/components/chatBox/chatBox.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { VscodeFileIcon } from "@/app/components/vscodeFileIcon";
44
import { Button } from "@/components/ui/button";
55
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
6-
import { CustomEditor, MentionElement, RenderElementPropsFor } from "@/features/chat/types";
6+
import { CustomEditor, LanguageModelInfo, MentionElement, RenderElementPropsFor } from "@/features/chat/types";
77
import { insertMention, slateContentToString } from "@/features/chat/utils";
88
import { cn, IS_MAC } from "@/lib/utils";
99
import { computePosition, flip, offset, shift, VirtualElement } from "@floating-ui/react";
@@ -25,6 +25,7 @@ interface ChatBoxProps {
2525
className?: string;
2626
isRedirecting?: boolean;
2727
isGenerating?: boolean;
28+
languageModels: LanguageModelInfo[];
2829
}
2930

3031
export const ChatBox = ({
@@ -34,6 +35,7 @@ export const ChatBox = ({
3435
className,
3536
isRedirecting,
3637
isGenerating,
38+
languageModels,
3739
}: ChatBoxProps) => {
3840
const suggestionsBoxRef = useRef<HTMLDivElement>(null);
3941
const [index, setIndex] = useState(0);
@@ -45,7 +47,9 @@ export const ChatBox = ({
4547
// @todo: add selected repos.
4648
selectedRepos: [],
4749
});
48-
const { selectedLanguageModel } = useSelectedLanguageModel();
50+
const { selectedLanguageModel } = useSelectedLanguageModel({
51+
initialLanguageModel: languageModels.length > 0 ? languageModels[0] : undefined,
52+
});
4953

5054
// Reset the index when the suggestion mode changes.
5155
useEffect(() => {

packages/web/src/features/chat/components/chatBox/chatBoxToolbar.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,9 @@ export const ChatBoxToolbar = ({
4343
description: "Add context",
4444
});
4545

46-
const { selectedLanguageModel, setSelectedLanguageModel } = useSelectedLanguageModel();
47-
48-
// Default to the first language model if one is not selected.
49-
useEffect(() => {
50-
if (!selectedLanguageModel && languageModels.length > 0) {
51-
setSelectedLanguageModel(languageModels[0]);
52-
}
53-
}, [languageModels, selectedLanguageModel, setSelectedLanguageModel]);
46+
const { selectedLanguageModel, setSelectedLanguageModel } = useSelectedLanguageModel({
47+
initialLanguageModel: languageModels.length > 0 ? languageModels[0] : undefined,
48+
});
5449

5550
return (
5651
<>

0 commit comments

Comments
 (0)