git.iko.soy/rowtype-yoga/psfp
on d78b06e help sign in
34 lines 1.1 kB history raw
1module Scroll.Hook where
3import Prelude
5import Data.Newtype (class Newtype)
6import Effect (Effect)
7import React.Basic.Hooks (Hook, UseLayoutEffect, UseState, coerceHook, useLayoutEffect, useState, (/\))
8import React.Basic.Hooks as React
9import Scroll.Listener as Scroll
10import Unsafe.Coerce (unsafeCoerce)
11import Web.Event.EventTarget (EventListener, eventListener)
12import Web.HTML (window)
14newtype UseScrollYPosition hooks
15 = UseScrollYPosition (UseLayoutEffect Unit (UseState Number hooks))
17derive instance ntUseScrollYPosition ∷ Newtype (UseScrollYPosition hooks) _
19useScrollYPosition ∷ Hook UseScrollYPosition Number
20useScrollYPosition =
21 coerceHook React.do
22 scrollY /\ modifyScrollY <- useState 0.0
23 let setScrollY = modifyScrollY <<< const
24 useLayoutEffect unit do
25 listener <- makeListener setScrollY
26 Scroll.registerListener listener
27 pure scrollY
29makeListener ∷ (Number -> Effect Unit) -> Effect EventListener
30makeListener setPosition = do
31 eventListener $ const do
32 win <- window
33 let yPos = (unsafeCoerce win).scrollY
34 setPosition yPos