import { useEffect, useState } from 'react' import { listReceived, listSent, receivedDetail, sentDetail, sendMessage } from '../../api/uiws' import { PageHeader, SearchBar, Input, Button, DataGrid, Pagination, Modal, FormField, YnBadge, Spinner, type Column } from '../../components/uiws/ui' type Tab = 'received' | 'sent' export default function MessageBox() { const [tab, setTab] = useState('received') const [rows, setRows] = useState([]) const [page, setPage] = useState(0) const [totalPages, setTotalPages] = useState(0) const [keyword, setKeyword] = useState('') const [loading, setLoading] = useState(false) const [compose, setCompose] = useState(false) const [detail, setDetail] = useState(null) const load = async () => { setLoading(true) try { const fn = tab === 'received' ? listReceived : listSent const res = await fn({ page, size: 20, titleKeyword: keyword || undefined }) const data = res.data.data setRows(data.content ?? []) setTotalPages(data.totalPages ?? 0) } finally { setLoading(false) } } useEffect(() => { load() }, [tab, page]) const receivedCols: Column[] = [ { key: 'title', header: '제목' }, { key: 'senderNm', header: '보낸사람', width: 130 }, { key: 'sentAt', header: '받은시각', width: 170 }, { key: 'readYn', header: '상태', width: 90, render: r => }, ] const sentCols: Column[] = [ { key: 'title', header: '제목' }, { key: 'receiverSummary', header: '받는사람', width: 160 }, { key: 'open', header: '개봉', width: 100, align: 'center', render: r => `${r.openCount}/${r.totalCount}` }, { key: 'sentAt', header: '보낸시각', width: 170 }, ] const open = async (r: any) => { const res = tab === 'received' ? await receivedDetail(r.messageId) : await sentDetail(r.messageId) setDetail({ ...res.data.data, _tab: tab }) if (tab === 'received') load() // 개봉처리 반영 } return (
setCompose(true)}>+ 쪽지 보내기} />
{loading ? : ( <> r.messageId} onRowClick={open} empty="쪽지가 없습니다." /> )} {compose && setCompose(false)} onSent={() => { setCompose(false); load() }} />} {detail && setDetail(null)} />}
) } function Compose({ onClose, onSent }: { onClose: () => void; onSent: () => void }) { const [receiverId, setReceiverId] = useState('') const [title, setTitle] = useState('') const [content, setContent] = useState('') const [err, setErr] = useState('') const send = async () => { setErr('') try { await sendMessage({ title, content, receivers: [{ receiverId, rcvType: 'RECV' }] }) onSent() } catch (e: any) { setErr(e?.response?.data?.message || '전송 실패') } } return ( }> {err &&
{err}
}
) } function DetailModal({ detail, onClose }: { detail: any; onClose: () => void }) { return ( 닫기}>
{detail._tab === 'received' ? `보낸사람: ${detail.senderNm}` : `개봉 ${detail.openCount}/${detail.totalCount}`} · {detail.sentAt}
{detail.content}
{detail._tab === 'sent' && detail.receivers && (
수신자 개봉현황
{detail.receivers.map((r: any, i: number) => (
{r.receiverNm} ({r.rcvType})
))}
)}
) }