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
}
/>