c1cc13a99a
Nuova pagina admin /admin/conversazioni: vista WhatsApp-style (lista conversazioni a sinistra, thread + risposta a destra) che aggrega i messaggi di tutti i clienti dalla tabella comments, cross-cliente. - Migration additiva 0014: clients.admin_last_read_at per tracciare letto/non-letto (pallini + badge in sidebar). Applicata a prod. - conversations-queries.ts: aggregazione entity_id → cliente (general/phase/task/deliverable), getConversations / getConversationThread / getUnreadConversationsCount. - Risposte admin salvate come commento "general" (visibili anche nella chat cliente e nel CommentsTab della scheda). - Voce di menu + badge non-letti (AdminSidebar/AdminShell/layout). - Token semantici per dual light/dark; refresh manuale (no polling). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { PageHeader } from "@/components/admin/PageHeader";
|
|
import { ConversationsView } from "@/components/admin/conversazioni/ConversationsView";
|
|
import {
|
|
getConversations,
|
|
getConversationThread,
|
|
} from "@/lib/conversations-queries";
|
|
|
|
export const revalidate = 0;
|
|
|
|
export default async function ConversazioniPage({
|
|
searchParams,
|
|
}: {
|
|
searchParams: Promise<{ c?: string }>;
|
|
}) {
|
|
const { c } = await searchParams;
|
|
|
|
const conversations = await getConversations();
|
|
// Default selection: the requested client, else the most recent conversation.
|
|
const activeClientId =
|
|
(c && conversations.some((conv) => conv.clientId === c) ? c : null) ??
|
|
conversations[0]?.clientId ??
|
|
null;
|
|
|
|
const activeThread = activeClientId
|
|
? await getConversationThread(activeClientId)
|
|
: null;
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<PageHeader
|
|
title="Conversazioni"
|
|
subtitle="Centro messaggi clienti — tutte le richieste in un unico posto"
|
|
/>
|
|
<ConversationsView
|
|
conversations={conversations}
|
|
activeThread={activeThread}
|
|
activeClientId={activeClientId}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|