packages feed

web-page-0.2.0: test/Test.hs

-- |
-- Module:     Main
-- Copyright:  (c) 2014 Ertugrul Soeylemez
-- License:    BSD3
-- Maintainer: Ertugrul Soeylemez <ertesx@gmx.de>

module Main where

import qualified Text.Blaze.Html5 as H
import Clay hiding ((!))
import Control.Monad.State
import Data.Text (Text)
import Language.Javascript.JMacro
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp
import System.IO
import Text.Blaze.Html
import Web.Page
import Web.Page.GenId


myWidget :: (HasIdStream a, MonadState a m, MonadWidget Text Html m) => m ()
myWidget = do
    setTitle "Test page"

    myId <- newId

    addBody $
        H.h1 "My example page" <>
        H.p "My boring paragraph." ! domId myId

    addStyle $ idSel myId ? do
        background white
        color black

    addStyle $ idSel myId # ".groovy" ? do
        background darkblue
        color pink
        fontWeight bold

    addScriptLink "static/jquery.js"
    addScript [jmacro|
        fun init ->
            window.setTimeout
                (\() {
                    $("#" + `myId`).addClass("groovy");
                    $(".groovy").text("My grooooooovy paragraph!") })
                1000;

        $(init) |]


handler :: Application
handler req k | pathInfo req == ["static", "jquery.js"] = do
    let ctype = (hContentType, "text/javascript; charset=UTF-8")
    k (responseFile ok200 [ctype] "static/jquery.js" Nothing)

handler req k = do
    let w = execWriter (evalStateT myWidget (idsFrom ['a'..'z']))
        p = realiseInline (renderWidget (titleMajor ": ") w)

        hdrs = [(hContentType, "text/html; charset=UTF-8")]

    k (responseBuilder ok200 hdrs p)


main :: IO ()
main =
    run 8000 handler