"use client"; import React, { useMemo } from "react"; import { useSplitPanel } from "@/lib/registry/components/split-panel-layout/SplitPanelContext"; interface SplitPanelAwareWrapperProps { children: React.ReactNode; componentX: number; componentY: number; componentWidth: number; componentHeight: number; componentType?: string; style?: React.CSSProperties; className?: string; } /** * 분할 패널 드래그 리사이즈에 따라 컴포넌트 위치를 자동 조정하는 래퍼 * * 동작 방식: * 1. 컴포넌트가 분할 패널의 좌측 영역 위에 있는지 감지 * 2. 좌측 영역 위에 있으면, 드래그 핸들 이동량만큼 X 좌표를 조정 * 3. 우측 영역이나 분할 패널 외부에 있으면 원래 위치 유지 */ export const SplitPanelAwareWrapper: React.FC = ({ children, componentX, componentY, componentWidth, componentHeight, componentType, style, className, }) => { const { getAdjustedX, getOverlappingSplitPanel } = useSplitPanel(); // 분할 패널 위에 있는지 확인 및 조정된 X 좌표 계산 const { adjustedX, isInLeftPanel, isDragging } = useMemo(() => { const overlap = getOverlappingSplitPanel(componentX, componentY, componentWidth, componentHeight); if (!overlap) { // 분할 패널 위에 없음 return { adjustedX: componentX, isInLeftPanel: false, isDragging: false }; } if (!overlap.isInLeftPanel) { // 우측 패널 위에 있음 - 원래 위치 유지 return { adjustedX: componentX, isInLeftPanel: false, isDragging: overlap.panel.isDragging }; } // 좌측 패널 위에 있음 - 위치 조정 const adjusted = getAdjustedX(componentX, componentY, componentWidth, componentHeight); return { adjustedX: adjusted, isInLeftPanel: true, isDragging: overlap.panel.isDragging, }; }, [componentX, componentY, componentWidth, componentHeight, getAdjustedX, getOverlappingSplitPanel]); // 조정된 스타일 const adjustedStyle: React.CSSProperties = { ...style, position: "absolute", left: `${adjustedX}px`, top: `${componentY}px`, width: componentWidth, height: componentHeight, // 드래그 중에는 트랜지션 없이 즉시 이동, 드래그 끝나면 부드럽게 transition: isDragging ? "none" : "left 0.1s ease-out", }; // 디버그 로깅 (개발 중에만) // if (isInLeftPanel) { // console.log(`📍 [SplitPanelAwareWrapper] 위치 조정:`, { // componentType, // originalX: componentX, // adjustedX, // delta: adjustedX - componentX, // isInLeftPanel, // isDragging, // }); // } return (
{children}
); }; export default SplitPanelAwareWrapper;