@formkit/drag-and-drop
Version:
Drag and drop package.
1 lines • 5.21 kB
Source Map (JSON)
{"version":3,"sources":["../../src/react/index.ts","../../src/react/utils.ts"],"sourcesContent":["import type { ReactDragAndDropConfig } from \"./types\";\nimport type { ParentConfig } from \"../types\";\nimport type { Dispatch, SetStateAction, RefObject } from \"react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\nimport { handleReactElements } from \"./utils\";\nexport * from \"./types\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap<\n HTMLElement,\n [Array<unknown>, React.Dispatch<React.SetStateAction<Array<unknown>>>]\n> = new WeakMap();\n\nfunction getValues<T>(parent: HTMLElement): Array<T> {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return values[0] as Array<T>;\n}\n\nfunction setValues(newValues: Array<unknown>, parent: HTMLElement): void {\n const values = parentValues.get(parent);\n\n if (values) values[1](newValues);\n\n parentValues.set(parent, [newValues, values![1]]);\n}\n\nfunction handleParent<E extends RefObject<HTMLElement | null> | HTMLElement, T>(\n config: Partial<ReactDragAndDropConfig<E, T[]>>,\n values: [Array<any>, React.Dispatch<React.SetStateAction<Array<any>>>]\n) {\n return (el: HTMLElement) => {\n parentValues.set(el, values);\n\n initParent<T>({ parent: el, getValues, setValues, config });\n };\n}\n\n/**\n * Entry point for React drag and drop.\n *\n * @param data - The drag and drop configuration.\n * @returns void\n */\nexport function dragAndDrop<E extends HTMLElement, I>(\n data:\n | ReactDragAndDropConfig<RefObject<E | null> | HTMLElement, I[]>\n | Array<ReactDragAndDropConfig<RefObject<E | null> | HTMLElement, I[]>>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, state, ...rest } = dnd;\n\n handleReactElements(parent, handleParent(rest, state));\n });\n}\n\n/**\n * Hook for adding drag and drop/sortable support to a list of items.\n *\n * @param list - Initial list of data.\n * @param options - The drag and drop configuration.\n * @returns\n */\nexport function useDragAndDrop<E extends HTMLElement, T = unknown>(\n list: T[],\n options: Partial<ParentConfig<T>> = {}\n): [\n RefObject<E>,\n T[],\n Dispatch<SetStateAction<T[]>>,\n (config: Partial<ParentConfig<T>>) => void\n] {\n const parent: RefObject<E> = useRef<E>(null);\n\n const [values, setValues] = useState(list);\n\n function updateConfig(config: Partial<ParentConfig<T>> = {}) {\n dragAndDrop({ parent, state: [values, setValues], ...config });\n }\n\n useEffect(() => {\n dragAndDrop({ parent, state: [values, setValues], ...options });\n }, [values]);\n\n useEffect(() => {\n return () => {\n if (parent.current) tearDown(parent.current);\n };\n }, []);\n\n return [parent, values, setValues, updateConfig];\n}\n","import type { RefObject } from \"react\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl<E>(\n parent: HTMLElement | RefObject<E | null>\n): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (\"current\" in parent && parent.current instanceof HTMLElement)\n return parent.current;\n else {\n console.warn(\"Invalid parent element\", parent);\n\n return;\n }\n}\n\nexport function handleReactElements<E>(\n element: HTMLElement | RefObject<E | null>,\n cb: (el: HTMLElement) => void\n): void {\n const el = getEl(element);\n\n if (el) cb(el);\n}\n"],"mappings":";AAGA,SAAS,QAAQ,WAAW,gBAAgB;AAC5C,SAAS,eAAe,YAAY,WAAW,gBAAgB;;;ACGxD,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,aAAa,UAAU,OAAO,mBAAmB;AACxD,WAAO,OAAO;AAAA,OACX;AACH,YAAQ,KAAK,0BAA0B,MAAM;AAE7C;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,IACM;AACN,QAAM,KAAK,MAAM,OAAO;AAExB,MAAI,GAAI,IAAG,EAAE;AACf;;;ADhBA,IAAM,eAGF,oBAAI,QAAQ;AAEhB,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,UAAU,WAA2B,QAA2B;AACvE,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,OAAQ,QAAO,CAAC,EAAE,SAAS;AAE/B,eAAa,IAAI,QAAQ,CAAC,WAAW,OAAQ,CAAC,CAAC,CAAC;AAClD;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,eAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAQO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,MACA,UAAoC,CAAC,GAMrC;AACA,QAAM,SAAuB,OAAU,IAAI;AAE3C,QAAM,CAAC,QAAQA,UAAS,IAAI,SAAS,IAAI;AAEzC,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EAC/D;AAEA,YAAU,MAAM;AACd,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EAChE,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,OAAO,QAAS,UAAS,OAAO,OAAO;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,QAAQ,QAAQA,YAAW,YAAY;AACjD;","names":["setValues"]}