"use client"; import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { ExternalCallConfigAPI, ExternalCallConfig } from "@/lib/api/externalCallConfig"; import { ExternalCallAPI } from "@/lib/api/externalCall"; import { toast } from "sonner"; import { Globe, TestTube, RefreshCw } from "lucide-react"; // 단순화된 외부 호출 설정 타입 export interface SimpleExternalCallSettings { configId?: number; // 선택된 외부 호출 설정 ID configName?: string; // 설정 이름 (표시용) message: string; // 메시지 템플릿 } interface SimpleExternalCallSettingsProps { settings: SimpleExternalCallSettings; onSettingsChange: (settings: SimpleExternalCallSettings) => void; } export function SimpleExternalCallSettings({ settings, onSettingsChange }: SimpleExternalCallSettingsProps) { const [availableConfigs, setAvailableConfigs] = useState([]); const [loading, setLoading] = useState(true); const [testLoading, setTestLoading] = useState(false); // 사용 가능한 외부 호출 설정 목록 조회 const fetchAvailableConfigs = async () => { try { setLoading(true); const response = await ExternalCallConfigAPI.getConfigs({ is_active: "Y", // 활성화된 설정만 조회 }); if (response.success) { setAvailableConfigs(response.data || []); } else { toast.error("외부 호출 설정 목록 조회 실패"); } } catch (error) { console.error("외부 호출 설정 목록 조회 오류:", error); toast.error("외부 호출 설정을 불러올 수 없습니다."); } finally { setLoading(false); } }; // 컴포넌트 마운트 시 설정 목록 조회 useEffect(() => { fetchAvailableConfigs(); }, []); // 외부 호출 설정 선택 const handleConfigChange = (configId: string) => { if (configId === "none") { onSettingsChange({ ...settings, configId: undefined, configName: undefined, }); return; } const selectedConfig = availableConfigs.find((config) => config.id?.toString() === configId); if (selectedConfig) { onSettingsChange({ ...settings, configId: selectedConfig.id, configName: selectedConfig.config_name, }); } }; // 메시지 변경 const handleMessageChange = (message: string) => { onSettingsChange({ ...settings, message, }); }; // 테스트 실행 const handleTest = async () => { if (!settings.configId) { toast.error("외부 호출 설정을 선택해주세요."); return; } if (!settings.message.trim()) { toast.error("메시지를 입력해주세요."); return; } try { setTestLoading(true); // 선택된 설정 정보 가져오기 const configResponse = await ExternalCallConfigAPI.getConfigById(settings.configId); if (!configResponse.success || !configResponse.data) { toast.error("외부 호출 설정을 찾을 수 없습니다."); return; } const config = configResponse.data; const configData = config.config_data as any; // 백엔드 API용 설정 변환 const backendSettings: Record = { callType: config.call_type, apiType: config.api_type, message: settings.message, timeout: 10000, }; // API 타입별 설정 추가 switch (config.api_type) { case "discord": backendSettings.webhookUrl = configData.webhookUrl; backendSettings.username = configData.username; if (configData.avatarUrl) { backendSettings.avatarUrl = configData.avatarUrl; } break; case "slack": backendSettings.webhookUrl = configData.webhookUrl; if (configData.channel) { backendSettings.channel = configData.channel; } if (configData.username) { backendSettings.username = configData.username; } break; case "kakao-talk": backendSettings.accessToken = configData.accessToken; if (configData.templateId) { backendSettings.templateId = configData.templateId; } break; case "generic": backendSettings.url = configData.url; backendSettings.method = configData.method || "POST"; backendSettings.headers = configData.headers || {}; if (configData.timeout) { backendSettings.timeout = configData.timeout; } break; } // 테스트 실행 (10초 타임아웃) const testPromise = ExternalCallAPI.testExternalCall({ settings: backendSettings, templateData: { recordCount: 5, timestamp: new Date().toISOString() }, }); const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("테스트가 10초 내에 완료되지 않았습니다.")), 10000), ); const result = await Promise.race([testPromise, timeoutPromise]); if ((result as any).success) { toast.success(`테스트 성공: ${config.config_name}`); } else { toast.error(`테스트 실패: ${(result as any).message || "알 수 없는 오류"}`); } } catch (error) { console.error("외부 호출 테스트 오류:", error); if (error instanceof Error && error.message.includes("10초")) { toast.error("테스트 타임아웃: 10초 내에 응답이 없습니다."); } else { toast.error("테스트 실행 중 오류가 발생했습니다."); } } finally { setTestLoading(false); } }; // 선택된 설정 정보 const selectedConfig = availableConfigs.find((config) => config.id === settings.configId); return (

외부 호출 설정

{/* 외부 호출 설정 선택 */}
{/* 선택된 설정 정보 표시 */} {selectedConfig && (
{selectedConfig.config_name}
{selectedConfig.description && (
{selectedConfig.description}
)}
)}
{/* 메시지 템플릿 */}