// frontend/components/mail/AriPanel.tsx — 아리 분석 패널 (요약 + 할일/일정/답장/정리 + 모두 적용) "use client"; import { Icon } from "@/components/Icon"; import type { AiReply, EmailDetail, EmailRow, ExtractKind } from "@/lib/types"; import { Sug } from "./Sug"; type Mail = EmailRow | EmailDetail; export function AriPanel({ m, added, onAdd, onReply, onAddAll, }: { m: Mail; added: Record; onAdd: (key: string, kind: ExtractKind, index: number) => void; onReply: (m: Mail, replyIndex: number, r: AiReply) => void; onAddAll: (m: Mail) => void; }) { const ai = m.ai; if (!ai) return null; const keys: string[] = []; ai.tasks.forEach((_, i) => keys.push("t:" + m.id + ":" + i)); ai.events.forEach((_, i) => keys.push("e:" + m.id + ":" + i)); if (ai.file) keys.push("f:" + m.id); const allDone = keys.length > 0 && keys.every((k) => added[k]); return (
아리가 분석했어요 {ai.category} · 새 메일을 읽고 필요한 일을 정리했어요
{ai.priority}
요약 — " + ai.summary }} /> {ai.tasks.length > 0 && (
할 일로 추가{ai.tasks.length}건
{ai.tasks.map((t, i) => { const k = "t:" + m.id + ":" + i; return ( onAdd(k, "task", i)} meta={ <> {t.project} {t.due} {t.prio} } /> ); })}
)} {ai.events.length > 0 && (
일정에 추가{ai.events.length}건
{ai.events.map((ev, i) => { const k = "e:" + m.id + ":" + i; return ( onAdd(k, "event", i)} meta={ <> {ev.date} ({ev.day}) {ev.time} {ev.dur ? " · " + ev.dur : ""} {ev.place && ( <> {ev.place} )} } /> ); })}
)} {ai.replies.length > 0 && (
답장 추천{ai.replies.length}개 초안
{ai.replies.map((r, i) => ( ))}
)} {ai.file && (() => { const k = "f:" + m.id; return (
{ai.file.project}에 정리 {ai.file.reason}
); })()} {keys.length > 1 && (
아리가 준비한 {keys.length}개 작업을 한 번에 적용할 수 있어요
)}
); }