-----------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.Native.X.Element.Refresh.Event
-- Copyright   :  (C) 2016-2026 David M. Johnson
-- License     :  BSD3-style (see the file LICENSE)
-- Maintainer  :  David M. Johnson <code@dmj.io>
-- Stability   :  experimental
-- Portability :  non-portable
----------------------------------------------------------------------------
module Miso.Native.X.Element.Refresh.Event
  ( -- *** Events
    onHeaderOffset
  , onHeaderOffsetWith
  , onHeaderOffsetMain
  , onHeaderOffsetMainWith
  , onRefreshStateChange
  , onRefreshStateChangeWith
  , onRefreshStateChangeMain
  , onRefreshStateChangeMainWith
  , onStartRefresh
  , onStartRefreshWith
  , onStartRefreshMain
  , onStartRefreshMainWith
    -- *** Types
  , HeaderOffsetEvent (..)
  , RefreshStateChangeEvent (..)
  , StartRefreshEvent (..)
    -- *** Decoders
  , headerOffsetDecoder
  , refreshStateChangeDecoder
  , startRefreshDecoder
    -- *** Event Map
  , refreshEvents
  ) where
-----------------------------------------------------------------------------
import qualified Data.Map as M
-----------------------------------------------------------------------------
import           Miso.Event
import           Miso.JSON
import           Miso.String (MisoString)
import           Miso.Types (Attribute, EventHandler, DOMRef)
-----------------------------------------------------------------------------
refreshEvents :: Events
refreshEvents :: Events
refreshEvents
  = [(MisoString, Phase)] -> Events
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList
  [ (MisoString
"headeroffset", Phase
BUBBLE)
  , (MisoString
"refreshstatechange", Phase
BUBBLE)
  , (MisoString
"startrefresh", Phase
BUBBLE)
  ]
