import React, { useEffect, useState } from 'react'; import { getVisitRequest, listTodayAccess } from '../api'; import { AccessRecord, VisitRequestView } from '../types'; import { STATUS_CLASS, STATUS_LABEL, formatDateTime } from '../status'; interface Props { requestId: number; onClose: () => void; } export const VisitRequestDetailDialog: React.FC = ({ requestId, onClose }) => { const [request, setRequest] = useState(null); const [access, setAccess] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { let alive = true; setLoading(true); setError(null); Promise.all([ getVisitRequest(requestId), listTodayAccess().catch(() => [] as AccessRecord[]), ]) .then(([detail, records]) => { if (!alive) return; setRequest(detail); setAccess(records.find((r) => r.visitRequestId === requestId) ?? null); }) .catch((e) => { if (!alive) return; setError(e instanceof Error ? e.message : '상세 조회에 실패했습니다.'); }) .finally(() => { if (alive) setLoading(false); }); return () => { alive = false; }; }, [requestId]); const status = getDisplayStatus(request, access); return (
e.stopPropagation()}>

출입 신청 상세

{request &&

{request.visitorName} / {request.zoneName || '-'}

}
{loading ? (

불러오는 중...

) : error ? (
{error}
) : request ? ( <>
{status.label}
방문자
출입 전산실
{['4층전산실', '5층전산실'].map((room) => ( ))}
출입통제담당자
현장감시자
현장감시자1 : IT센터 사무보조원
현장감시자2 : 작업을 입회할 상주직원
출입 처리 현황
) : null}
); }; const ReadOnlyField: React.FC<{ label: string; value?: string | null }> = ({ label, value }) => ( ); function extraZone(zoneName?: string): string { if (!zoneName) return '-'; const parts = zoneName.split('/').map((part) => part.trim()).filter(Boolean); if (parts.length > 1) return parts.slice(1).join(' / '); if (zoneName.includes('전산실')) return '-'; return zoneName; } function getDisplayStatus(request: VisitRequestView | null, access: AccessRecord | null) { if (access?.inside) { return { label: '재실중', className: 'green' }; } if (access?.checkOutAt) { return { label: '퇴실', className: 'gray' }; } if (!request) { return { label: '-', className: 'gray' }; } return { label: STATUS_LABEL[request.status], className: STATUS_CLASS[request.status] }; }