import React, { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import { getStatsSummary, listInside, listVisitRequests } from '../api'; import { StatsSummary, VisitRequestView } from '../types'; import { STATUS_CLASS, STATUS_LABEL, formatDateTime } from '../status'; export const DashboardPage: React.FC = () => { const [items, setItems] = useState([]); const [stats, setStats] = useState(null); const [insideIds, setInsideIds] = useState>(new Set()); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { getStatsSummary().then(setStats).catch(() => setStats(null)); // currently-inside visits → show "재실중" instead of the plain approved status listInside() .then((rows) => setInsideIds(new Set(rows.map((r) => r.visitRequestId)))) .catch(() => setInsideIds(new Set())); listVisitRequests() .then(setItems) .catch((e) => setError(e instanceof Error ? e.message : '조회 실패')) .finally(() => setLoading(false)); }, []); const recent = items.slice(0, 8); return (

대시보드

+ 출입 신청
{error &&
{error}
}

최근 출입 신청

{loading ? (

불러오는 중…

) : recent.length === 0 ? (

신청 내역이 없습니다.

) : ( {recent.map((r) => ( ))}
방문자회사출입구역출입 일시상태
{r.visitorName} {r.company || '-'} {r.zoneName || '-'} {formatDateTime(r.visitFrom)} {insideIds.has(r.id) ? ( 재실중 ) : ( {STATUS_LABEL[r.status]} )}
)}
); }; const StatCard: React.FC<{ label: string; value: number; accent: string }> = ({ label, value, accent }) => (
{value}
{label}
);