-----------------------------------------------------------------------------
-- | Payload of the @bindheaderoffset@ event.
data HeaderOffsetEvent
  = HeaderOffsetEvent
  { HeaderOffsetEvent -> Bool
isDragging :: Bool
    -- ^ Whether the \<refresh-header\> is being dragged
  , HeaderOffsetEvent -> Double
offsetPercent :: Double
    -- ^ Ratio of the pull-down distance to the header's own height
  } deriving (Int -> HeaderOffsetEvent -> ShowS
[HeaderOffsetEvent] -> ShowS
HeaderOffsetEvent -> String
(Int -> HeaderOffsetEvent -> ShowS)
-> (HeaderOffsetEvent -> String)
-> ([HeaderOffsetEvent] -> ShowS)
-> Show HeaderOffsetEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HeaderOffsetEvent -> ShowS
showsPrec :: Int -> HeaderOffsetEvent -> ShowS
$cshow :: HeaderOffsetEvent -> String
show :: HeaderOffsetEvent -> String
$cshowList :: [HeaderOffsetEvent] -> ShowS
showList :: [HeaderOffsetEvent] -> ShowS
Show, HeaderOffsetEvent -> HeaderOffsetEvent -> Bool
(HeaderOffsetEvent -> HeaderOffsetEvent -> Bool)
-> (HeaderOffsetEvent -> HeaderOffsetEvent -> Bool)
-> Eq HeaderOffsetEvent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: HeaderOffsetEvent -> HeaderOffsetEvent -> Bool
== :: HeaderOffsetEvent -> HeaderOffsetEvent -> Bool
$c/= :: HeaderOffsetEvent -> HeaderOffsetEvent -> Bool
/= :: HeaderOffsetEvent -> HeaderOffsetEvent -> Bool
Eq)
-----------------------------------------------------------------------------
-- | Payload of the @bindrefreshstatechange@ event.
newtype RefreshStateChangeEvent
  = RefreshStateChangeEvent
  { RefreshStateChangeEvent -> MisoString
state :: MisoString
    -- ^ The @RefreshState@ of the \<refresh-header\>
  } deriving (Int -> RefreshStateChangeEvent -> ShowS
[RefreshStateChangeEvent] -> ShowS
RefreshStateChangeEvent -> String
(Int -> RefreshStateChangeEvent -> ShowS)
-> (RefreshStateChangeEvent -> String)
-> ([RefreshStateChangeEvent] -> ShowS)
-> Show RefreshStateChangeEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RefreshStateChangeEvent -> ShowS
showsPrec :: Int -> RefreshStateChangeEvent -> ShowS
$cshow :: RefreshStateChangeEvent -> String
show :: RefreshStateChangeEvent -> String
$cshowList :: [RefreshStateChangeEvent] -> ShowS
showList :: [RefreshStateChangeEvent] -> ShowS
Show, RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool
(RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool)
-> (RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool)
-> Eq RefreshStateChangeEvent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool
== :: RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool
$c/= :: RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool
/= :: RefreshStateChangeEvent -> RefreshStateChangeEvent -> Bool
Eq)
-----------------------------------------------------------------------------
-- | Payload of the @bindstartrefresh@ event.
newtype StartRefreshEvent
  = StartRefreshEvent
  { StartRefreshEvent -> Bool
isManual :: Bool
    -- ^ Whether the @startrefresh@ event was triggered by a manual drag
  } deriving (Int -> StartRefreshEvent -> ShowS
[StartRefreshEvent] -> ShowS
StartRefreshEvent -> String
(Int -> StartRefreshEvent -> ShowS)
-> (StartRefreshEvent -> String)
-> ([StartRefreshEvent] -> ShowS)
-> Show StartRefreshEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> StartRefreshEvent -> ShowS
showsPrec :: Int -> StartRefreshEvent -> ShowS
$cshow :: StartRefreshEvent -> String
show :: StartRefreshEvent -> String
$cshowList :: [StartRefreshEvent] -> ShowS
showList :: [StartRefreshEvent] -> ShowS
Show, StartRefreshEvent -> StartRefreshEvent -> Bool
(StartRefreshEvent -> StartRefreshEvent -> Bool)
-> (StartRefreshEvent -> StartRefreshEvent -> Bool)
-> Eq StartRefreshEvent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: StartRefreshEvent -> StartRefreshEvent -> Bool
== :: StartRefreshEvent -> StartRefreshEvent -> Bool
$c/= :: StartRefreshEvent -> StartRefreshEvent -> Bool
/= :: StartRefreshEvent -> StartRefreshEvent -> Bool
Eq)
-----------------------------------------------------------------------------
headerOffsetDecoder :: Decoder HeaderOffsetEvent
headerOffsetDecoder :: Decoder HeaderOffsetEvent
headerOffsetDecoder = [MisoString
"detail"] [MisoString]
-> (Value -> Parser HeaderOffsetEvent) -> Decoder HeaderOffsetEvent
forall a. [MisoString] -> (Value -> Parser a) -> Decoder a
`at` Value -> Parser HeaderOffsetEvent
details
  where
    details :: Value -> Parser HeaderOffsetEvent
details = MisoString
-> (Object -> Parser HeaderOffsetEvent)
-> Value
-> Parser HeaderOffsetEvent
forall a. MisoString -> (Object -> Parser a) -> Value -> Parser a
withObject MisoString
"detail" ((Object -> Parser HeaderOffsetEvent)
 -> Value -> Parser HeaderOffsetEvent)
-> (Object -> Parser HeaderOffsetEvent)
-> Value
-> Parser HeaderOffsetEvent
forall a b. (a -> b) -> a -> b
$ \Object
o ->
      Bool -> Double -> HeaderOffsetEvent
HeaderOffsetEvent
        (Bool -> Double -> HeaderOffsetEvent)
-> Parser Bool -> Parser (Double -> HeaderOffsetEvent)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> MisoString -> Parser Bool
forall a. FromJSON a => Object -> MisoString -> Parser a
.: MisoString
"isDragging"
        Parser (Double -> HeaderOffsetEvent)
