-----------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE RecordWildCards     #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.Lynx.Element.List.Method
-- Copyright   :  (C) 2016-2025 David M. Johnson
-- License     :  BSD3-style (see the file LICENSE)
-- Maintainer  :  David M. Johnson <code@dmj.io>
-- Stability   :  experimental
-- Portability :  non-portable
----------------------------------------------------------------------------
module Miso.Lynx.Element.List.Method
  ( -- *** Methods
    scrollToPosition
  , autoScroll
  , getVisibleCells
  , scrollBy
  -- *** Types
  , ScrollToPosition (..)
  , AutoScroll (..)
  , ScrollBy (..)
  -- *** Smart constructors
  , defaultScrollToPosition
  , defaultAutoScroll
  , defaultScrollBy
  ) where
-----------------------------------------------------------------------------
import Language.Javascript.JSaddle
-----------------------------------------------------------------------------
import Miso
import Miso.Lynx.FFI
-----------------------------------------------------------------------------
data ScrollToPosition
  = ScrollToPosition
  { ScrollToPosition -> Double
position :: Double
  -- ^ Specifies the index of the node to scroll to, with a range of [0, data source count)
  , ScrollToPosition -> Double
offset :: Double
  -- ^ After applying alignTo alignment, continue scrolling the offset length
  , ScrollToPosition -> MisoString
alignTo :: MisoString
  -- ^ The position of the target node in the view after scrolling. 
  , ScrollToPosition -> Bool
smooth :: Bool
  -- ^ Whether there is animation during the scrolling process
  } deriving (Int -> ScrollToPosition -> ShowS
[ScrollToPosition] -> ShowS
ScrollToPosition -> String
(Int -> ScrollToPosition -> ShowS)
-> (ScrollToPosition -> String)
-> ([ScrollToPosition] -> ShowS)
-> Show ScrollToPosition
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ScrollToPosition -> ShowS
showsPrec :: Int -> ScrollToPosition -> ShowS
$cshow :: ScrollToPosition -> String
show :: ScrollToPosition -> String
$cshowList :: [ScrollToPosition] -> ShowS
showList :: [ScrollToPosition] -> ShowS
Show, ScrollToPosition -> ScrollToPosition -> Bool
(ScrollToPosition -> ScrollToPosition -> Bool)
-> (ScrollToPosition -> ScrollToPosition -> Bool)
-> Eq ScrollToPosition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ScrollToPosition -> ScrollToPosition -> Bool
== :: ScrollToPosition -> ScrollToPosition -> Bool
$c/= :: ScrollToPosition -> ScrollToPosition -> Bool
/= :: ScrollToPosition -> ScrollToPosition -> Bool
Eq)
-----------------------------------------------------------------------------
-- | Smart constructor for constructing 'scrollToPosition'
defaultScrollToPosition :: ScrollToPosition
defaultScrollToPosition :: ScrollToPosition
defaultScrollToPosition
  = ScrollToPosition
  { position :: Double
position = Double
10
  , offset :: Double
offset = Double
100
  , alignTo :: MisoString
alignTo = MisoString
"top"
  , smooth :: Bool
smooth = Bool
True
  }
-----------------------------------------------------------------------------
instance ToJSVal ScrollToPosition where
  toJSVal :: ScrollToPosition -> JSM JSVal
toJSVal ScrollToPosition {Bool
Double
MisoString
position :: ScrollToPosition -> Double
offset :: ScrollToPosition -> Double
alignTo :: ScrollToPosition -> MisoString
smooth :: ScrollToPosition -> Bool
position :: Double
offset :: Double
alignTo :: MisoString
smooth :: Bool
..} = do
    object <- JSM Object
create
    set "position" position object
    set "offset" offset object
    set "alignTo" alignTo object
    set "smooth" smooth object
    toJSVal object 
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/list.html#scrolltoposition
--
-- The front end can execute 'boundingClientRect' through the SelectorQuery API.
--
-- @
--
-- data Action
--   = Success MisoString
--   | Failure MisoString
--   | GetRect
--
-- update :: Action -> Effect parent model Action
-- update GetRect =
--   scrollToPosition defaultscrollToPosition "#box" Success Failure
-- update (Succes _) =
--   consoleLog "Successfuly got position"
-- update (Failure errorMsg) =
--   consoleLog ("Failed to call scrollToPosition: " <> errorMsg)
--
-- @
--
scrollToPosition
  :: MisoString
  -> ScrollToPosition
  -> (MisoString -> action)
  -> (MisoString -> action)
  -> Effect parent model action
scrollToPosition :: forall action parent model.
MisoString
-> ScrollToPosition
-> (MisoString -> action)
-> (MisoString -> action)
-> Effect parent model action
scrollToPosition = MisoString
-> MisoString
-> ScrollToPosition
-> (MisoString -> action)
-> (MisoString -> action)
-> Effect parent model action
forall params argument action parent model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect parent model action
invokeExec MisoString
"scrollToPosition"
--------------------------------------------------------------------
data AutoScroll
  = AutoScroll
  { AutoScroll -> MisoString
rate :: MisoString
  , AutoScroll -> Bool
start :: Bool
  , AutoScroll -> Bool
autoStop :: Bool
  }
