'use client'; import { useEffect, useState, useTransition } from 'react'; import { FoxModal } from '@fox/core/components/fox-modal'; import { FoxPagination } from '@fox/core/components/fox-pagination'; import { FoxStatusIndicator } from '@fox/core/components/fox-status-indicator'; import { FoxTable } from '@fox/core/components/fox-table'; import { FoxTableCell } from '@fox/core/components/fox-table-cell'; import { FoxTableRow } from '@fox/core/components/fox-table-row'; import { formatOptionalValue, formatPoint, formatPointDelta, isPointEarned, type PointAccount, type PointHistoryEntry, } from '@/lib/domain/point-account'; import { fetchPointHistoryAction } from '../_actions'; import styles from './point-detail-modal.module.scss'; interface PointDetailModalProps { account: PointAccount; onClose: () => void; } const MEMBER_COLUMNS = [ '회원번호', '아이디', '학생명', '학교명', '학년', '반', '번호', '총 포인트', '차감 포인트', '사용 포인트', '현재 포인트', ]; export function PointDetailModal({ account, onClose }: PointDetailModalProps) { const [page, setPage] = useState(1); const [entries, setEntries] = useState([]); const [totalPages, setTotalPages] = useState(1); const [isLoading, startLoading] = useTransition(); useEffect(() => { startLoading(async () => { const result = await fetchPointHistoryAction(account.id, page); setEntries(result.items); setTotalPages(result.totalPages); }); }, [account.id, page]); const memberValues = [ account.memberNo, account.loginId, account.studentName, account.schoolName, account.grade, account.classNo, account.studentNo, formatPoint(account.totalPoint), formatPoint(account.deductedPoint), formatPoint(account.usedPoint), formatPoint(account.currentPoint), ]; return (
{MEMBER_COLUMNS.map((column) => ( {column} ))} {memberValues.map((value, index) => ( {formatOptionalValue(value)} ))} 항목 포인트 구분(사이트) 날짜 {entries.length === 0 ? ( {isLoading ? '불러오는 중…' : '포인트 내역이 없습니다.'} ) : ( entries.map((entry) => ( {entry.title} {/* 기획 ② 취득은 파랑 +, 사용은 빨강 −. */} {entry.siteName} {entry.date} )) )}
); }