"use client"; import { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; interface Language { langCode: string; langName: string; langNative: string; } interface LangKey { keyId?: number; companyCode: string; menuCode: string; langKey: string; keyType: string; description: string; isActive: string; } interface LangText { textId?: number; keyId?: number; langCode: string; langText: string; isActive: string; } interface LangKeyModalProps { open: boolean; onOpenChange: (open: boolean) => void; langKey?: LangKey; languages: Language[]; companies: { code: string; name: string }[]; menus: { code: string; name: string }[]; keyTypes: { code: string; name: string }[]; onSave: (keyData: LangKey, textData: LangText[]) => void; } export function LangKeyModal({ open, onOpenChange, langKey, languages, companies, menus, keyTypes, onSave, }: LangKeyModalProps) { const [keyData, setKeyData] = useState({ companyCode: "", menuCode: "", langKey: "", keyType: "TEXT", description: "", isActive: "Y", }); const [textData, setTextData] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (langKey) { setKeyData(langKey); fetchLangTexts(langKey.keyId!); } else { setKeyData({ companyCode: "", menuCode: "", langKey: "", keyType: "TEXT", description: "", isActive: "Y", }); initializeTextData(); } }, [langKey, open]); const initializeTextData = () => { const initialTexts = languages.map((lang) => ({ langCode: lang.langCode, langText: "", isActive: "Y", })); setTextData(initialTexts); }; const fetchLangTexts = async (keyId: number) => { try { const response = await fetch(`/api/multilang/keys/${keyId}/texts`); const data = await response.json(); if (data.success) { const texts = data.data; const allTexts = languages.map((lang) => { const existingText = texts.find((t: LangText) => t.langCode === lang.langCode); return ( existingText || { langCode: lang.langCode, langText: "", isActive: "Y", } ); }); setTextData(allTexts); } } catch (error) { console.error("다국어 텍스트 조회 실패:", error); initializeTextData(); } }; const handleSave = async () => { if (!keyData.companyCode || !keyData.menuCode || !keyData.langKey) { alert("필수 항목을 입력해주세요."); return; } setLoading(true); try { await onSave(keyData, textData); onOpenChange(false); } catch (error) { console.error("저장 실패:", error); alert("저장에 실패했습니다."); } finally { setLoading(false); } }; const updateTextData = (langCode: string, value: string) => { setTextData((prev) => prev.map((text) => (text.langCode === langCode ? { ...text, langText: value } : text))); }; return ( {langKey ? "다국어 키 수정" : "새 다국어 키 추가"}
{/* 키 정보 */} 키 정보
setKeyData((prev) => ({ ...prev, langKey: e.target.value }))} placeholder="예: menu.dashboard, button.save" />