import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { PageAssitDatabase, formatToChatHistory, formatToMessage, deleteByHistoryId, updateHistory, pinHistory } from "@/db" import { Empty, Skeleton, Dropdown, Menu } from "antd" import { useMessageOption } from "~/hooks/useMessageOption" import { PencilIcon, Trash2, MoreVertical, PinIcon, PinOffIcon } from "lucide-react" import { useNavigate } from "react-router-dom" import { useTranslation } from "react-i18next" import { getLastUsedChatModel, lastUsedChatModelEnabled } from "@/services/model-settings" type Props = { onClose: () => void } export const Sidebar = ({ onClose }: Props) => { const { setMessages, setHistory, setHistoryId, historyId, clearChat, setSelectedModel } = useMessageOption() const { t } = useTranslation(["option", "common"]) const client = useQueryClient() const navigate = useNavigate() const { data: chatHistories, status } = useQuery({ queryKey: ["fetchChatHistory"], queryFn: async () => { const db = new PageAssitDatabase() const history = await db.getChatHistories() const now = new Date() const today = new Date(now.setHours(0, 0, 0, 0)) const yesterday = new Date(today) yesterday.setDate(yesterday.getDate() - 1) const lastWeek = new Date(today) lastWeek.setDate(lastWeek.getDate() - 7) const pinnedItems = history.filter((item) => item.is_pinned) const todayItems = history.filter( (item) => !item.is_pinned && new Date(item?.createdAt) >= today ) const yesterdayItems = history.filter( (item) => !item.is_pinned && new Date(item?.createdAt) >= yesterday && new Date(item?.createdAt) < today ) const lastWeekItems = history.filter( (item) => !item.is_pinned && new Date(item?.createdAt) >= lastWeek && new Date(item?.createdAt) < yesterday ) const olderItems = history.filter( (item) => !item.is_pinned && new Date(item?.createdAt) < lastWeek ) const groups = [] if (pinnedItems.length) groups.push({ label: "pinned", items: pinnedItems }) if (todayItems.length) groups.push({ label: "today", items: todayItems }) if (yesterdayItems.length) groups.push({ label: "yesterday", items: yesterdayItems }) if (lastWeekItems.length) groups.push({ label: "last7Days", items: lastWeekItems }) if (olderItems.length) groups.push({ label: "older", items: olderItems }) return groups } }) const { mutate: deleteHistory } = useMutation({ mutationKey: ["deleteHistory"], mutationFn: deleteByHistoryId, onSuccess: (history_id) => { client.invalidateQueries({ queryKey: ["fetchChatHistory"] }) if (historyId === history_id) { clearChat() } } }) const { mutate: editHistory } = useMutation({ mutationKey: ["editHistory"], mutationFn: async (data: { id: string; title: string }) => { return await updateHistory(data.id, data.title) }, onSuccess: () => { client.invalidateQueries({ queryKey: ["fetchChatHistory"] }) } }) const { mutate: pinChatHistory, isPending: pinLoading } = useMutation({ mutationKey: ["pinHistory"], mutationFn: async (data: { id: string; is_pinned: boolean }) => { return await pinHistory(data.id, data.is_pinned) }, onSuccess: () => { client.invalidateQueries({ queryKey: ["fetchChatHistory"] }) } }) return (