-----------------------------------------------------------------------------
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.Native.X.Element.Textarea.Method
-- 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.Textarea.Method
  ( -- *** Methods
    focus
  , blur
  , setValue
  , setSelectionRange
  , getValue
    -- *** Types
  , TextareaValue (..)
  ) where
-----------------------------------------------------------------------------
import Miso hiding (focus, blur, setValue, setSelectionRange)
import Miso.Native.FFI (invokeExec)
-----------------------------------------------------------------------------
-- | Result of calling 'getValue'.
data TextareaValue
  = TextareaValue
  { TextareaValue -> MisoString
value :: MisoString
    -- ^ The current input content
  , TextareaValue -> Int
selectionStart :: Int
    -- ^ Start position of the selection
  , TextareaValue -> Int
selectionEnd :: Int
    -- ^ End position of the selection
  , TextareaValue -> Bool
isComposing :: Bool
    -- ^ Whether the input is mid-composition (IME)
  } deriving (Int -> TextareaValue -> ShowS
[TextareaValue] -> ShowS
TextareaValue -> String
(Int -> TextareaValue -> ShowS)
-> (TextareaValue -> String)
-> ([TextareaValue] -> ShowS)
-> Show TextareaValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TextareaValue -> ShowS
showsPrec :: Int -> TextareaValue -> ShowS
$cshow :: TextareaValue -> String
show :: TextareaValue -> String
$cshowList :: [TextareaValue] -> ShowS
showList :: [TextareaValue] -> ShowS
Show, TextareaValue -> TextareaValue -> Bool
(TextareaValue -> TextareaValue -> Bool)
-> (TextareaValue -> TextareaValue -> Bool) -> Eq TextareaValue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TextareaValue -> TextareaValue -> Bool
== :: TextareaValue -> TextareaValue -> Bool
$c/= :: TextareaValue -> TextareaValue -> Bool
/= :: TextareaValue -> TextareaValue -> Bool
Eq)
-----------------------------------------------------------------------------
instance FromJSVal TextareaValue where
  fromJSVal :: JSVal -> IO (Maybe TextareaValue)
fromJSVal JSVal
o = do
    let readProp :: MisoString -> IO b
readProp MisoString
name = JSVal -> IO b
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO b) -> IO JSVal -> IO b
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< JSVal
o JSVal -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! (MisoString
name :: MisoString)
    value          <- MisoString -> IO MisoString
forall {b}. FromJSVal b => MisoString -> IO b
readProp MisoString
"value"
    selectionStart <- readProp "selectionStart"
    selectionEnd   <- readProp "selectionEnd"
    isComposing    <- readProp "isComposing"
    pure $ Just TextareaValue {..}
-----------------------------------------------------------------------------
-- | Params object for 'setValue'.
newtype SetValue = SetValue MisoString
-----------------------------------------------------------------------------
instance ToJSVal SetValue where
  toJSVal :: SetValue -> IO JSVal
toJSVal (SetValue MisoString
v) = do
    o <- IO Object
create
    set "value" v o
    toJSVal o
-----------------------------------------------------------------------------
-- | Params object for 'setSelectionRange'.
data SetSelectionRange = SetSelectionRange Int Int
-----------------------------------------------------------------------------
instance ToJSVal SetSelectionRange where
  toJSVal :: SetSelectionRange -> IO JSVal
toJSVal (SetSelectionRange Int
s Int
e) = do
    o <- IO Object
create
    set "selectionStart" s o
    set "selectionEnd" e o
    toJSVal o
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/textarea.html#focus
--
-- Requests focus for the selected \<textarea\>.
--
focus
  :: MisoString
  -> action
  -> (MisoString -> action)
  -> Effect context props model action
focus :: forall action context props model.
MisoString
-> action
-> (MisoString -> action)
-> Effect context props model action
focus MisoString
selector action
action = MisoString
-> MisoString
-> ()
-> (() -> action)
-> (MisoString -> action)
-> Effect context props model action
forall params argument action context props model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect context props model action
invokeExec MisoString
"focus" MisoString
selector () (\() -> action
action)
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/textarea.html#blur
--
-- Releases focus for the selected \<textarea\>.
--
blur
  :: MisoString
  -> action
  -> (MisoString -> action)
  -> Effect context props model action
blur :: forall action context props model.
MisoString
-> action
-> (MisoString -> action)
-> Effect context props model action
blur MisoString
selector action
action = MisoString
-> MisoString
-> ()
-> (() -> action)
-> (MisoString -> action)
-> Effect context props model action
forall params argument action context props model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect context props model action
invokeExec MisoString
"blur" MisoString
selector () (\() -> action
action)
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/textarea.html#setvalue
--
-- Sets the input content of the selected \<textarea\>.
--
setValue
  :: MisoString
  -> MisoString
  -> action
  -> (MisoString -> action)
  -> Effect context props model action
setValue :: forall action context props model.
MisoString
-> MisoString
-> action
-> (MisoString -> action)
-> Effect context props model action
setValue MisoString
selector MisoString
v action
action =
  MisoString
-> MisoString
-> SetValue
-> (() -> action)
-> (MisoString -> action)
-> Effect context props model action
forall params argument action context props model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect context props model action
invokeExec MisoString
"setValue" MisoString
selector (MisoString -> SetValue
SetValue MisoString
v) (\() -> action
action)
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/textarea.html#setselectionrange
--
-- Sets the selection range of the selected \<textarea\>.
--
setSelectionRange
  :: MisoString
  -> Int
  -> Int
  -> action
  -> (MisoString -> action)
  -> Effect context props model action
setSelectionRange :: forall action context props model.
MisoString
-> Int
-> Int
-> action
-> (MisoString -> action)
-> Effect context props model action
setSelectionRange MisoString
selector Int
s Int
e action
action =
  MisoString
-> MisoString
-> SetSelectionRange
-> (() -> action)
-> (MisoString -> action)
-> Effect context props model action
forall params argument action context props model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect context props model action
invokeExec MisoString
"setSelectionRange" MisoString
selector (Int -> Int -> SetSelectionRange
SetSelectionRange Int
s Int
e) (\() -> action
action)
-----------------------------------------------------------------------------
-- | https://lynxjs.org/api/elements/built-in/textarea.html#getvalue
--
-- Retrieves the current value (and selection) of the selected \<textarea\>.
--
getValue
  :: MisoString
  -> (TextareaValue -> action)
  -> (MisoString -> action)
  -> Effect context props model action
getValue :: forall action context props model.
MisoString
-> (TextareaValue -> action)
-> (MisoString -> action)
-> Effect context props model action
getValue MisoString
selector = MisoString
-> MisoString
-> ()
-> (TextareaValue -> action)
-> (MisoString -> action)
-> Effect context props model action
forall params argument action context props model.
(ToJSVal params, FromJSVal argument) =>
MisoString
-> MisoString
-> params
-> (argument -> action)
-> (MisoString -> action)
-> Effect context props model action
invokeExec MisoString
"getValue" MisoString
selector ()
-----------------------------------------------------------------------------