import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { AxiosError } from "axios"; import { Save, Trash2 } from "lucide-react"; import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Button } from "../../../components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "../../../components/ui/card"; import { Input } from "../../../components/ui/input"; import { Label } from "../../../components/ui/label"; import { Textarea } from "../../../components/ui/textarea"; import { toast } from "../../../components/ui/use-toast"; import { approveTenant, deleteTenant, fetchTenant, fetchTenants, updateTenant, } from "../../../lib/adminApi"; import { t } from "../../../lib/i18n"; export function TenantProfilePage() { const { tenantId } = useParams<{ tenantId: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); if (!tenantId) { return (
{t("msg.admin.tenants.missing_id", "테넌트 ID가 없습니다.")}
); } const tenantQuery = useQuery({ queryKey: ["tenant", tenantId], queryFn: () => fetchTenant(tenantId), }); const parentQuery = useQuery({ queryKey: ["tenants", "list-all"], queryFn: () => fetchTenants(1000, 0), }); const availableParents = parentQuery.data?.items?.filter((t) => t.id !== tenantId) || []; const [name, setName] = useState(""); const [type, setType] = useState("COMPANY"); const [slug, setSlug] = useState(""); const [description, setDescription] = useState(""); const [status, setStatus] = useState("active"); const [domains, setDomains] = useState(""); const [parentId, setParentId] = useState(""); useEffect(() => { if (tenantQuery.data) { setName(tenantQuery.data.name); setType(tenantQuery.data.type || "COMPANY"); setSlug(tenantQuery.data.slug); setDescription(tenantQuery.data.description ?? ""); setStatus(tenantQuery.data.status); setDomains(tenantQuery.data.domains?.join(", ") ?? ""); setParentId(tenantQuery.data.parentId ?? ""); } }, [tenantQuery.data]); const updateMutation = useMutation({ mutationFn: () => updateTenant(tenantId, { name, type, slug, description: description || undefined, status, parentId: parentId || undefined, domains: domains .split(",") .map((d) => d.trim()) .filter((d) => d !== ""), }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["tenants"] }); queryClient.invalidateQueries({ queryKey: ["tenant", tenantId] }); toast.success(t("msg.info.saved_success", "저장되었습니다.")); }, onError: (err: AxiosError<{ error?: string }>) => { toast.error( err.response?.data?.error || t("err.common.unknown", "오류가 발생했습니다."), ); }, }); const approveMutation = useMutation({ mutationFn: () => approveTenant(tenantId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["tenants"] }); queryClient.invalidateQueries({ queryKey: ["tenant", tenantId] }); toast.success( t("msg.admin.tenants.approve_success", "테넌트가 승인되었습니다."), ); }, onError: (err: AxiosError<{ error?: string }>) => { toast.error( err.response?.data?.error || t("err.common.unknown", "오류가 발생했습니다."), ); }, }); const deleteMutation = useMutation({ mutationFn: () => deleteTenant(tenantId), onSuccess: () => { navigate("/tenants"); toast.success( t("msg.admin.tenants.delete_success", "테넌트가 삭제되었습니다."), ); }, }); const errorMsg = (updateMutation.error as AxiosError<{ error?: string }>) ?.response?.data?.error; const loadError = (tenantQuery.error as AxiosError<{ error?: string }>) ?.response?.data?.error; const handleDelete = () => { if ( window.confirm( t("msg.admin.tenants.delete_confirm", "삭제하시겠습니까?", { name: tenantQuery.data?.name ?? "", }), ) ) { deleteMutation.mutate(); } }; const handleApprove = () => { if ( window.confirm( t("msg.admin.tenants.approve_confirm", "이 테넌트를 승인하시겠습니까?"), ) ) { approveMutation.mutate(); } }; return ( <> {t("ui.admin.tenants.profile.title", "테넌트 프로필")} {t( "ui.admin.tenants.profile.subtitle", "슬러그 및 상태 변경은 즉시 적용됩니다.", )} {loadError && (
{loadError}
)}
setName(e.target.value)} />

{t( "ui.admin.tenants.profile.form.parent_help", "하위 조직을 종속시킬 경우 상위 테넌트를 선택해주세요.", )}

setSlug(e.target.value)} />