-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathchat-topbar.tsx
107 lines (100 loc) · 3.14 KB
/
chat-topbar.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
'use client';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet';
import React, { useEffect } from 'react';
import { CaretSortIcon, HamburgerMenuIcon } from '@radix-ui/react-icons';
import { Sidebar } from '../sidebar';
import { Button } from '../ui/button';
import { Message } from '../types';
import { useModels } from '@/app/hooks/useModels';
interface ChatTopbarProps {
setSelectedModel: React.Dispatch<React.SetStateAction<string>>;
chatId?: string;
messages: Message[];
setMessages: (messages: Message[]) => void;
}
export default function ChatTopbar({
setSelectedModel,
chatId,
messages,
setMessages,
}: ChatTopbarProps) {
const [open, setOpen] = React.useState(false);
const [sheetOpen, setSheetOpen] = React.useState(false);
const [currentModel, setCurrentModel] = React.useState<string | null>(null);
const { models, loading: modelsLoading } = useModels();
useEffect(() => {
setCurrentModel(models[0] || null);
}, []);
const handleModelChange = (modelName: string) => {
setCurrentModel(modelName);
setSelectedModel(modelName);
if (typeof window !== 'undefined') {
localStorage.setItem('selectedModel', modelName);
}
setOpen(false);
};
const handleCloseSidebar = () => {
setSheetOpen(false);
};
return (
<div className="w-full flex px-4 py-6 items-center justify-between lg:justify-center">
<Sheet open={sheetOpen} onOpenChange={setSheetOpen}>
<SheetTrigger>
<HamburgerMenuIcon className="lg:hidden w-5 h-5" />
</SheetTrigger>
<SheetContent side="left">
<Sidebar
chatId={chatId || ''}
isCollapsed={false}
isMobile={false}
setMessages={setMessages}
closeSidebar={handleCloseSidebar}
/>
</SheetContent>
</Sheet>
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
disabled={modelsLoading}
variant="outline"
role="combobox"
aria-expanded={open}
className="w-[300px] justify-between"
>
{modelsLoading
? 'Loading models...'
: currentModel || 'Loading models...'}
<CaretSortIcon className="ml-2 h-4 w-4 shrink-0 opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[300px] p-1">
{modelsLoading ? (
<Button variant="ghost" disabled className="w-full">
Loading models...
</Button>
) : models.length > 0 ? (
models.map((model) => (
<Button
key={model}
variant="ghost"
className="w-full"
onClick={() => handleModelChange(model)}
>
{model}
</Button>
))
) : (
<Button variant="ghost" disabled className="w-full">
No models available
</Button>
)}
</PopoverContent>
</Popover>
</div>
);
}