front-0.0.0.8: src/Web/Front.hs
module Web.Front where
import Data.Text (Text)
import Bridge
import Text.Blaze.Front
import Text.Blaze.Front.Renderer
import qualified Data.Text as T
data ClientTaskType = OnlyHtml | OnlyEvents | BothHtmlEvents | None
deriving (Eq, Show)
-- | Generate message that will be pushed to client(s) based on underlying communication.
createTask
:: Show a
=> Text -- ^ DOM Element Id.
-> ClientTaskType -- ^ Type of task to execute on client.
-> (t -> Markup a) -- ^ How to render state.
-> t -- ^ State to render.
-> ClientTask a -- ^ Message that will be pushed to client(s).
createTask eid taskType renderer state = task
where rhtml = AttachText eid (T.pack . renderHtml $ markup)
markup = renderer state
(html, events) = case taskType of
OnlyHtml -> ([rhtml], mempty)
OnlyEvents -> ([], markup)
BothHtmlEvents -> ([rhtml], markup)
None -> ([], mempty)
task = ClientTask
{ executeRenderHtml = html
, executeAction = registerEvents events []
, executeScript = []
}
emptyTask :: ClientTask a
emptyTask = ClientTask { executeRenderHtml = [], executeAction = [], executeScript = [] }