@@ -6,18 +6,19 @@ import Data.Array as Array
6import Data.FoldableWithIndex (findWithIndex)
6import Data.FoldableWithIndex (findWithIndex)
7import Data.Lens (set)
7import Data.Lens (set)
8import Data.Lens.Index (ix)
8import Data.Lens.Index (ix)
9−import Data.Maybe (Maybe(..), fromMaybe, isJust)
9+import Data.Maybe (Maybe(..), fromMaybe)
10import Data.Nullable (Nullable)
10import Data.Nullable (Nullable)
11import Data.Nullable as Nullable
11import Data.Nullable as Nullable
12import Data.Traversable (for, sequence)
12import Data.Traversable (for, sequence)
13import Data.Tuple.Nested ((/\), type (/\))
13import Data.Tuple.Nested ((/\), type (/\))
14import Debug.Trace (spy)
14import Debug.Trace (spy)
15import Effect (Effect)
15import Effect (Effect)
16+import Effect.Aff (Milliseconds(..), delay, launchAff_)
16import Justifill (justifill)
17import Justifill (justifill)
17import React.Basic (ReactComponent)
18import React.Basic (ReactComponent)
18import React.Basic.DOM (css)
19import React.Basic.DOM (css)
19import React.Basic.Helpers (jsx)
20import React.Basic.Helpers (jsx)
20−import React.Basic.Hooks (Ref, component, element, readRef, useLayoutEffect, useRef, writeRef)
21+import React.Basic.Hooks (Ref, component, element, readRef, useEffect, useRef, writeRef)
21import React.Basic.Hooks as React
22import React.Basic.Hooks as React
22import React.Basic.Hooks.Spring (animatedDiv, useSprings)
23import React.Basic.Hooks.Spring (animatedDiv, useSprings)
23import React.Basic.Hooks.UseGesture (useDrag, withDragProps)
24import React.Basic.Hooks.UseGesture (useDrag, withDragProps)
@@ -30,6 +31,7 @@ import Yoga.Grid.Component as Grid
30import Yoga.Grimoire.Spell.Component as GrimoireSpell
31import Yoga.Grimoire.Spell.Component as GrimoireSpell
31import Yoga.Grimoire.Styles (styles)
32import Yoga.Grimoire.Styles (styles)
32import Yoga.Helpers ((?||))
33import Yoga.Helpers ((?||))
34+import Yoga.Resize.Hook (useResize)
33import Yoga.Spell.Types (Spell)
35import Yoga.Spell.Types (Spell)
34import Yoga.Theme.Styles (makeStylesJSS, useTheme)
36import Yoga.Theme.Styles (makeStylesJSS, useTheme)
35import Yoga.Theme.Types (CSSTheme)
37import Yoga.Theme.Types (CSSTheme)
@@ -83,14 +85,28 @@ makeComponent = do
83 nodeRefs <- useRef (props.spells $> (Nullable.null ∷ (_ Node)))
85 nodeRefs <- useRef (props.spells $> (Nullable.null ∷ (_ Node)))
84 positionsRef <- useRef ([] ∷ _ DOMRect)
86 positionsRef <- useRef ([] ∷ _ DOMRect)
85 originalPositionsRef <- useRef ([] ∷ _ DOMRect)
87 originalPositionsRef <- useRef ([] ∷ _ DOMRect)
86− useLayoutEffect unit do
88+ initialisedRef <- useRef false
89+ windowSize <- useResize
92+ initialised <- readRef initialisedRef
93+ unless initialised do
87− rects <- getRects nodeRefs
94+ rects <- getRects nodeRefs
88− writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
95+ writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
89− writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
96+ writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
97+ writeRef initialisedRef true
98+ useEffect windowSize do
99+ writeRef initialisedRef false
100+ positions <- readRef positionsRef
102+ newOriginalPositions = positions
103+ writeRef positionsRef newOriginalPositions
91 theme ∷ CSSTheme <- useTheme
106 theme ∷ CSSTheme <- useTheme
92 bindDragProps <-
107 bindDragProps <-
93− useDrag (justifill {}) \{ arg, down, movement: mx /\ my, xy: x /\ y } -> do
108+ useDrag (justifill {}) \{ arg, down, movement: mx /\ my } -> do
94 rects <- getRects nodeRefs
110 rects <- getRects nodeRefs
95 originalPositions <- readRef originalPositionsRef
111 originalPositions <- readRef originalPositionsRef
96 positionsBefore <- readRef positionsRef
112 positionsBefore <- readRef positionsRef
@@ -101,7 +117,10 @@ makeComponent = do
102 overlapsOtherBefore = positionsBefore # findWithIndex \i' pos -> i' /= arg && overlaps currentPosDraggedBefore pos
118 overlapsOtherBefore = positionsBefore # findWithIndex \i' pos -> i' /= arg && overlaps currentPosDraggedBefore pos
103 case down, overlapsOtherBefore of
119 case down, overlapsOtherBefore of
120+ false, Just { index, value } -> do
104− false, Just { index, value } -> writeRef positionsRef (swap arg index positionsBefore ?|| positionsBefore)
122+ swapped = swap arg index positionsBefore ?|| positionsBefore
123+ writeRef positionsRef swapped
105 _, _ -> mempty
124 _, _ -> mempty
106 positions <- readRef positionsRef
125 positions <- readRef positionsRef
@@ -121,9 +140,27 @@ makeComponent = do
121 topOffset = if iPos == origIPos then 0.0 else iPos.top - origIPos.top
140 topOffset = if iPos == origIPos then 0.0 else iPos.top - origIPos.top
122 case i == arg, down, overlapsOther of
141 case i == arg, down, overlapsOther of
123 false, true, Just { index, value }
142 false, true, Just { index, value }
124− | index == i -> { x: originalPosDragged.left - value.left + leftOffset, y: originalPosDragged.top - value.top + topOffset, zIndex: 0, transform: "scale3d(1.0, 1.0, 1.0)", immediate: const false }
144+ { x: originalPosDragged.left - value.left + leftOffset
145+ , y: originalPosDragged.top - value.top + topOffset
147+ , transform: "scale3d(1.0, 1.0, 1.0)"
148+ , immediate: const false
151+ { x: mx + leftOffset
125− true, true, _ -> { x: mx + leftOffset, y: my + topOffset, zIndex: 1, transform: "scale3d(1.1, 1.1, 1.1)", immediate: \n -> n == "x" || n == "y" || n == "zIndex" }
154+ , transform: "scale3d(1.1, 1.1, 1.1)"
155+ , immediate: \n -> n == "x" || n == "y" || n == "zIndex"
126− _, _, _ -> { x: leftOffset, y: topOffset, zIndex: 0, transform: "scale3d(1.0, 1.0, 1.0)", immediate: const false }
161+ , transform: "scale3d(1.0, 1.0, 1.0)"
162+ , immediate: const false
128 renderSpells =
165 renderSpells =
129 mapWithIndex \i (spell /\ style) ->
166 mapWithIndex \i (spell /\ style) ->