54 lines
1.6 KiB
Plaintext
54 lines
1.6 KiB
Plaintext
module Main where
|
|
|
|
import App.Layout (Action(PageView), State, view, update)
|
|
import App.Routes (match)
|
|
import Control.Bind ((=<<))
|
|
import Control.Monad.Eff (Eff)
|
|
import DOM (DOM)
|
|
import Network.HTTP.Affjax (AJAX)
|
|
import Prelude (bind, pure)
|
|
import Pux (renderToDOM, renderToString, App, Config, CoreEffects, start)
|
|
import Pux.Devtool (Action, start) as Pux.Devtool
|
|
import Pux.Router (sampleUrl)
|
|
import Signal ((~>))
|
|
|
|
type AppEffects = (dom :: DOM, ajax :: AJAX)
|
|
|
|
-- | App configuration
|
|
config :: forall eff. State -> Eff (dom :: DOM | eff) (Config State Action AppEffects)
|
|
config state = do
|
|
-- | Create a signal of URL changes.
|
|
urlSignal <- sampleUrl
|
|
|
|
-- | Map a signal of URL changes to PageView actions.
|
|
let routeSignal = urlSignal ~> \r -> PageView (match r)
|
|
|
|
pure
|
|
{ initialState: state
|
|
, update: update
|
|
, view: view
|
|
, inputs: [routeSignal] }
|
|
|
|
-- | Entry point for the browser.
|
|
main :: State -> Eff (CoreEffects AppEffects) (App State Action)
|
|
main state = do
|
|
app <- start =<< config state
|
|
renderToDOM "#app" app.html
|
|
-- | Used by hot-reloading code in support/index.js
|
|
pure app
|
|
|
|
-- | Entry point for the browser with pux-devtool injected.
|
|
debug :: State -> Eff (CoreEffects AppEffects) (App State (Pux.Devtool.Action Action))
|
|
debug state = do
|
|
app <- Pux.Devtool.start =<< config state
|
|
renderToDOM "#app" app.html
|
|
-- | Used by hot-reloading code in support/index.js
|
|
pure app
|
|
|
|
-- | Entry point for server side rendering
|
|
ssr :: State -> Eff (CoreEffects AppEffects) String
|
|
ssr state = do
|
|
app <- start =<< config state
|
|
res <- renderToString app.html
|
|
pure res
|