-> Parser Double -> Parser HeaderOffsetEvent
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> MisoString -> Parser Double
forall a. FromJSON a => Object -> MisoString -> Parser a
.: MisoString
"offsetPercent"
-----------------------------------------------------------------------------
refreshStateChangeDecoder :: Decoder RefreshStateChangeEvent
refreshStateChangeDecoder :: Decoder RefreshStateChangeEvent
refreshStateChangeDecoder = [MisoString
"detail"] [MisoString]
-> (Value -> Parser RefreshStateChangeEvent)
-> Decoder RefreshStateChangeEvent
forall a. [MisoString] -> (Value -> Parser a) -> Decoder a
`at` Value -> Parser RefreshStateChangeEvent
details
  where
    details :: Value -> Parser RefreshStateChangeEvent
details = MisoString
-> (Object -> Parser RefreshStateChangeEvent)
-> Value
-> Parser RefreshStateChangeEvent
forall a. MisoString -> (Object -> Parser a) -> Value -> Parser a
withObject MisoString
"detail" ((Object -> Parser RefreshStateChangeEvent)
 -> Value -> Parser RefreshStateChangeEvent)
-> (Object -> Parser RefreshStateChangeEvent)
-> Value
-> Parser RefreshStateChangeEvent
forall a b. (a -> b) -> a -> b
$ \Object
o ->
      MisoString -> RefreshStateChangeEvent
RefreshStateChangeEvent (MisoString -> RefreshStateChangeEvent)
-> Parser MisoString -> Parser RefreshStateChangeEvent
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> MisoString -> Parser MisoString
forall a. FromJSON a => Object -> MisoString -> Parser a
.: MisoString
"state"
-----------------------------------------------------------------------------
startRefreshDecoder :: Decoder StartRefreshEvent
startRefreshDecoder :: Decoder StartRefreshEvent
startRefreshDecoder = [MisoString
"detail"] [MisoString]
-> (Value -> Parser StartRefreshEvent) -> Decoder StartRefreshEvent
forall a. [MisoString] -> (Value -> Parser a) -> Decoder a
`at` Value -> Parser StartRefreshEvent
details
  where
    details :: Value -> Parser StartRefreshEvent
details = MisoString
-> (Object -> Parser StartRefreshEvent)
-> Value
-> Parser StartRefreshEvent
forall a. MisoString -> (Object -> Parser a) -> Value -> Parser a
withObject MisoString
"detail" ((Object -> Parser StartRefreshEvent)
 -> Value -> Parser StartRefreshEvent)
-> (Object -> Parser StartRefreshEvent)
-> Value
-> Parser StartRefreshEvent
forall a b. (a -> b) -> a -> b
$ \Object
o ->
      Bool -> StartRefreshEvent
