import React, { useEffect, useState } from "react"; import Tree, { mutateTree, moveItemOnTree, RenderItemParams, TreeItem, TreeData, ItemId, TreeSourcePosition, TreeDestinationPosition, } from "@atlaskit/tree"; import useCollectionStore from "@/store/collections"; import { Collection } from "@prisma/client"; import Link from "next/link"; interface ExtendedTreeItem extends TreeItem { data: Collection; } const DragDropWithNestingTree = () => { const buildTreeFromCollections = (collections: Collection[]): TreeData => { const items: { [key: string]: ExtendedTreeItem } = collections.reduce( (acc: any, collection) => { acc[collection.id] = { id: collection.id, children: [], hasChildren: false, isExpanded: false, data: { name: collection.name, description: collection.description, color: collection.color, isPublic: collection.isPublic, ownerId: collection.ownerId, createdAt: collection.createdAt, updatedAt: collection.updatedAt, }, }; return acc; }, {} ); collections.forEach((collection) => { const parentId = collection.parentId; if (parentId && items[parentId]) { items[parentId].children.push(collection.id); items[parentId].hasChildren = true; } }); const rootId = "root"; items[rootId] = { id: rootId, children: collections.filter((c) => c.parentId === null).map((c) => c.id), hasChildren: true, isExpanded: true, data: { name: "Root" } as Collection, }; return { rootId, items }; }; const [tree, setTree] = useState(); const { collections } = useCollectionStore(); useEffect(() => { const initialTree = buildTreeFromCollections( collections as unknown as Collection[] ); collections[0] && setTree(initialTree); }, [collections]); const getIcon = ( item: ExtendedTreeItem, onExpand: (id: ItemId) => void, onCollapse: (id: ItemId) => void ) => { if (item.children && item.children.length > 0) { return item.isExpanded ? ( ) : ( ); } // return ; }; const renderItem = ({ item, onExpand, onCollapse, provided, }: RenderItemParams) => { const collection = item.data; return (
{getIcon(item as ExtendedTreeItem, onExpand, onCollapse)}

{collection.name}

{collection.isPublic ? ( ) : undefined}
{collection._count?.links}
); }; const onExpand = (itemId: ItemId) => { if (tree) { setTree((currentTree) => mutateTree(currentTree!, itemId, { isExpanded: true }) ); } }; const onCollapse = (itemId: ItemId) => { if (tree) { setTree((currentTree) => mutateTree(currentTree as TreeData, itemId, { isExpanded: false }) ); } }; const onDragEnd = ( source: TreeSourcePosition, destination: TreeDestinationPosition | undefined ) => { if (!destination || !tree) { return; } setTree((currentTree) => moveItemOnTree(currentTree!, source, destination)); }; if (!tree) { return
Loading...
; } return ( ); }; export default DragDropWithNestingTree;