solid-dnd.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { useDragDropContext } from "@thisbeyond/solid-dnd"
  2. import { JSXElement } from "solid-js"
  3. import type { Transformer } from "@thisbeyond/solid-dnd"
  4. export const getDraggableId = (event: unknown): string | undefined => {
  5. if (typeof event !== "object" || event === null) return undefined
  6. if (!("draggable" in event)) return undefined
  7. const draggable = (event as { draggable?: { id?: unknown } }).draggable
  8. if (!draggable) return undefined
  9. return typeof draggable.id === "string" ? draggable.id : undefined
  10. }
  11. export const ConstrainDragXAxis = (): JSXElement => {
  12. const context = useDragDropContext()
  13. if (!context) return <></>
  14. const [, { onDragStart, onDragEnd, addTransformer, removeTransformer }] = context
  15. const transformer: Transformer = {
  16. id: "constrain-x-axis",
  17. order: 100,
  18. callback: (transform) => ({ ...transform, x: 0 }),
  19. }
  20. onDragStart((event) => {
  21. const id = getDraggableId(event)
  22. if (!id) return
  23. addTransformer("draggables", id, transformer)
  24. })
  25. onDragEnd((event) => {
  26. const id = getDraggableId(event)
  27. if (!id) return
  28. removeTransformer("draggables", id, transformer.id)
  29. })
  30. return <></>
  31. }
  32. export const ConstrainDragYAxis = (): JSXElement => {
  33. const context = useDragDropContext()
  34. if (!context) return <></>
  35. const [, { onDragStart, onDragEnd, addTransformer, removeTransformer }] = context
  36. const transformer: Transformer = {
  37. id: "constrain-y-axis",
  38. order: 100,
  39. callback: (transform) => ({ ...transform, y: 0 }),
  40. }
  41. onDragStart((event) => {
  42. const id = getDraggableId(event)
  43. if (!id) return
  44. addTransformer("draggables", id, transformer)
  45. })
  46. onDragEnd((event) => {
  47. const id = getDraggableId(event)
  48. if (!id) return
  49. removeTransformer("draggables", id, transformer.id)
  50. })
  51. return <></>
  52. }