packages feed

hyperbole-0.3.5: example/Example/Simple.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}

module Example.Simple where

import Data.Text (Text)
import Web.Hyperbole


main = do
  run 3000 $ do
    liveApp (basicDocument "Example") (page simplePage)


simplePage :: (Hyperbole :> es) => Page es Response
simplePage = do
  handle message
  load $ do
    pure $ col (pad 20) $ do
      el bold "My Page"
      hyper (Message 1) $ messageView "Hello"
      hyper (Message 2) $ messageView "World!"


data Message = Message Int
  deriving (Generic, Param)


data MessageAction = Louder Text
  deriving (Generic, Param)


instance HyperView Message where
  type Action Message = MessageAction


message :: Message -> MessageAction -> Eff es (View Message ())
message _ (Louder m) = do
  let new = m <> "!"
  pure $ messageView new


messageView m = do
  el_ $ text m
  button (Louder m) (border 1) "Louder"