packages feed

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 = [] }