StartRefreshEvent (Bool -> StartRefreshEvent)
-> Parser Bool -> Parser StartRefreshEvent
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> MisoString -> Parser Bool
forall a. FromJSON a => Object -> MisoString -> Parser a
.: MisoString
"isManual"
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/refresh.html#bindheaderoffset
--
-- Triggered during movement while the \<refresh-header\> is exposed.
--
onHeaderOffset :: (HeaderOffsetEvent -> action) -> Attribute model action
onHeaderOffset :: forall action model.
(HeaderOffsetEvent -> action) -> Attribute model action
onHeaderOffset HeaderOffsetEvent -> action
action = MisoString
-> Decoder HeaderOffsetEvent
-> (HeaderOffsetEvent -> model -> DOMRef -> action)
-> Attribute model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> Attribute model action
on MisoString
"headeroffset" Decoder HeaderOffsetEvent
headerOffsetDecoder (\HeaderOffsetEvent
e model
_ DOMRef
_ -> HeaderOffsetEvent -> action
action HeaderOffsetEvent
e)
-----------------------------------------------------------------------------
-- | Like 'onHeaderOffset', but dispatched on the Lynx __main thread__ ('MTS').
--
-- Runs imperatively on the MTS (no VDOM diff). Meant to be used with
-- @-XStaticPointers@.
--
-- @
-- data Action = Offset HeaderOffsetEvent
--
-- view_ [ event (static (onHeaderOffsetMain Offset)) ] [ "some view" ]
-- @
--
onHeaderOffsetMain :: (HeaderOffsetEvent -> action) -> EventHandler model action
onHeaderOffsetMain :: forall action model.
(HeaderOffsetEvent -> action) -> EventHandler model action
onHeaderOffsetMain HeaderOffsetEvent -> action
action = MisoString
-> Decoder HeaderOffsetEvent
-> (HeaderOffsetEvent -> model -> DOMRef -> action)
-> EventHandler model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> EventHandler model action
onMain MisoString
"headeroffset" Decoder HeaderOffsetEvent
headerOffsetDecoder (\HeaderOffsetEvent
e model
_ DOMRef
_ -> HeaderOffsetEvent -> action
action HeaderOffsetEvent
e)
-----------------------------------------------------------------------------
-- | Like 'onHeaderOffsetMain', but the handler also receives read-only access to
-- the @model@ and the target element's 'DOMRef' (for imperative MTS mutation).
--
-- @
-- data Action = Offset HeaderOffsetEvent Model DOMRef
--
-- view_ [ event (static (onHeaderOffsetMainWith Offset)) ] [ "some view" ]
-- @
--
onHeaderOffsetMainWith :: (HeaderOffsetEvent -> model -> DOMRef -> action) -> EventHandler model action
onHeaderOffsetMainWith :: forall model action.
(HeaderOffsetEvent -> model -> DOMRef -> action)
-> EventHandler model action
onHeaderOffsetMainWith HeaderOffsetEvent -> model -> DOMRef -> action
action = MisoString
-> Decoder HeaderOffsetEvent
-> (HeaderOffsetEvent -> model -> DOMRef -> action)
-> EventHandler model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> EventHandler model action
onMain MisoString
"headeroffset" Decoder HeaderOffsetEvent
headerOffsetDecoder HeaderOffsetEvent -> model -> DOMRef -> action
action
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/refresh.html#bindrefreshstatechange
--
-- Triggered when the \<refresh-header\> state changes.
--
onRefreshStateChange :: (RefreshStateChangeEvent -> action) -> Attribute model action
onRefreshStateChange :: forall action model.
(RefreshStateChangeEvent -> action) -> Attribute model action
onRefreshStateChange RefreshStateChangeEvent -> action
action = MisoString
-> Decoder RefreshStateChangeEvent
-> (RefreshStateChangeEvent -> model -> DOMRef -> action)
-> Attribute model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> Attribute model action
on MisoString
"refreshstatechange" Decoder RefreshStateChangeEvent
refreshStateChangeDecoder (\RefreshStateChangeEvent
e model
_ DOMRef
_ -> RefreshStateChangeEvent -> action
action RefreshStateChangeEvent
e)
-----------------------------------------------------------------------------
-- | Like 'onRefreshStateChange', but dispatched on the Lynx __main thread__ ('MTS').
--
-- Runs imperatively on the MTS (no VDOM diff). Meant to be used with
-- @-XStaticPointers@.
--
-- @
-- data Action = StateChanged RefreshStateChangeEvent
--
-- view_ [ event (static (onRefreshStateChangeMain StateChanged)) ] [ "some view" ]
-- @
--
onRefreshStateChangeMain :: (RefreshStateChangeEvent -> action) -> EventHandler model action
onRefreshStateChangeMain :: forall action model.
(RefreshStateChangeEvent -> action) -> EventHandler model action
onRefreshStateChangeMain RefreshStateChangeEvent -> action
action = MisoString
-> Decoder RefreshStateChangeEvent
-> (RefreshStateChangeEvent -> model -> DOMRef -> action)
-> EventHandler model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> EventHandler model action
onMain MisoString
"refreshstatechange" Decoder RefreshStateChangeEvent
refreshStateChangeDecoder (\RefreshStateChangeEvent
e model
_ DOMRef
_ -> RefreshStateChangeEvent -> action
action RefreshStateChangeEvent
e)
-----------------------------------------------------------------------------
-- | Like 'onRefreshStateChangeMain', but the handler also receives read-only
-- access to the @model@ and the target element's 'DOMRef' (for imperative MTS
-- mutation).
--
-- @
-- data Action = StateChanged RefreshStateChangeEvent Model DOMRef
--
-- view_ [ event (static (onRefreshStateChangeMainWith StateChanged)) ] [ "some view" ]
-- @
--
onRefreshStateChangeMainWith :: (RefreshStateChangeEvent -> model -> DOMRef -> action) -> EventHandler model action
onRefreshStateChangeMainWith :: forall model action.
(RefreshStateChangeEvent -> model -> DOMRef -> action)
-> EventHandler model action
onRefreshStateChangeMainWith RefreshStateChangeEvent -> model -> DOMRef -> action
action = MisoString
-> Decoder RefreshStateChangeEvent
-> (RefreshStateChangeEvent -> model -> DOMRef -> action)
-> EventHandler model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> EventHandler model action
onMain MisoString
"refreshstatechange" Decoder RefreshStateChangeEvent
refreshStateChangeDecoder RefreshStateChangeEvent -> model -> DOMRef -> action
action
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/refresh.html#bindstartrefresh
--
-- Triggered when the pull threshold is reached or @autoStartRefresh@ is called.
--
onStartRefresh :: (StartRefreshEvent -> action) -> Attribute model action
onStartRefresh :: forall action model.
(StartRefreshEvent -> action) -> Attribute model action
onStartRefresh StartRefreshEvent -> action
action = MisoString
-> Decoder StartRefreshEvent
-> (StartRefreshEvent -> model -> DOMRef -> action)
-> Attribute model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> Attribute model action
on MisoString
"startrefresh" Decoder StartRefreshEvent
startRefreshDecoder (\StartRefreshEvent
e model
_ DOMRef
_ -> StartRefreshEvent -> action
action StartRefreshEvent
e)
-----------------------------------------------------------------------------
-- | Like 'onStartRefresh', but dispatched on the Lynx __main thread__ ('MTS').
--
-- Runs imperatively on the MTS (no VDOM diff). Meant to be used with
-- @-XStaticPointers@.
--
-- @
-- data Action = Started StartRefreshEvent
--
-- view_ [ event (static (onStartRefreshMain Started)) ] [ "some view" ]
-- @
--
onStartRefreshMain :: (StartRefreshEvent -> action) -> EventHandler model action
onStartRefreshMain :: forall action model.
(StartRefreshEvent -> action) -> EventHandler model action
onStartRefreshMain StartRefreshEvent -> action
action = MisoString
-> Decoder StartRefreshEvent
-> (StartRefreshEvent -> model -> DOMRef -> action)
-> EventHandler model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> EventHandler model action
onMain MisoString
"startrefresh" Decoder StartRefreshEvent
startRefreshDecoder (\StartRefreshEvent
e model
_ DOMRef
_ -> StartRefreshEvent -> action
action StartRefreshEvent
e)
-----------------------------------------------------------------------------
-- | Like 'onStartRefreshMain', but the handler also receives read-only access to
-- the @model@ and the target element's 'DOMRef' (for imperative MTS mutation).
--
-- @
-- data Action = Started StartRefreshEvent Model DOMRef
--
-- view_ [ event (static (onStartRefreshMainWith Started)) ] [ "some view" ]
-- @
--
onStartRefreshMainWith :: (StartRefreshEvent -> model -> DOMRef -> action) -> EventHandler model action
onStartRefreshMainWith :: forall model action.
(StartRefreshEvent -> model -> DOMRef -> action)
-> EventHandler model action
onStartRefreshMainWith StartRefreshEvent -> model -> DOMRef -> action
action = MisoString
-> Decoder StartRefreshEvent
-> (StartRefreshEvent -> model -> DOMRef -> action)
-> EventHandler model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> EventHandler model action
onMain MisoString
"startrefresh" Decoder StartRefreshEvent
startRefreshDecoder StartRefreshEvent -> model -> DOMRef -> action
action
-----------------------------------------------------------------------------
-- | Like 'onHeaderOffset', but the handler also receives the target element's 'DOMRef'.
-- Use for main-thread ('MTS') handlers that imperatively mutate the element.
onHeaderOffsetWith :: (HeaderOffsetEvent -> DOMRef -> action) -> Attribute model action
onHeaderOffsetWith :: forall action model.
(HeaderOffsetEvent -> DOMRef -> action) -> Attribute model action
onHeaderOffsetWith HeaderOffsetEvent -> DOMRef -> action
action = MisoString
-> Decoder HeaderOffsetEvent
-> (HeaderOffsetEvent -> model -> DOMRef -> action)
-> Attribute model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> Attribute model action
on MisoString
"headeroffset" Decoder HeaderOffsetEvent
headerOffsetDecoder ((HeaderOffsetEvent -> model -> DOMRef -> action)
 -> Attribute model action)
