'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { api } from '@/lib/api'; import Navbar from '@/components/Navbar'; import { Mail, Loader2, ExternalLink, CheckCircle, XCircle, Clock, Shield } from 'lucide-react'; interface MailEmail { id: number; account: string; sender_email: string; sender_domain: string; subject: string; received_at: string; llm_verdict: 'important' | 'not_important'; notified_at: string | null; feedback: 'important' | 'not_important' | 'never_notify' | 'always_notify' | null; feedback_at: string | null; feedback_token: string | null; } const FEEDBACK_LABELS: Record = { important: '重要だった', not_important: '普通のメール', never_notify: '通知しない', always_notify: '常に通知', }; const ACCOUNT_LABELS: Record = { gmail: 'Gmail', hotmail: 'Hotmail', xserver: 'Xserver', gmail_service: 'Gmail (サービス用)', }; export default function MailHistoryPage() { const router = useRouter(); const [emails, setEmails] = useState([]); const [loading, setLoading] = useState(true); const [filterAccount, setFilterAccount] = useState(''); const [filterVerdict, setFilterVerdict] = useState(''); useEffect(() => { const fetchEmails = async () => { setLoading(true); try { const params = new URLSearchParams(); if (filterAccount) params.set('account', filterAccount); if (filterVerdict) params.set('verdict', filterVerdict); const res = await api.get(`/mail/emails/?${params.toString()}`); setEmails(res.data); } catch (error) { console.error('Failed to fetch emails:', error); } finally { setLoading(false); } }; fetchEmails(); }, [filterAccount, filterVerdict]); const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleString('ja-JP', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }); }; return (
{/* ヘッダー */}

メール処理履歴

{/* フィルター */}
{/* テーブル */} {loading ? (
) : emails.length === 0 ? (
処理済みメールはありません
) : (
{emails.map((email) => ( ))}
受信日時 送信者 件名 LLM判定 フィードバック
{formatDate(email.received_at)}
{ACCOUNT_LABELS[email.account] ?? email.account}
{email.sender_email}
{email.subject}
{email.llm_verdict === 'important' ? ( 重要 ) : ( 通常 )} {email.feedback ? ( {FEEDBACK_LABELS[email.feedback] ?? email.feedback} ) : email.llm_verdict === 'important' ? ( 未回答 ) : ( )} {email.feedback_token && ( 回答 )}
最新100件を表示
)}
); }