import { useState, useEffect } from 'react'; import type { Tenant, CreateTenantRequest, UpdateTenantRequest } from '../../types/tenant'; import { getTenants, createTenant, updateTenant } from '../../services/tenantService'; const TenantsPage = () => { const [tenants, setTenants] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [editingTenant, setEditingTenant] = useState(null); const [tenantCode, setTenantCode] = useState(''); const [tenantName, setTenantName] = useState(''); const [description, setDescription] = useState(''); const [isActive, setIsActive] = useState(true); const fetchTenants = async () => { try { setLoading(true); const res = await getTenants(); if (res.success && res.data) { setTenants(res.data); } else { setError(res.message || '테넌트 목록을 불러오는데 실패했습니다.'); } } catch { setError('테넌트 목록을 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; useEffect(() => { fetchTenants(); }, []); const handleOpenCreate = () => { setEditingTenant(null); setTenantCode(''); setTenantName(''); setDescription(''); setIsActive(true); setIsModalOpen(true); }; const handleOpenEdit = (tenant: Tenant) => { setEditingTenant(tenant); setTenantCode(tenant.tenantCode); setTenantName(tenant.tenantName); setDescription(tenant.description || ''); setIsActive(tenant.isActive); setIsModalOpen(true); }; const handleCloseModal = () => { setIsModalOpen(false); setEditingTenant(null); setError(null); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); try { if (editingTenant) { const req: UpdateTenantRequest = { tenantName, description: description || undefined, isActive, }; const res = await updateTenant(editingTenant.tenantId, req); if (!res.success) { setError(res.message || '테넌트 수정에 실패했습니다.'); return; } } else { const req: CreateTenantRequest = { tenantCode, tenantName, description: description || undefined, }; const res = await createTenant(req); if (!res.success) { setError(res.message || '테넌트 생성에 실패했습니다.'); return; } } handleCloseModal(); await fetchTenants(); } catch { setError(editingTenant ? '테넌트 수정에 실패했습니다.' : '테넌트 생성에 실패했습니다.'); } }; if (loading) { return
로딩 중...
; } return (

Tenants

{error && !isModalOpen && (
{error}
)}
{tenants.map((tenant) => ( ))} {tenants.length === 0 && ( )}
Code Name Description Active Created Actions
{tenant.tenantCode} {tenant.tenantName} {tenant.description || '-'} {tenant.isActive ? 'Active' : 'Inactive'} {new Date(tenant.createdAt).toLocaleDateString()}
등록된 테넌트가 없습니다.
{isModalOpen && (

{editingTenant ? '테넌트 수정' : '테넌트 생성'}

{error && (
{error}
)}
setTenantCode(e.target.value)} disabled={!!editingTenant} required className="w-full border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 rounded-lg px-3 py-2 focus:ring-2 focus:ring-blue-500 focus:outline-none disabled:bg-gray-100 disabled:text-gray-500 dark:disabled:bg-gray-600 dark:disabled:text-gray-400" />
setTenantName(e.target.value)} required className="w-full border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 rounded-lg px-3 py-2 focus:ring-2 focus:ring-blue-500 focus:outline-none" />