-> (HeaderOffsetEvent -> model -> DOMRef -> action)
-> Attribute model action
forall a b. (a -> b) -> a -> b
$ \HeaderOffsetEvent
h model
_ DOMRef
domRef -> HeaderOffsetEvent -> DOMRef -> action
action HeaderOffsetEvent
h DOMRef
domRef
-----------------------------------------------------------------------------
-- | Like 'onRefreshStateChange', but the handler also receives the target element's 'DOMRef'.
-- Use for main-thread ('MTS') handlers that imperatively mutate the element.
onRefreshStateChangeWith :: (RefreshStateChangeEvent -> DOMRef -> action) -> Attribute model action
onRefreshStateChangeWith :: forall action model.
(RefreshStateChangeEvent -> DOMRef -> action)
-> Attribute model action
onRefreshStateChangeWith RefreshStateChangeEvent -> DOMRef -> action
action = MisoString
-> Decoder RefreshStateChangeEvent
-> (RefreshStateChangeEvent -> model -> DOMRef -> action)
-> Attribute model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> Attribute model action
on MisoString
"refreshstatechange" Decoder RefreshStateChangeEvent
refreshStateChangeDecoder ((RefreshStateChangeEvent -> model -> DOMRef -> action)
 -> Attribute model action)
-> (RefreshStateChangeEvent -> model -> DOMRef -> action)
-> Attribute model action
forall a b. (a -> b) -> a -> b
$ \RefreshStateChangeEvent
h model
_ DOMRef
domRef -> RefreshStateChangeEvent -> DOMRef -> action
action RefreshStateChangeEvent
h DOMRef
domRef
-----------------------------------------------------------------------------
-- | Like 'onStartRefresh', but the handler also receives the target element's 'DOMRef'.
-- Use for main-thread ('MTS') handlers that imperatively mutate the element.
onStartRefreshWith :: (StartRefreshEvent -> DOMRef -> action) -> Attribute model action
onStartRefreshWith :: forall action model.
(StartRefreshEvent -> DOMRef -> action) -> Attribute model action
onStartRefreshWith StartRefreshEvent -> DOMRef -> action
action = MisoString
-> Decoder StartRefreshEvent
-> (StartRefreshEvent -> model -> DOMRef -> action)
-> Attribute model action
forall result model action.
MisoString
-> Decoder result
-> (result -> model -> DOMRef -> action)
-> Attribute model action
on MisoString
"startrefresh" Decoder StartRefreshEvent
startRefreshDecoder ((StartRefreshEvent -> model -> DOMRef -> action)
 -> Attribute model action)
-> (StartRefreshEvent -> model -> DOMRef -> action)
-> Attribute model action
forall a b. (a -> b) -> a -> b
$ \StartRefreshEvent
h model
_ DOMRef
domRef -> StartRefreshEvent -> DOMRef -> action
action StartRefreshEvent
h DOMRef
domRef
-----------------------------------------------------------------------------