import { useState, useEffect, useCallback } from 'react'; import { Mail, Plus, Edit2, Trash2, X, RefreshCw, Search, Type, FileText, User, CheckCircle2 } from 'lucide-react'; import { comms } from '@/communication'; import { MailFormItem } from '@/types'; import { clsx } from 'clsx'; const initialFormData: Partial = { cate: '', title: '', tolist: '', bcc: '', cc: '', subject: '', tail: '', body: '', selfTo: false, selfCC: false, selfBCC: false, exceptmail: '', exceptmailcc: '', }; export function MailFormPage() { const [loading, setLoading] = useState(false); const [mailForms, setMailForms] = useState([]); const [searchKey, setSearchKey] = useState(''); const [showModal, setShowModal] = useState(false); const [editingItem, setEditingItem] = useState(null); const [formData, setFormData] = useState>(initialFormData); const [saving, setSaving] = useState(false); const loadData = useCallback(async () => { setLoading(true); try { const response = await comms.getMailFormList(); if (response.Success && response.Data) { setMailForms(response.Data); } } catch (error) { console.error('데이터 로드 오류:', error); alert('데이터를 불러오는 중 오류가 발생했습니다.'); } finally { setLoading(false); } }, []); useEffect(() => { loadData(); }, [loadData]); const filteredItems = mailForms.filter(item => !searchKey || item.title?.toLowerCase().includes(searchKey.toLowerCase()) || item.cate?.toLowerCase().includes(searchKey.toLowerCase()) || item.subject?.toLowerCase().includes(searchKey.toLowerCase()) ); const openAddModal = () => { setEditingItem(null); setFormData(initialFormData); setShowModal(true); }; const openEditModal = (item: MailFormItem) => { setEditingItem(item); setFormData({ cate: item.cate || '', title: item.title || '', tolist: item.tolist || '', bcc: item.bcc || '', cc: item.cc || '', subject: item.subject || '', tail: item.tail || '', body: item.body || '', selfTo: item.selfTo || false, selfCC: item.selfCC || false, selfBCC: item.selfBCC || false, exceptmail: item.exceptmail || '', exceptmailcc: item.exceptmailcc || '', }); setShowModal(true); }; const handleSave = async () => { if (!formData.title?.trim()) { alert('양식명을 입력해주세요.'); return; } setSaving(true); try { let response; if (editingItem) { response = await comms.editMailForm( editingItem.idx, formData.cate || '', formData.title || '', formData.tolist || '', formData.bcc || '', formData.cc || '', formData.subject || '', formData.tail || '', formData.body || '', formData.selfTo || false, formData.selfCC || false, formData.selfBCC || false, formData.exceptmail || '', formData.exceptmailcc || '' ); } else { response = await comms.addMailForm( formData.cate || '', formData.title || '', formData.tolist || '', formData.bcc || '', formData.cc || '', formData.subject || '', formData.tail || '', formData.body || '', formData.selfTo || false, formData.selfCC || false, formData.selfBCC || false, formData.exceptmail || '', formData.exceptmailcc || '' ); } if (response.Success) { setShowModal(false); loadData(); } else { alert(response.Message || '저장에 실패했습니다.'); } } catch (error) { console.error('저장 오류:', error); alert('저장 중 오류가 발생했습니다.'); } finally { setSaving(false); } }; const handleDelete = async (item: MailFormItem) => { if (!confirm(`"${item.title}" 양식을 삭제하시겠습니까?`)) return; try { const response = await comms.deleteMailForm(item.idx); if (response.Success) { loadData(); } else { alert(response.Message || '삭제에 실패했습니다.'); } } catch (error) { console.error('삭제 오류:', error); alert('삭제 중 오류가 발생했습니다.'); } }; return (
{/* 메일양식 메인 카드 */}

메일양식 관리

Email Template System

{/* 검색창 */}
setSearchKey(e.target.value)} placeholder="양식명, 제목, 분류 검색..." className="w-full bg-white/5 border border-white/10 rounded-xl pl-9 pr-4 py-1.5 text-xs text-white placeholder-white/20 focus:outline-none focus:ring-1 focus:ring-primary-500/50 transition-all backdrop-blur-sm h-[40px]" />
{/* 개수 */}
{filteredItems.length}
{/* 새로고침 */} {/* 추가 버튼 */}
{/* 리스트 헤더 */}
분류
양식 정보
메일 제목
수신 옵션
작업
{loading ? (

양식 데이터를 불러오는 중...

) : filteredItems.length === 0 ? (

등록된 메일양식이 없습니다

No email templates available

) : ( filteredItems.map((item) => (
{/* 분류 */}
{item.cate || '미분류'}
{/* 양식명 */}
{item.title}
ID: {item.idx}
{/* 제목 */}
{item.subject || '(제목 없음)'}
{/* 발신 옵션 (To/CC/BCC Self) */}
{[ { label: 'T', active: item.selfTo, color: 'text-primary-400', bg: 'bg-primary-500/10' }, { label: 'C', active: item.selfCC, color: 'text-amber-400', bg: 'bg-amber-500/10' }, { label: 'B', active: item.selfBCC, color: 'text-emerald-400', bg: 'bg-emerald-500/10' } ].map((opt, i) => (
{opt.label}
))}
{/* 작업 버튼 */}
)) )}
{/* 푸터 */}
Template Management Hub / Total {filteredItems.length}
Reference date: {new Date().toLocaleDateString()}
{/* 편집 모달 */} {showModal && (
setShowModal(false)} />
{/* 모달 헤더 */}

{editingItem ? '메일양식 수정' : '새 메일양식 등록'}

Template Configuration

{/* 모달 내용 */}
{/* 기본 정보 */}

분류 및 명칭

setFormData({ ...formData, cate: e.target.value })} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" placeholder="업무, 공지 등" />
setFormData({ ...formData, title: e.target.value })} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" placeholder="구분이 쉬운 양식 이름을 입력하세요" />
setFormData({ ...formData, subject: e.target.value })} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" placeholder="발송 시 자동으로 채워질 제목" />
{/* 수신자 설정 */}

수신자 기본값

{/* To */}