--------------------------------------------------------------------
instance ToJSVal AutoScroll where
  toJSVal :: AutoScroll -> JSM JSVal
toJSVal AutoScroll {Bool
MisoString
rate :: AutoScroll -> MisoString
start :: AutoScroll -> Bool
autoStop :: AutoScroll -> Bool
rate :: MisoString
start :: Bool
autoStop :: Bool
..} = do
    o <- JSM Object
create
    set "rate" rate o
    set "start" start o
    set "autoStop" autoStop o
    toJSVal o
--------------------------------------------------------------------
defaultAutoScroll :: AutoScroll
defaultAutoScroll :: AutoScroll
defaultAutoScroll = AutoScroll
forall a. HasCallStack => a
undefined
--------------------------------------------------------------------
autoScroll
  :: MisoString
  -> AutoScroll
  -> (MisoString -> action)
  -> (MisoString -> action)
  -> Effect parent model action
autoScroll :: forall action parent model.
MisoString
-> AutoScroll
-> (MisoString -> action)
-> (MisoString -> action)
-> Effect parent model action
autoScroll = MisoString
-> MisoString
-> AutoScroll
-> (MisoString -> action)
-> (MisoString -> action)
-> Effect parent model action
forall params argument action parent model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect parent model action
invokeExec MisoString
"scrollToPosition"
--------------------------------------------------------------------
getVisibleCells
  :: MisoString
  -> (MisoString -> action)
  -> (MisoString -> action)
  -> Effect parent model action
getVisibleCells :: forall action parent model.
MisoString
-> (MisoString -> action)
-> (MisoString -> action)
-> Effect parent model action
getVisibleCells MisoString
name = MisoString
-> MisoString
-> ()
-> (MisoString -> action)
-> (MisoString -> action)
-> Effect parent model action
forall params argument action parent model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect parent model action
invokeExec MisoString
"getVisibleCells" MisoString
name ()
--------------------------------------------------------------------
data ScrollBy
  = ScrollBy
  { ScrollBy -> Double
scrollByOffset :: Double
  }
--------------------------------------------------------------------
instance ToJSVal ScrollBy where
  toJSVal :: ScrollBy -> JSM JSVal
toJSVal ScrollBy {Double
scrollByOffset :: ScrollBy -> Double
scrollByOffset :: Double
..} = do
    o <- JSM Object
create
    set "offset" scrollByOffset o 
    toJSVal o
--------------------------------------------------------------------
defaultScrollBy :: ScrollBy
defaultScrollBy :: ScrollBy
defaultScrollBy = Double -> ScrollBy
ScrollBy Double
0
--------------------------------------------------------------------
scrollBy
  :: MisoString
  -> ScrollBy
  -> (Consumed -> action)
  -> (MisoString -> action)
  -> Effect parent model action
scrollBy :: forall action parent model.
MisoString
-> ScrollBy
-> (Consumed -> action)
-> (MisoString -> action)
-> Effect parent model action
scrollBy = MisoString
-> MisoString
-> ScrollBy
-> (Consumed -> action)
-> (MisoString -> action)
-> Effect parent model action
forall params argument action parent model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect parent model action
invokeExec MisoString
"scrollBy"
--------------------------------------------------------------------
data Consumed
  = Consumed
  { Consumed -> Double
consumedX, Consumed -> Double
consumedY :: Double
  , Consumed -> Double
unconsumedX, Consumed -> Double
unconsumedY :: Double
  } deriving (Consumed -> Consumed -> Bool
(Consumed -> Consumed -> Bool)
-> (Consumed -> Consumed -> Bool) -> Eq Consumed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Consumed -> Consumed -> Bool
== :: Consumed -> Consumed -> Bool
$c/= :: Consumed -> Consumed -> Bool
/= :: Consumed -> Consumed -> Bool
Eq, Int -> Consumed -> ShowS
[Consumed] -> ShowS
Consumed -> String
(Int -> Consumed -> ShowS)
-> (Consumed -> String) -> ([Consumed] -> ShowS) -> Show Consumed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Consumed -> ShowS
showsPrec :: Int -> Consumed -> ShowS
$cshow :: Consumed -> String
show :: Consumed -> String
$cshowList :: [Consumed] -> ShowS
showList :: [Consumed] -> ShowS
Show)
--------------------------------------------------------------------
instance FromJSVal Consumed where
  fromJSVal :: JSVal -> JSM (Maybe Consumed)
fromJSVal JSVal
o = do
    consumedX <- JSVal -> JSM Double
forall a. FromJSVal a => JSVal -> JSM a
fromJSValUnchecked (JSVal -> JSM Double) -> JSM JSVal -> JSM Double
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal
o JSVal -> MisoString -> JSM JSVal
forall this name.
(MakeObject this, ToJSString name) =>
this -> name -> JSM JSVal
! (MisoString
"consumedX" :: MisoString)
    consumedY <- fromJSValUnchecked =<< o ! ("consumedY" :: MisoString)
    unconsumedX <- fromJSValUnchecked =<< o ! ("unconsumedX" :: MisoString)
    unconsumedY <- fromJSValUnchecked =<< o ! ("unconsumedY" :: MisoString)
    pure $ Just Consumed {..}
--------------------------------------------------------------------