import { useEffect, useState } from 'react' import { api } from '../api.js' const blankBackend = { host: '', port: '' } export default function Domains() { const [domains, setDomains] = useState([]) const [defaultBackend, setDefaultBackend] = useState(null) const [newDomain, setNewDomain] = useState('') const [newNote, setNewNote] = useState('') const [newBackend, setNewBackend] = useState({ ...blankBackend }) const [error, setError] = useState(null) const [editing, setEditing] = useState(null) // {domain, host, port} async function load() { try { const [doms, cfg] = await Promise.all([api.domains(), api.config()]) setDomains(doms) setDefaultBackend(cfg.backend) setError(null) } catch (e) { setError(e.message) } } useEffect(() => { load() }, []) async function add(e) { e.preventDefault() if (!newDomain.trim()) return try { const body = { domain: newDomain.trim(), enabled: true, note: newNote } if (newBackend.host.trim() && newBackend.port) { body.backend = { host: newBackend.host.trim(), port: +newBackend.port } } await api.addDomain(body) setNewDomain('') setNewNote('') setNewBackend({ ...blankBackend }) setError(null) await load() } catch (e) { setError(e.message) } } async function toggle(d) { try { await api.patchDomain(d.domain, { enabled: !d.enabled }) await load() } catch (e) { setError(e.message) } } async function remove(d) { if (!confirm(`${d.domain} 을(를) 삭제할까요?`)) return try { await api.deleteDomain(d.domain) await load() } catch (e) { setError(e.message) } } function startEdit(d) { setEditing({ domain: d.domain, host: d.backend?.host ?? '', port: d.backend?.port ?? '', }) } async function saveEdit() { try { const { domain, host, port } = editing if (!host.trim() || !port) { // 둘 다 비우면 backend 삭제 → 기본값으로 폴백 await api.patchDomain(domain, { clear_backend: true }) } else { await api.patchDomain(domain, { backend: { host: host.trim(), port: +port }, }) } setEditing(null) await load() } catch (e) { setError(e.message) } } async function clearBackend(d) { if (!confirm(`${d.domain} 의 개별 backend 설정을 지우고 기본값으로 되돌릴까요?`)) return try { await api.patchDomain(d.domain, { clear_backend: true }) await load() } catch (e) { setError(e.message) } } return (

허용 도메인

{error &&
{error}
}

새 도메인

백엔드 호스트/포트를 비워두면 설정 페이지의 기본 backend 로 라우팅됩니다.
{domains.length === 0 && ( )} {domains.map((d) => { const isEditing = editing?.domain === d.domain return ( ) })}
도메인 메모 백엔드 활성
등록된 도메인이 없습니다.
{d.domain} {d.note} {isEditing ? (
setEditing({ ...editing, host: e.target.value })} /> setEditing({ ...editing, port: e.target.value })} style={{ width: 90 }} />
) : d.backend ? ( {d.backend.host}:{d.backend.port} ) : ( 기본값 ({defaultBackend ? `${defaultBackend.host}:${defaultBackend.port}` : '-'}) )}
{isEditing ? ( <> ) : ( <> {d.backend && ( )} )}
) }