"use client"; import React, { ReactNode } from "react"; import { closestCorners, DndContext, DragEndEvent, DragOverEvent, DragStartEvent, } from "@dnd-kit/core"; import { horizontalListSortingStrategy, SortableContext, } from "@dnd-kit/sortable"; import { Carousel } from "@mantine/carousel"; import { Group } from "@mantine/core"; import CreateStatusButton from "@/app/deals/components/shared/CreateStatusButton/CreateStatusButton"; import useDndSensors from "@/app/deals/hooks/useSensors"; import FunnelColumn from "@/components/dnd/FunnelDnd/FunnelColumn"; import FunnelOverlay from "@/components/dnd/FunnelDnd/FunnelOverlay"; import { BaseDraggable } from "@/components/dnd/types/types"; import useIsMobile from "@/hooks/useIsMobile"; import SortableItem from "../SortableItem"; import styles from "./FunnelDnd.module.css"; type Props = { containers: TContainer[]; items: TItem[]; onDragStart: (event: DragStartEvent) => void; onDragOver: (event: DragOverEvent) => void; onDragEnd: (event: DragEndEvent) => void; renderContainer: (container: TContainer, children: ReactNode) => ReactNode; renderContainerOverlay: ( container: TContainer, children: ReactNode ) => ReactNode; renderItem: (item: TItem) => ReactNode; renderItemOverlay: (item: TItem) => ReactNode; getContainerId: (container: TContainer) => string; getItemsByContainer: (container: TContainer, items: TItem[]) => TItem[]; activeContainer: TContainer | null; activeItem: TItem | null; disabledColumns?: boolean; }; const FunnelDnd = < TContainer extends BaseDraggable, TItem extends BaseDraggable, >({ containers, items, onDragStart, onDragOver, onDragEnd, renderContainer, renderContainerOverlay, renderItem, renderItemOverlay, getContainerId, getItemsByContainer, activeContainer, activeItem, disabledColumns = false, }: Props) => { const sensors = useDndSensors(); const isMobile = useIsMobile(); const renderContainers = () => containers.map(container => { const containerItems = getItemsByContainer(container, items); const containerId = getContainerId(container); const item = ( renderContainer( container, ) } /> ); if (!isMobile) return item; return {item}; }); const renderBody = () => { if (isMobile) { return ( {renderContainers()} ); } return ( {renderContainers()} ); }; return ( {renderBody()} { const containerItems = getItemsByContainer( container, items ); const containerId = getContainerId(container); return renderContainerOverlay( container, ); }} renderItem={renderItemOverlay} /> ); }; export default FunnelDnd;