Spaces:
Sleeping
Sleeping
| 'use client'; | |
| import { Chat } from '@prisma/client'; | |
| import React from 'react'; | |
| import { | |
| SelectItem, | |
| Select, | |
| SelectTrigger, | |
| SelectContent, | |
| SelectIcon, | |
| SelectGroup, | |
| SelectSeparator, | |
| } from './ui/Select'; | |
| import Img from './ui/Img'; | |
| import { format } from 'date-fns'; | |
| import { useParams, useRouter } from 'next/navigation'; | |
| import { IconPlus } from './ui/Icons'; | |
| export interface ChatSelectProps { | |
| chat: Chat; | |
| } | |
| const ChatSelectItem: React.FC<ChatSelectProps> = ({ chat }) => { | |
| const { id, title, mediaUrl, updatedAt } = chat; | |
| return ( | |
| <SelectItem value={id} className="size-full cursor-pointer"> | |
| <div className="overflow-hidden flex items-center size-full group"> | |
| <div className="size-[36px] relative m-1"> | |
| <Img | |
| src={mediaUrl} | |
| alt={`chat-${id}-card-image`} | |
| className="object-cover size-full" | |
| /> | |
| </div> | |
| <div className="flex items-start flex-col h-full ml-3"> | |
| <p className="text-sm mb-1">{title ?? '(no title)'}</p> | |
| <p className="text-xs text-gray-500"> | |
| {updatedAt ? format(Number(updatedAt), 'yyyy-MM-dd') : '-'} | |
| </p> | |
| </div> | |
| </div> | |
| </SelectItem> | |
| ); | |
| }; | |
| const ChatSelect: React.FC<{ myChats: Chat[] }> = ({ myChats }) => { | |
| const { id: chatIdFromParam } = useParams(); | |
| const currentChat = myChats.find(chat => chat.id === chatIdFromParam); | |
| const router = useRouter(); | |
| return ( | |
| <Select | |
| defaultValue={currentChat?.id} | |
| value={currentChat?.id} | |
| onValueChange={id => router.push(id === 'new' ? '/' : `/chat/${id}`)} | |
| > | |
| <SelectTrigger className="w-[240px]"> | |
| {currentChat?.title ?? 'Select a conversation'} | |
| </SelectTrigger> | |
| <SelectContent className="w-[320px]"> | |
| <SelectGroup> | |
| <SelectItem value="new"> | |
| <div className="flex items-center justify-start"> | |
| <SelectIcon asChild> | |
| <IconPlus className="size-4 opacity-50" /> | |
| </SelectIcon> | |
| <div className="ml-4">New conversion</div> | |
| </div> | |
| </SelectItem> | |
| {!!myChats.length && <SelectSeparator />} | |
| {myChats.map(chat => ( | |
| <ChatSelectItem key={chat.id} chat={chat} /> | |
| ))} | |
| </SelectGroup> | |
| </SelectContent> | |
| </Select> | |
| ); | |
| }; | |
| export default ChatSelect; | |