'use client'; import { useState, useEffect } from 'react'; import { LoginLogType } from '@/constants/common'; import { fetchApi, getDateTime } from '@/lib/utils/client'; import type { WalletRevenueResponse, RevenueChartItem } from '@/types/response/wallet/revenue'; import { PERIOD_TABS, REVENUE_TYPE_MAP } from '../constants'; import Loading from '@/app/component/Loading'; import Pagination from '@/app/component/Pagination'; import { ResponsiveContainer, AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, } from 'recharts'; function RevenueChart({ chartData }: { chartData: RevenueChartItem[] }) { if (chartData.length === 0) { return
데이터가 없습니다.
; } return ( v >= 10000 ? `${(v / 10000).toFixed(0)}만` : v.toLocaleString()} width={50} /> [ `${Number(value).toLocaleString()}원`, name === 'netAmount' ? '순수익' : '수수료', ]} labelFormatter={(label) => String(label)} contentStyle={{ background: 'hsl(var(--background))', border: '1px solid hsl(var(--border))', borderRadius: '6px', fontSize: '0.8125rem', }} /> ); } export default function WalletRevenuePage() { const [loading, setLoading] = useState(true); const [page, setPage] = useState(1); const [period, setPeriod] = useState(LoginLogType.Month); const [data, setData] = useState({ total: 0, summary: { grossAmount: 0, platformFee: 0, netAmount: 0 }, list: [] }); const [chartData, setChartData] = useState([]); useEffect(() => { setLoading(true); fetchApi(`/api/studio/wallet/revenue?period=${period}&page=${page}&perPage=20`) .then(res => { if (res.data) { setData(res.data); setChartData(res.data.chartData ?? []); } }) .catch(() => {}) .finally(() => setLoading(false)); }, [period, page]); useEffect(() => { setPage(1); }, [period]); return (

수익 내역

{loading && } {/* Summary Cards */}
총 후원 금액
{data.summary.grossAmount.toLocaleString()}원
플랫폼 수수료
-{data.summary.platformFee.toLocaleString()}원
순수익
{data.summary.netAmount.toLocaleString()}원
{/* Period Filter */}
{PERIOD_TABS.map((tab) => ( ))}
{/* Chart */}
순수익 수수료
{/* Table Header */}
합계: {data.total}건
{/* Table */}
{data.list.length > 0 ? ( data.list.map((row) => ( )) ) : ( )}
일시 후원자 유형 후원 금액 수수료 순수익
{getDateTime(row.createdAt)} {row.donorName} {REVENUE_TYPE_MAP[row.type] ?? row.type} {row.crewName && ({row.crewName})} {row.grossAmount.toLocaleString()}원 -{row.platformFee.toLocaleString()}원 {row.netAmount.toLocaleString()}원
수익 내역이 없습니다.
{data.total > 0 && ( )}
); }