"use client" import { UserIcon } from "lucide-react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ScrollArea } from "@/components/ui/scroll-area"; import { IMConversationStatus } from "@/lib/generated/enums"; import { useAgentConversationsStore } from "@/lib/stores/agent-conversations"; import { formatDateTime } from "@/lib/utils"; import { useI18n } from "@/i18n/provider"; function getStatusVariant(status: number) { switch (status) { case IMConversationStatus.AIServing: return "bg-primary/10 text-primary" case IMConversationStatus.Pending: return "bg-amber-500/15 text-amber-800 dark:bg-amber-500/20 dark:text-amber-300" case IMConversationStatus.Active: return "bg-emerald-500/15 text-emerald-800 dark:bg-emerald-500/20 dark:text-emerald-300" case IMConversationStatus.Closed: return "bg-muted text-muted-foreground" default: return "bg-muted text-muted-foreground" } } type ConversationListProps = { onAfterSelect?: () => void } export function ConversationList({ onAfterSelect }: ConversationListProps) { const t = useI18n() const conversations = useAgentConversationsStore((state) => state.conversations) const loading = useAgentConversationsStore((state) => state.conversationsLoading) const selectedId = useAgentConversationsStore((state) => state.selectedConversationId) const selectConversation = useAgentConversationsStore((state) => state.selectConversation) return ( {loading ? (
{t("conversation.loading")}
) : conversations.length > 0 ? ( conversations.map((conversation) => { const isSelected = selectedId === conversation.id return (
{ void selectConversation(conversation.id).then( () => { onAfterSelect?.() }, () => {}, ) }} >
{conversation.customerName || t("conversation.customerFallback", { id: conversation.customerId || conversation.id, })} {conversation.agentUnreadCount > 0 ? (
{conversation.agentUnreadCount > 99 ? "99+" : conversation.agentUnreadCount}
) : null}
{conversation.lastMessageAt ? formatDateTime(conversation.lastMessageAt) : t("conversation.noTime")}
{conversation.lastMessageSummary || t("conversation.noLatestMessage")}
{getConversationStatusLabel(conversation.status, t)} {conversation.status === IMConversationStatus.Pending && conversation.currentTeamName ? ( {t("conversation.teamOnDuty", { name: conversation.currentTeamName, })} ) : null}
) }) ) : (
{t("conversation.empty")}
)}
) } function getConversationStatusLabel( status: number, t: (key: string, values?: Record) => string ) { switch (status) { case IMConversationStatus.AIServing: return t("conversation.filterAiServing") case IMConversationStatus.Pending: return t("conversation.filterPending") case IMConversationStatus.Active: return t("conversation.filterActive") case IMConversationStatus.Closed: return t("conversation.filterClosed") default: return "-" } }