import { useEffect } from "react"; import { useNavigate, useRouterState } from "@tanstack/react-router"; import type { ChatSummary } from "@/lib/schemas"; import { formatDistanceToNow } from "date-fns"; import { PlusCircle, MoreVertical, Trash2 } from "lucide-react"; import { useAtom } from "jotai"; import { selectedChatIdAtom } from "@/atoms/chatAtoms"; import { selectedAppIdAtom } from "@/atoms/appAtoms"; import { IpcClient } from "@/ipc/ipc_client"; import { showError, showSuccess } from "@/lib/toast"; import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, } from "@/components/ui/sidebar"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { useChats } from "@/hooks/useChats"; export function ChatList({ show }: { show?: boolean }) { const navigate = useNavigate(); const [selectedChatId, setSelectedChatId] = useAtom(selectedChatIdAtom); const [selectedAppId, setSelectedAppId] = useAtom(selectedAppIdAtom); const { chats, loading, refreshChats } = useChats(selectedAppId); const routerState = useRouterState(); const isChatRoute = routerState.location.pathname === "/chat"; // Update selectedChatId when route changes useEffect(() => { if (isChatRoute) { const id = routerState.location.search.id; if (id) { console.log("Setting selected chat id to", id); setSelectedChatId(id); } } }, [isChatRoute, routerState.location.search, setSelectedChatId]); if (!show) { return; } const handleChatClick = ({ chatId, appId, }: { chatId: number; appId: number; }) => { setSelectedChatId(chatId); setSelectedAppId(appId); navigate({ to: "/chat", search: { id: chatId }, }); }; const handleNewChat = async () => { // Only create a new chat if an app is selected if (selectedAppId) { try { // Create a new chat with an empty title for now const chatId = await IpcClient.getInstance().createChat(selectedAppId); // Navigate to the new chat setSelectedChatId(chatId); navigate({ to: "/chat", search: { id: chatId }, }); // Refresh the chat list await refreshChats(); } catch (error) { // DO A TOAST showError(`Failed to create new chat: ${(error as any).toString()}`); } } else { // If no app is selected, navigate to home page navigate({ to: "/" }); } }; const handleDeleteChat = async (chatId: number) => { try { const result = await IpcClient.getInstance().deleteChat(chatId); if (!result.success) { showError("Failed to delete chat"); return; } showSuccess("Chat deleted successfully"); // If the deleted chat was selected, navigate to home if (selectedChatId === chatId) { setSelectedChatId(null); navigate({ to: "/chat" }); } // Refresh the chat list await refreshChats(); } catch (error) { showError(`Failed to delete chat: ${(error as any).toString()}`); } }; return ( Recent Chats
{loading ? (
Loading chats...
) : chats.length === 0 ? (
No chats found
) : ( {chats.map((chat) => (
{selectedChatId === chat.id && ( handleDeleteChat(chat.id)} > Delete Chat )}
))}
)}
); }