Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import { useCallback, useMemo } from "react"; import { getParentPath } from "shared/lib/helpers/virtualFilesystem"; import { createFlatListOuterDropTarget } from "ui/lists/FlatListOuterDropTarget"; export type ReparentArgs = { draggedPath: string; dropFolder: string; }; export const useFlatListReparentDnD = <TItem>({ acceptTypes, onReparent, isReparentable, canDrop, getName, getDropFolder, }: { acceptTypes: string[]; onReparent: (item: TItem, args: ReparentArgs) => void; isReparentable?: (item: TItem) => boolean; canDrop?: (dragged: TItem, target: TItem) => boolean; getName: (item: TItem) => string; getDropFolder: (target: TItem) => string; }) => { const handleReparent = useCallback( (draggedItem: TItem, dropFolder: string) => { Iif (isReparentable && !isReparentable(draggedItem)) { return; } const name = getName(draggedItem); Iif (getParentPath(name) === dropFolder) { return; } onReparent(draggedItem, { draggedPath: name, dropFolder, }); }, [isReparentable, getName, onReparent], ); const onDropOntoItem = useCallback( (draggedItem: TItem, targetItem: TItem) => { Iif (canDrop && !canDrop(draggedItem, targetItem)) { return; } const dropFolder = getDropFolder(targetItem); handleReparent(draggedItem, dropFolder); }, [handleReparent, getDropFolder, canDrop], ); const onDropOntoRoot = useCallback( (draggedItem: TItem) => { handleReparent(draggedItem, ""); }, [handleReparent], ); const flatListDropzone = useMemo( () => createFlatListOuterDropTarget<TItem>(acceptTypes, onDropOntoRoot), [acceptTypes, onDropOntoRoot], ); return { onDropOntoItem, flatListDropzone, }; }; |