packages feed

Shpadoinkle-disembodied-0.0.0.1: Shpadoinkle/Disembodied/Sample.hs

{-# LANGUAGE CPP               #-}
{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications  #-}
{-# LANGUAGE TypeOperators     #-}
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}


module Shpadoinkle.Disembodied.Sample where


import           Data.Text               (Text)
import           Servant.API

import           Shpadoinkle             (Html, JSM, MonadJSM, text)
import           Shpadoinkle.Disembodied (Disembodied (SiteSpec), writeSite)
import           Shpadoinkle.Html        (button, h1_, onClick)
import           Shpadoinkle.Router      (View)


type Pages m
  = "about" :> View m Int
  :<|> View m ()


newtype Context = Context
  { siteName :: Text }


about :: MonadJSM m => Context -> Html m Int
about ctx =
  h1_ [ text $ "about us at " <> siteName ctx
      , button
        [ onClick (+ 1) ]
        [ "Increment" ]
      ]


home :: Html m a
home = h1_ [ "home" ]


site :: MonadJSM m => SiteSpec Context (Pages m)
site = about :<|> const home


makeSite :: IO ()
makeSite = writeSite @(Pages JSM) "" (Context "Sample") site