module Hypermedia.Datastar.ExecuteScript where
import Data.Text (Text)
import Data.Text qualified as T
import Hypermedia.Datastar.Types
data ExecuteScript = ExecuteScript
{ ExecuteScript -> Text
esScript :: Text
, ExecuteScript -> Bool
esAutoRemove :: Bool
, ExecuteScript -> [Text]
esAttributes :: [Text]
, ExecuteScript -> Maybe Text
esEventId :: Maybe Text
, ExecuteScript -> Int
esRetryDuration :: Int
}
deriving (ExecuteScript -> ExecuteScript -> Bool
(ExecuteScript -> ExecuteScript -> Bool)
-> (ExecuteScript -> ExecuteScript -> Bool) -> Eq ExecuteScript
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ExecuteScript -> ExecuteScript -> Bool
== :: ExecuteScript -> ExecuteScript -> Bool
$c/= :: ExecuteScript -> ExecuteScript -> Bool
/= :: ExecuteScript -> ExecuteScript -> Bool
Eq, Int -> ExecuteScript -> ShowS
[ExecuteScript] -> ShowS
ExecuteScript -> String
(Int -> ExecuteScript -> ShowS)
-> (ExecuteScript -> String)
-> ([ExecuteScript] -> ShowS)
-> Show ExecuteScript
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ExecuteScript -> ShowS
showsPrec :: Int -> ExecuteScript -> ShowS
$cshow :: ExecuteScript -> String
show :: ExecuteScript -> String
$cshowList :: [ExecuteScript] -> ShowS
showList :: [ExecuteScript] -> ShowS
Show)
executeScript :: Text -> ExecuteScript
executeScript :: Text -> ExecuteScript
executeScript Text
js =
ExecuteScript
{ esScript :: Text
esScript = Text
js
, esAutoRemove :: Bool
esAutoRemove = Bool
defaultAutoRemove
, esAttributes :: [Text]
esAttributes = []
, esEventId :: Maybe Text
esEventId = Maybe Text
forall a. Maybe a
Nothing
, esRetryDuration :: Int
esRetryDuration = Int
defaultRetryDuration
}
toDatastarEvent :: ExecuteScript -> DatastarEvent
toDatastarEvent :: ExecuteScript -> DatastarEvent
toDatastarEvent ExecuteScript
es =
DatastarEvent
{ eventType :: EventType
eventType = EventType
EventPatchElements
, eventId :: Maybe Text
eventId = ExecuteScript -> Maybe Text
esEventId ExecuteScript
es
, retry :: Int
retry = ExecuteScript -> Int
esRetryDuration ExecuteScript
es
, dataLines :: [Text]
dataLines =
[ Text
"selector body"
, Text
"mode append"
]
[Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<> ExecuteScript -> [Text]
buildScriptLines ExecuteScript
es
}
buildScriptLines :: ExecuteScript -> [Text]
buildScriptLines :: ExecuteScript -> [Text]
buildScriptLines ExecuteScript
es =
case Text -> [Text]
T.lines (ExecuteScript -> Text
esScript ExecuteScript
es) of
[] -> [Text
"elements " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
openTag Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
closeTag]
[Text
single] -> [Text
"elements " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
openTag Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
single Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
closeTag]
[Text]
multiple ->
[Text
"elements " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
openTag]
[Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<> (Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text
"elements " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) [Text]
multiple
[Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<> [Text
"elements " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
closeTag]
where
openTag :: Text
openTag :: Text
openTag =
Text
"<script"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (if ExecuteScript -> Bool
esAutoRemove ExecuteScript
es then Text
" data-effect=\"el.remove()\"" else Text
"")
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (Text -> Text) -> [Text] -> Text
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Text
" " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (ExecuteScript -> [Text]
esAttributes ExecuteScript
es)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
">"
closeTag :: Text
closeTag :: Text
closeTag = Text
"</script>"