"use client" import { CheckCircle2Icon, CheckIcon, ChevronDownIcon, HeadphonesIcon, MessageSquarePlusIcon, } from "lucide-react" import { useMemo } from "react" import { useShallow } from "zustand/react/shallow" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import type { ImConversation } from "@/lib/api/im" import { getConversationStatusMessageKey } from "@/lib/support-conversation-i18n" import { isOpenImConversation, resolveConversationTitle, totalUnreadConversations, } from "@/lib/support-conversation-list" import { useSupportChatStore } from "@/lib/stores/support-chat" import { cn, formatDateTime } from "@/lib/utils" import { useI18n } from "@/i18n/provider" type SupportChatConversationSwitcherProps = { title: string subtitle: string status: string onNewRequest: () => void onCloseActiveRequest?: () => void } function getStatusBadgeClass(status: number) { if (status === 4) { return "bg-muted text-muted-foreground" } if (status === 2) { return "bg-amber-500/12 text-amber-700 dark:bg-amber-400/15 dark:text-amber-300" } return "bg-emerald-500/12 text-emerald-700 dark:bg-emerald-400/15 dark:text-emerald-300" } function getStatusDotClass(status: string) { if (status === "connected") { return "bg-emerald-500 shadow-[0_0_0_3px_rgba(16,185,129,0.14)]" } if (status === "connecting") { return "bg-amber-500 shadow-[0_0_0_3px_rgba(245,158,11,0.16)]" } return "bg-muted-foreground shadow-[0_0_0_3px_rgba(148,163,184,0.14)]" } export function SupportChatConversationSwitcher({ title, subtitle, status, onNewRequest, onCloseActiveRequest, }: SupportChatConversationSwitcherProps) { const t = useI18n() const { conversations, activeConversationId, creatingConversation, selectConversation, } = useSupportChatStore( useShallow((state) => ({ conversations: state.conversations, activeConversationId: state.activeConversationId, creatingConversation: state.creatingConversation, selectConversation: state.selectConversation, })) ) const openCount = useMemo( () => conversations.filter((item) => isOpenImConversation(item)).length, [conversations] ) const totalUnread = useMemo( () => totalUnreadConversations(conversations), [conversations] ) const active = useMemo( () => conversations.find((item) => item.id === activeConversationId) ?? null, [conversations, activeConversationId] ) const activeSubject = active?.subject?.trim() const hasMultiple = conversations.length > 1 const displayTitle = activeSubject ? activeSubject : hasMultiple && active ? resolveConversationTitle(active, t("supportChat.requestFallbackTitle")) : title const displaySubtitle = activeSubject || hasMultiple ? title : subtitle const avatarElement = (
) if (!hasMultiple) { return (
{avatarElement}
{displayTitle}
{displaySubtitle}
) } return ( {avatarElement}
{displayTitle} {totalUnread > 0 ? ( {totalUnread > 99 ? "99+" : totalUnread} ) : null}
{displaySubtitle}
} >
{t("supportChat.myRequests")} {t("supportChat.openRequestCount", { open: openCount, total: conversations.length, })}
{conversations.map((conversation: ImConversation) => ( void selectConversation(conversation.id)} className="flex-col items-start gap-1 px-3 py-2" > {t(getConversationStatusMessageKey(conversation.status))} {formatDateTime(conversation.lastActiveAt)} ))}
{active && active.status !== 4 && onCloseActiveRequest ? ( ) : null}
) }