"use client"; import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Plus, Search, Edit, Trash2, TestTube, Filter } from "lucide-react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { toast } from "sonner"; import { ExternalCallConfigAPI, ExternalCallConfig, ExternalCallConfigFilter, CALL_TYPE_OPTIONS, API_TYPE_OPTIONS, ACTIVE_STATUS_OPTIONS, } from "@/lib/api/externalCallConfig"; import { ExternalCallConfigModal } from "@/components/admin/ExternalCallConfigModal"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; export default function ExternalCallConfigsPage() { const [configs, setConfigs] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(""); const [filter, setFilter] = useState({ is_active: "Y", }); // 모달 상태 const [isModalOpen, setIsModalOpen] = useState(false); const [editingConfig, setEditingConfig] = useState(null); // 삭제 확인 다이얼로그 상태 const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [configToDelete, setConfigToDelete] = useState(null); // 외부 호출 설정 목록 조회 const fetchConfigs = async () => { try { setLoading(true); const response = await ExternalCallConfigAPI.getConfigs({ ...filter, search: searchQuery.trim() || undefined, }); if (response.success) { setConfigs(response.data || []); } else { toast.error(response.message || "외부 호출 설정 조회 실패"); } } catch (error) { console.error("외부 호출 설정 조회 오류:", error); toast.error("외부 호출 설정 조회 중 오류가 발생했습니다."); } finally { setLoading(false); } }; // 초기 로드 및 필터/검색 변경 시 재조회 useEffect(() => { fetchConfigs(); }, [filter]); // 검색 실행 const handleSearch = () => { fetchConfigs(); }; // 검색 입력 시 엔터키 처리 const handleSearchKeyPress = (e: React.KeyboardEvent) => { if (e.key === "Enter") { handleSearch(); } }; // 새 설정 추가 const handleAddConfig = () => { setEditingConfig(null); setIsModalOpen(true); }; // 설정 편집 const handleEditConfig = (config: ExternalCallConfig) => { setEditingConfig(config); setIsModalOpen(true); }; // 설정 삭제 확인 const handleDeleteConfig = (config: ExternalCallConfig) => { setConfigToDelete(config); setDeleteDialogOpen(true); }; // 설정 삭제 실행 const confirmDeleteConfig = async () => { if (!configToDelete?.id) return; try { const response = await ExternalCallConfigAPI.deleteConfig(configToDelete.id); if (response.success) { toast.success("외부 호출 설정이 삭제되었습니다."); fetchConfigs(); } else { toast.error(response.message || "외부 호출 설정 삭제 실패"); } } catch (error) { console.error("외부 호출 설정 삭제 오류:", error); toast.error("외부 호출 설정 삭제 중 오류가 발생했습니다."); } finally { setDeleteDialogOpen(false); setConfigToDelete(null); } }; // 설정 테스트 const handleTestConfig = async (config: ExternalCallConfig) => { if (!config.id) return; try { const response = await ExternalCallConfigAPI.testConfig(config.id); if (response.success && response.data?.success) { toast.success(`테스트 성공: ${response.data.message}`); } else { toast.error(`테스트 실패: ${response.data?.message || response.message}`); } } catch (error) { console.error("외부 호출 설정 테스트 오류:", error); toast.error("외부 호출 설정 테스트 중 오류가 발생했습니다."); } }; // 모달 저장 완료 시 목록 새로고침 const handleModalSave = () => { setIsModalOpen(false); setEditingConfig(null); fetchConfigs(); }; // 호출 타입 라벨 가져오기 const getCallTypeLabel = (callType: string) => { return CALL_TYPE_OPTIONS.find((option) => option.value === callType)?.label || callType; }; // API 타입 라벨 가져오기 const getApiTypeLabel = (apiType?: string) => { if (!apiType) return ""; return API_TYPE_OPTIONS.find((option) => option.value === apiType)?.label || apiType; }; return (
{/* 페이지 헤더 */}

외부 호출 관리

Discord, Slack, 카카오톡 등 외부 호출 설정을 관리합니다.

{/* 검색 및 필터 영역 */}
{/* 첫 번째 줄: 검색 + 추가 버튼 */}
setSearchQuery(e.target.value)} onKeyPress={handleSearchKeyPress} className="h-10 pl-10 text-sm" />
{/* 두 번째 줄: 필터 */}
{/* 설정 목록 */}
{loading ? ( // 로딩 상태
로딩 중...
) : configs.length === 0 ? ( // 빈 상태

등록된 외부 호출 설정이 없습니다.

새 외부 호출을 추가해보세요.

) : ( // 설정 테이블 목록 설정명 호출 타입 API 타입 설명 상태 생성일 작업 {configs.map((config) => ( {config.config_name} {getCallTypeLabel(config.call_type)} {config.api_type ? ( {getApiTypeLabel(config.api_type)} ) : ( - )}
{config.description ? ( {config.description} ) : ( - )}
{config.is_active === "Y" ? "활성" : "비활성"} {config.created_date ? new Date(config.created_date).toLocaleDateString() : "-"}
))}
)}
{/* 외부 호출 설정 모달 */} setIsModalOpen(false)} onSave={handleModalSave} editingConfig={editingConfig} /> {/* 삭제 확인 다이얼로그 */} 외부 호출 설정 삭제 "{configToDelete?.config_name}" 설정을 삭제하시겠습니까?
이 작업은 되돌릴 수 없습니다.
취소 삭제
); }