"use client"; import React, { useState, useEffect } from "react"; import { CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { ArrowRight, Database, Globe, Loader2 } from "lucide-react"; import { toast } from "sonner"; // API import import { getActiveConnections, ConnectionInfo } from "@/lib/api/multiConnection"; // νƒ€μž… import import { Connection } from "@/lib/types/multiConnection"; interface ConnectionStepProps { connectionType: "data_save" | "external_call"; fromConnection?: Connection; toConnection?: Connection; onSelectConnection: (type: "from" | "to", connection: Connection) => void; onNext: () => void; } /** * πŸ”— 1단계: μ—°κ²° 선택 * - FROM/TO λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 선택 * - μ—°κ²° μƒνƒœ ν‘œμ‹œ * - μ§€μ—°μ‹œκ°„ 정보 */ const ConnectionStep: React.FC = React.memo( ({ connectionType, fromConnection, toConnection, onSelectConnection, onNext }) => { const [connections, setConnections] = useState([]); const [isLoading, setIsLoading] = useState(true); // API 응닡을 Connection νƒ€μž…μœΌλ‘œ λ³€ν™˜ const convertToConnection = (connectionInfo: ConnectionInfo): Connection => ({ id: connectionInfo.id, name: connectionInfo.connection_name, type: connectionInfo.db_type, host: connectionInfo.host, port: connectionInfo.port, database: connectionInfo.database_name, username: connectionInfo.username, isActive: connectionInfo.is_active === "Y", companyCode: connectionInfo.company_code, createdDate: connectionInfo.created_date, updatedDate: connectionInfo.updated_date, }); // μ—°κ²° λͺ©λ‘ λ‘œλ“œ useEffect(() => { const loadConnections = async () => { try { setIsLoading(true); const data = await getActiveConnections(); // 메인 DB μ—°κ²° μΆ”κ°€ const mainConnection: Connection = { id: 0, name: "메인 λ°μ΄ν„°λ² μ΄μŠ€", type: "postgresql", host: "localhost", port: 5432, database: "main", username: "main_user", isActive: true, }; // API 응닡을 Connection νƒ€μž…μœΌλ‘œ λ³€ν™˜ const convertedConnections = data.map(convertToConnection); // 쀑볡 λ°©μ§€: 기쑴에 메인 연결이 μ—†λŠ” κ²½μš°μ—λ§Œ μΆ”κ°€ const hasMainConnection = convertedConnections.some((conn) => conn.id === 0); const preliminaryConnections = hasMainConnection ? convertedConnections : [mainConnection, ...convertedConnections]; // ID 쀑볡 제거 (Set μ‚¬μš©) const uniqueConnections = preliminaryConnections.filter( (conn, index, arr) => arr.findIndex((c) => c.id === conn.id) === index, ); console.log("πŸ”— μ—°κ²° λͺ©λ‘ λ‘œλ“œ μ™„λ£Œ:", uniqueConnections); setConnections(uniqueConnections); } catch (error) { console.error("❌ μ—°κ²° λͺ©λ‘ λ‘œλ“œ μ‹€νŒ¨:", error); toast.error("μ—°κ²° λͺ©λ‘μ„ λΆˆλŸ¬μ˜€λŠ”λ° μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€."); // μ—λŸ¬ μ‹œμ—λ„ 메인 연결은 제곡 const mainConnection: Connection = { id: 0, name: "메인 λ°μ΄ν„°λ² μ΄μŠ€", type: "postgresql", host: "localhost", port: 5432, database: "main", username: "main_user", isActive: true, }; setConnections([mainConnection]); } finally { setIsLoading(false); } }; loadConnections(); }, []); const handleConnectionSelect = (type: "from" | "to", connectionId: string) => { const connection = connections.find((c) => c.id.toString() === connectionId); if (connection) { onSelectConnection(type, connection); } }; const canProceed = fromConnection && toConnection; const getConnectionIcon = (connection: Connection) => { return connection.id === 0 ? : ; }; const getConnectionBadge = (connection: Connection) => { if (connection.id === 0) { return ( 메인 DB ); } return ( {connection.type?.toUpperCase()} ); }; return ( <> 1단계: μ—°κ²° 선택

{connectionType === "data_save" ? "데이터λ₯Ό μ €μž₯ν•  μ†ŒμŠ€μ™€ λŒ€μƒ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ„ νƒν•˜μ„Έμš”." : "μ™ΈλΆ€ ν˜ΈμΆœμ„ μœ„ν•œ μ†ŒμŠ€μ™€ λŒ€μƒ 연결을 μ„ νƒν•˜μ„Έμš”."}

{isLoading ? (
μ—°κ²° λͺ©λ‘μ„ λΆˆλŸ¬μ˜€λŠ” 쀑...
) : ( <> {/* FROM μ—°κ²° 선택 */}

FROM μ—°κ²° (μ†ŒμŠ€)

{fromConnection && (
🟒 연결됨 μ§€μ—°μ‹œκ°„: ~23ms
)}
{fromConnection && (
{getConnectionIcon(fromConnection)} {fromConnection.name} {getConnectionBadge(fromConnection)}

호슀트: {fromConnection.host}:{fromConnection.port}

λ°μ΄ν„°λ² μ΄μŠ€: {fromConnection.database}

)}
{/* TO μ—°κ²° 선택 */}

TO μ—°κ²° (λŒ€μƒ)

{toConnection && (
🟒 연결됨 μ§€μ—°μ‹œκ°„: ~45ms
)}
{toConnection && (
{getConnectionIcon(toConnection)} {toConnection.name} {getConnectionBadge(toConnection)}

호슀트: {toConnection.host}:{toConnection.port}

λ°μ΄ν„°λ² μ΄μŠ€: {toConnection.database}

)}
{/* μ—°κ²° λ§€ν•‘ ν‘œμ‹œ */} {fromConnection && toConnection && (
{fromConnection.name}
μ†ŒμŠ€
{toConnection.name}
λŒ€μƒ
πŸ’‘ μ—°κ²° λ§€ν•‘ μ„€μ • μ™„λ£Œ
)} {/* λ‹€μŒ 단계 λ²„νŠΌ */}
)}
); }, ); ConnectionStep.displayName = "ConnectionStep"; export default ConnectionStep;