@@ -6,18 +6,42 @@ import Data.Maybe (Maybe)
66import Data.Nullable (Nullable, toMaybe)
77import Effect.Uncurried (EffectFn1, runEffectFn1)
88import Foreign (Foreign)
9+import Foreign.Object (Object)
10+import Foreign.Object as Object
11+import Prim.Row (class Union)
912import React.Basic (Ref)
1013import React.Basic.Events (EventFn, EventHandler, SyntheticEvent, unsafeEventFn)
1114import React.Basic.Hooks (Hook, JSX, ReactComponent, unsafeHook)
15+import Record.Builder as Builder
16+import Type.Prelude (Proxy(..))
1217import Unsafe.Coerce (unsafeCoerce)
1318import Web.DOM (Node)
1419
15−foreign import dndContext ∷
16− ReactComponent
17− { children ∷ Array JSX
18− , onDragEnd ∷ EventHandler
19− , modifiers ∷ Array Modifier
20− }
20+foreign import dndContextImpl ∷ ∀ props. ReactComponent { | props }
21+
22+type DndContextProps =
23+ ( children ∷ Array JSX
24+ , onDragEnd ∷ EventHandler
25+ , modifiers ∷ Array Modifier
26+ , sensors ∷ ∀ a. Array (SensorDescriptor a)
27+ , collisionDetection ∷ CollisionDetection
28+ -- , onDragStart: ?(event: DragStartEvent): void
29+ -- , onDragMove?(event: DragMoveEvent): void
30+ -- , onDragOver?(event: DragOverEvent): void
31+ -- , onDragEnd?(event: DragEndEvent): void
32+ -- , onDragCancel?(): void
33+ )
34+
35+foreign import data CollisionDetection ∷ Type
36+
37+foreign import closestCenter ∷ CollisionDetection
38+
39+foreign import closestCorners ∷ CollisionDetection
40+
41+foreign import data SensorDescriptor ∷ Type -> Type
42+
43+dndContext ∷ ∀ p q. Union p q DndContextProps => ReactComponent { | p }
44+dndContext = dndContextImpl
2145
2246active ∷ EventFn SyntheticEvent Draggable
2347active = unsafeEventFn \e -> (unsafeCoerce e).active
@@ -28,16 +52,21 @@ over = unsafeEventFn \e -> toMaybe (unsafeCoerce e).over
2852type Draggable =
2953 { id ∷ String }
3054
55+type SortableContextProps =
56+ ( children ∷ Array JSX
57+ , items ∷ Array String
58+ )
59+
3160-- | `items` is the sorted array of the unique ids associated to each sortable item
32−foreign import sortableContext ∷
33− ReactComponent
34− { children ∷ Array JSX
35− , items ∷ Array String
36− }
61+foreign import sortableContextImpl ∷ ∀ props. ReactComponent { | props }
62+
63+sortableContext ∷ ∀ p q. Union p q SortableContextProps => ReactComponent { | p }
64+sortableContext = sortableContextImpl
3765
3866useSortable ∷ SortableArgs -> Hook (UseSortable SortableArgs) SortableResult
3967useSortable args =
40− unsafeHook
68+ map toSortableResult
69+ $ unsafeHook
4170 $ runEffectFn1 useSortableImpl args
4271
4372foreign import data UseSortable ∷ Type -> Type -> Type
@@ -45,13 +74,13 @@ foreign import data UseSortable ∷ Type -> Type -> Type
4574foreign import useSortableImpl ∷
4675 EffectFn1
4776 SortableArgs
48− SortableResult
77+ SortableResultImpl
4978
5079type SortableArgs =
5180 { id ∷ String
5281 }
5382
54−type SortableResult =
83+type SortableResultImpl =
5584 { attributes ∷
5685 { "aria-describedby" ∷ String
5786 , "aria-pressed" ∷ String
@@ -68,6 +97,42 @@ type SortableResult =
6897 , transition ∷ Foreign
6998 }
7099
100+type SortableResult =
101+ { attributes ∷
102+ { _aria ∷ Object String
103+ , role ∷ String
104+ , tabIndex ∷ Int
105+ }
106+ , listeners ∷
107+ { onKeyDown ∷ EventHandler
108+ , onPointerDown ∷ EventHandler
109+ }
110+ , setNodeRef ∷ Ref (Nullable Node)
111+ , transform ∷ Foreign
112+ , transition ∷ Foreign
113+ }
114+
115+toSortableResult ∷ SortableResultImpl -> SortableResult
116+toSortableResult sri =
117+ Builder.build
118+ ( Builder.modify (Proxy ∷ _ "attributes")
119+ ( Builder.build
120+ ( Builder.delete
121+ (Proxy ∷ _ "aria-describedby")
122+ <<< Builder.delete (Proxy ∷ _ "aria-pressed")
123+ <<< Builder.delete (Proxy ∷ _ "aria-roledescription")
124+ <<< Builder.insert (Proxy ∷ _ "_aria")
125+ ( Object.fromHomogeneous
126+ { describedby: sri.attributes."aria-describedby"
127+ , pressed: sri.attributes."aria-pressed"
128+ , roledescription: sri.attributes."aria-roledescription"
129+ }
130+ )
131+ )
132+ )
133+ )
134+ sri
135+
71136foreign import data Modifier ∷ Type
72137
73138foreign import restrictToHorizontalAxis ∷ Modifier