import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { PageAssitDatabase, formatToChatHistory, formatToMessage, deleteByHistoryId, updateHistory, pinHistory, getPromptById } from "@/db" import { Empty, Skeleton, Dropdown, Menu, Tooltip } from "antd" import { PencilIcon, Trash2, MoreVertical, PinIcon, PinOffIcon, BotIcon } from "lucide-react" import { useNavigate } from "react-router-dom" import { useTranslation } from "react-i18next" import { getLastUsedChatModel, getLastUsedChatSystemPrompt, lastUsedChatModelEnabled } from "@/services/model-settings" import { useState } from "react" type Props = { onClose: () => void setMessages: (messages: any) => void setHistory: (history: any) => void setHistoryId: (historyId: string) => void setSelectedModel: (model: string) => void setSelectedSystemPrompt: (prompt: string) => void setSystemPrompt: (prompt: string) => void clearChat: () => void temporaryChat: boolean historyId: string history: any } export const Sidebar = ({ onClose, setMessages, setHistory, setHistoryId, setSelectedModel, setSelectedSystemPrompt, clearChat, historyId, setSystemPrompt, temporaryChat }: Props) => { 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 (
{status === "success" && chatHistories.length === 0 && (
)} {status === "pending" && (
)} {status === "error" && (
Error loading history
)} {status === "success" && chatHistories.length > 0 && (
{chatHistories.map((group, groupIndex) => (

{t(`common:date:${group.label}`)}

{group.items.map((chat, index) => (
{chat?.message_source === "copilot" && ( )}
) : ( ) } onClick={() => pinChatHistory({ id: chat.id, is_pinned: !chat.is_pinned }) } disabled={pinLoading}> {chat.is_pinned ? t("common:unpin") : t("common:pin")} } onClick={() => { const newTitle = prompt( t("editHistoryTitle"), chat.title ) if (newTitle) { editHistory({ id: chat.id, title: newTitle }) } }}> {t("common:edit")} } danger onClick={() => { if (!confirm(t("deleteHistoryConfirmation"))) return deleteHistory(chat.id) }}> {t("common:delete")} } trigger={["click"]} placement="bottomRight">
))}
))}
)}
) }