diff --git a/components/sidebar-history.tsx b/components/sidebar-history.tsx index 3147041d5..73ed5bf2e 100644 --- a/components/sidebar-history.tsx +++ b/components/sidebar-history.tsx @@ -1,14 +1,14 @@ -'use client'; +"use client"; -import { isToday, isYesterday, subMonths, subWeeks } from 'date-fns'; -import Link from 'next/link'; -import { useParams, usePathname, useRouter } from 'next/navigation'; -import type { User } from 'next-auth'; -import { useEffect, useState } from 'react'; -import { toast } from 'sonner'; -import useSWR from 'swr'; +import { isToday, isYesterday, subMonths, subWeeks } from "date-fns"; +import Link from "next/link"; +import { useParams, usePathname, useRouter } from "next/navigation"; +import type { User } from "next-auth"; +import { memo, useEffect, useState } from "react"; +import { toast } from "sonner"; +import useSWR from "swr"; -import { MoreHorizontalIcon, TrashIcon } from '@/components/icons'; +import { MoreHorizontalIcon, TrashIcon } from "@/components/icons"; import { AlertDialog, AlertDialogAction, @@ -18,13 +18,13 @@ import { AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, -} from '@/components/ui/alert-dialog'; +} from "@/components/ui/alert-dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu'; +} from "@/components/ui/dropdown-menu"; import { SidebarGroup, SidebarGroupContent, @@ -33,9 +33,10 @@ import { SidebarMenuButton, SidebarMenuItem, useSidebar, -} from '@/components/ui/sidebar'; -import type { Chat } from '@/lib/db/schema'; -import { fetcher } from '@/lib/utils'; +} from "@/components/ui/sidebar"; +import type { Chat } from "@/lib/db/schema"; +import { fetcher } from "@/lib/utils"; +import equal from "fast-deep-equal"; type GroupedChats = { today: Chat[]; @@ -45,7 +46,7 @@ type GroupedChats = { older: Chat[]; }; -const ChatItem = ({ +const PureChatItem = ({ chat, isActive, onDelete, @@ -62,6 +63,7 @@ const ChatItem = ({ {chat.title} + ); +export const ChatItem = memo(PureChatItem, (prevProps, nextProps) => { + if (prevProps.isActive !== nextProps.isActive) return false; + return true; +}); + export function SidebarHistory({ user }: { user: User | undefined }) { const { setOpenMobile } = useSidebar(); const { id } = useParams(); @@ -93,7 +100,7 @@ export function SidebarHistory({ user }: { user: User | undefined }) { data: history, isLoading, mutate, - } = useSWR>(user ? '/api/history' : null, fetcher, { + } = useSWR>(user ? "/api/history" : null, fetcher, { fallbackData: [], }); @@ -106,26 +113,26 @@ export function SidebarHistory({ user }: { user: User | undefined }) { const router = useRouter(); const handleDelete = async () => { const deletePromise = fetch(`/api/chat?id=${deleteId}`, { - method: 'DELETE', + method: "DELETE", }); toast.promise(deletePromise, { - loading: 'Deleting chat...', + loading: "Deleting chat...", success: () => { mutate((history) => { if (history) { return history.filter((h) => h.id !== id); } }); - return 'Chat deleted successfully'; + return "Chat deleted successfully"; }, - error: 'Failed to delete chat', + error: "Failed to delete chat", }); setShowDeleteDialog(false); if (deleteId === id) { - router.push('/'); + router.push("/"); } }; @@ -158,7 +165,7 @@ export function SidebarHistory({ user }: { user: User | undefined }) { className="h-4 rounded-md flex-1 max-w-[--skeleton-width] bg-sidebar-accent-foreground/10" style={ { - '--skeleton-width': `${item}%`, + "--skeleton-width": `${item}%`, } as React.CSSProperties } />