Skip to content

Commit 6ddde79

Browse files
authored
Use componentFromHook to create scrollObserver (#118)
1 parent 92aaebe commit 6ddde79

File tree

5 files changed

+40
-12
lines changed

5 files changed

+40
-12
lines changed

bower.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"purescript-random": "^4.0.0",
3232
"purescript-react-basic": "^13.0.0",
3333
"purescript-react-basic-emotion": "^4.0.0",
34-
"purescript-react-basic-hooks": "^4.0.0",
34+
"purescript-react-basic-hooks": "^4.1.0",
3535
"purescript-react-dnd-basic": "^6.1.4",
3636
"purescript-record": ">= 1.0.0 < 3.0.0",
3737
"purescript-simple-json": ">=4.0.0 <7.0.0",

src/Lumi/Components.purs

+33-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
module Lumi.Components where
1+
module Lumi.Components
2+
( LumiProps
3+
, PropsModifier
4+
, propsModifier
5+
, LumiComponent
6+
, lumiComponent
7+
, lumiComponentFromHook
8+
, lumiElement
9+
) where
210

311
import Prelude
412
import Data.String (toLower)
513
import Effect (Effect)
614
import Lumi.Styles.Theme (LumiTheme)
715
import Prim.Row (class Lacks)
816
import React.Basic.Emotion as Emotion
9-
import React.Basic.Hooks (JSX, ReactComponent, Render, component, element)
17+
import React.Basic.Hooks (JSX, ReactComponent, Render, component, componentFromHook, element)
1018
import Record.Unsafe.Union (unsafeUnion)
1119

1220
type LumiProps props
@@ -46,9 +54,31 @@ lumiComponent name defaults render = do
4654
{ name
4755
, component: c
4856
, defaults
49-
, className: "lumi-component lumi-" <> toLower name
57+
, className: lumiComponentClassName name
5058
}
5159

60+
lumiComponentFromHook ::
61+
forall hooks props r.
62+
Lacks "children" props =>
63+
Lacks "key" props =>
64+
Lacks "ref" props =>
65+
String ->
66+
{ render :: r -> JSX | props } ->
67+
(LumiProps ( render :: r -> JSX | props ) -> Render Unit hooks r) ->
68+
Effect (LumiComponent ( render :: r -> JSX | props ))
69+
lumiComponentFromHook name defaults propsToHook = do
70+
c <- componentFromHook name propsToHook
71+
pure
72+
$ LumiComponent
73+
{ name
74+
, component: c
75+
, defaults
76+
, className: lumiComponentClassName name
77+
}
78+
79+
lumiComponentClassName :: String -> String
80+
lumiComponentClassName name = "lumi-component lumi-" <> toLower name
81+
5282
-- | Render a `LumiComponent`. Similar to `React.Basic.element`, except the second argument
5383
-- | is an update function rather than a plain record for props. This helps reduce
5484
-- | the surface area for API updates:

src/Lumi/Components/Styles.purs

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ globals = jss
103103
, margin: "0"
104104
}
105105
, "react-basic-ref":
106-
{ display: "block"
106+
{ display: "flex"
107107
, minHeight: "0"
108108
, minWidth: "0"
109109
}

src/Lumi/Components/Table.purs

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ table = make component
268268
renderLumiTable self columns \tableRef ->
269269
[ lumiElement scrollObserver _
270270
{ node = Nullable.notNull tableRef
271-
, content = \{ hasScrolledY, hasScrolledX } ->
271+
, render = \{ hasScrolledY, hasScrolledX } ->
272272
R.table
273273
{ className:
274274
let

src/Lumi/Components2/ScrollObserver.purs

+4-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Data.Nullable (Nullable)
66
import Data.Nullable as Nullable
77
import Effect (Effect)
88
import Effect.Unsafe (unsafePerformEffect)
9-
import Lumi.Components (LumiComponent, lumiComponent)
9+
import Lumi.Components (LumiComponent, lumiComponentFromHook)
1010
import React.Basic (JSX)
1111
import React.Basic.Hooks (Hook, UnsafeReference(..), UseEffect, UseState, coerceHook, useEffect, useState, (/\))
1212
import React.Basic.Hooks as React
@@ -43,17 +43,15 @@ useScrollObserver root =
4343

4444
type ScrollObserverProps
4545
= ( node :: Nullable Node
46-
, content :: { hasScrolledX :: Boolean, hasScrolledY :: Boolean } -> JSX
46+
, render :: { hasScrolledX :: Boolean, hasScrolledY :: Boolean } -> JSX
4747
)
4848

4949
scrollObserver :: LumiComponent ScrollObserverProps
5050
scrollObserver =
5151
unsafePerformEffect do
52-
lumiComponent "ScrollObserver" defaults \props -> React.do
53-
hasScrolled <- useScrollObserver props.node
54-
pure $ props.content hasScrolled
52+
lumiComponentFromHook "ScrollObserver" defaults (useScrollObserver <<< _.node)
5553
where
56-
defaults = { node: Nullable.null, content: \_ -> mempty }
54+
defaults = { node: Nullable.null, render: \_ -> mempty }
5755

5856
foreign import getScrollParent :: Nullable Node -> Effect Element
5957

0 commit comments

Comments
 (0)