"use client"; import React, { useState } from "react"; import { X } from "lucide-react"; interface ConnectionLineProps { id: string; fromX: number; fromY: number; toX: number; toY: number; isValid: boolean; mapping: any; onDelete: () => void; } /** * πŸ”— SVG μ—°κ²°μ„  μ»΄ν¬λ„ŒνŠΈ * - λ² μ§€μ–΄ κ³‘μ„ μœΌλ‘œ λΆ€λ“œλŸ¬μš΄ μ—°κ²°μ„  ν‘œμ‹œ * - μœ νš¨μ„±μ— λ”°λ₯Έ 색상 λ³€κ²½ * - ν˜Έλ²„ μ‹œ μ‚­μ œ λ²„νŠΌ ν‘œμ‹œ */ const ConnectionLine: React.FC = ({ id, fromX, fromY, toX, toY, isValid, mapping, onDelete }) => { const [isHovered, setIsHovered] = useState(false); // λ² μ§€μ–΄ 곑선 μ œμ–΄μ  계산 const controlPointOffset = Math.abs(toX - fromX) * 0.5; const controlPoint1X = fromX + controlPointOffset; const controlPoint1Y = fromY; const controlPoint2X = toX - controlPointOffset; const controlPoint2Y = toY; // 패슀 생성 const pathData = `M ${fromX} ${fromY} C ${controlPoint1X} ${controlPoint1Y}, ${controlPoint2X} ${controlPoint2Y}, ${toX} ${toY}`; // 색상 κ²°μ • const strokeColor = isValid ? isHovered ? "#10b981" // green-500 hover : "#22c55e" // green-500 : isHovered ? "#f97316" // orange-500 hover : "#fb923c"; // orange-400 // 쀑간점 계산 (μ‚­μ œ λ²„νŠΌ μœ„μΉ˜) const midX = (fromX + toX) / 2; const midY = (fromY + toY) / 2; return ( {/* μ—°κ²°μ„  - 더 λΆ€λ“œλŸ½κ³  덜 λ°©ν•΄λ˜λŠ” μŠ€νƒ€μΌ */} setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} style={{ pointerEvents: "stroke" }} /> {/* μ—°κ²°μ„  μœ„μ˜ 투λͺ…ν•œ 넓은 μ˜μ—­ (ν˜Έλ²„ κ°μ§€μš©) */} setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} style={{ pointerEvents: "stroke" }} /> {/* μ‹œμž‘μ  원 */} {/* 끝점 원 */} {/* ν˜Έλ²„ μ‹œ μ‚­μ œ λ²„νŠΌ */} {isHovered && ( {/* μ‚­μ œ λ²„νŠΌ λ°°κ²½ */} { e.stopPropagation(); onDelete(); }} style={{ pointerEvents: "all" }} /> {/* X μ•„μ΄μ½˜ */} { e.stopPropagation(); onDelete(); }} style={{ pointerEvents: "all" }} > )} {/* λ§€ν•‘ 정보 툴팁 (ν˜Έλ²„ μ‹œ) */} {isHovered && ( {mapping.fromField.webType} β†’ {mapping.toField.webType} )} ); }; export default ConnectionLine;