import { useEffect, useState } from 'react' import { provisionChannels, updateContact, type Contact, type Org, type ProvisionResult, } from '../api/client' import ConfirmDialog from './ConfirmDialog' import StatusBadge from './StatusBadge' const FIELDS: { key: keyof Contact; label: string }[] = [ { key: 'deptName', label: '부서명' }, { key: 'managerName', label: '담당자명' }, { key: 'managerTitle', label: '직급/직함' }, { key: 'managerPhone', label: '연락처' }, { key: 'managerEmail', label: '이메일' }, ] function emptyContact(org: Org): Contact { return { deptName: org.deptName ?? '', managerName: org.managerName ?? '', managerTitle: org.managerTitle ?? '', managerPhone: org.managerPhone ?? '', managerEmail: org.managerEmail ?? '', } } export default function OrgDetail({ org, onChanged }: { org: Org; onChanged: () => void }) { const [contact, setContact] = useState(emptyContact(org)) const [confirming, setConfirming] = useState(false) const [result, setResult] = useState(null) const [error, setError] = useState(null) useEffect(() => { setContact(emptyContact(org)) setResult(null) setError(null) }, [org]) const displayMj = `${org.orgNo}_${org.orgName} (문정원)` const displayLaw = `${org.orgNo}_${org.orgName} (법률검토)` const canProvision = org.status !== 'INFO_PENDING' async function save() { setError(null) try { await updateContact(org.id, contact) onChanged() } catch (e) { setError((e as Error).message) } } async function provision() { setConfirming(false) setError(null) try { setResult(await provisionChannels(org.id)) onChanged() } catch (e) { setError((e as Error).message) } } return (

{org.orgNo} {org.orgName}

신청기관 담당자

{FIELDS.map((field) => (
setContact({ ...contact, [field.key]: e.target.value })} />
))}
{error &&

{error}

} {result && (

문정원 채널: {outcomeLabel(result.mj)}

법률검토 채널: {outcomeLabel(result.law)}

{result.law === 'FAILED' && (

법률검토 채널 생성에 실패했습니다. 문정원 채널은 그대로 남아 있으니 [채널 생성]을 다시 눌러도 안전합니다. 없는 채널만 다시 만듭니다.

)} {result.mj === 'FAILED' && (

문정원 채널 생성에 실패했습니다. [채널 생성]을 다시 눌러도 안전합니다.

)} {result.message && (
{result.message}
)}
)} {confirming && ( void provision()} onCancel={() => setConfirming(false)} /> )}
) } function outcomeLabel(outcome: ProvisionResult['mj']): string { switch (outcome) { case 'CACHED': return '이미 있음 (변경 없음)' case 'RECOVERED': return '기존 채널 연결됨' case 'CREATED': return '새로 생성됨' case 'FAILED': return '실패' } }