"use client"; import * as React from "react"; import { closestCenter, DndContext, type DragEndEvent, } from "@dnd-kit/core"; import { rectSortingStrategy, SortableContext, useSortable, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { DotsSixVerticalIcon, XIcon } from "@phosphor-icons/react"; import { cn } from "../../../lib/utils"; import { Button } from "../../primitives"; import { FileDropPlusGlyph, getImageTransformStyle, } from "./file-drop-presentation"; import type { FileDropPresentationEntry, FileDropPresentationItem, } from "./file-drop-types"; type SortablePreviewTileProps = { entry: FileDropPresentationEntry; isSortable: boolean; onItemRemove?: (item: FileDropPresentationItem, index: number) => void; onPreviewSelect?: (itemKey: string) => void; selected?: boolean; }; function SortablePreviewTile({ entry, isSortable, onItemRemove, onPreviewSelect, selected = false, }: SortablePreviewTileProps): React.JSX.Element { const { item, key: itemKey, sourceIndex } = entry; const { attributes, isDragging, listeners, setNodeRef, transform, transition } = useSortable({ disabled: !isSortable, id: itemKey, }); const sortableTransform = transform ? { ...transform, scaleX: isDragging ? 1.035 : transform.scaleX, scaleY: isDragging ? 1.035 : transform.scaleY, } : null; const style: React.CSSProperties = { transform: sortableTransform ? CSS.Transform.toString(sortableTransform) : undefined, transition, }; const image = ( {item.alt ); return (
{onPreviewSelect ? ( ) : (
{image}
)} {isSortable ? ( ) : null} {onItemRemove ? ( ) : null}
); } type FileDropImageGridProps = { isSortable: boolean; onAddImages: () => void; onDragEnd: (event: DragEndEvent) => void; onItemRemove?: (item: FileDropPresentationItem, index: number) => void; onPreviewSelect?: (itemKey: string) => void; previewEntries: readonly FileDropPresentationEntry[]; previewKeys: string[]; selectedPreviewKey: string | null; sensors: React.ComponentProps["sensors"]; }; export function FileDropImageGrid({ isSortable, onAddImages, onDragEnd, onItemRemove, onPreviewSelect, previewEntries, previewKeys, selectedPreviewKey, sensors, }: FileDropImageGridProps): React.JSX.Element { return (
{previewEntries.map((entry) => ( ))}
); }