on master help sign in
obelisk-run: switch to using `mainwidgetwithhead`

This allows obelisk apps to specify a custom <head> content, which is useful to include arbitrary CSS (such as semantic-ui) and such. The skeleton example is updated to use this feature; it only adds a <title> element to the head section.

commit38f5c7ae891efa7de3461a3ef3dd9cae4777d5c8 authorSridhar Ratnakumar <srid@srid.ca> dateFri 18 May 2018, 20:23 (8 years ago) parentc87d93d
2 files changed+21−16
lib/run/src/Obelisk/Run.hs+11−8 skeleton/frontend/src/Frontend.hs+10−8
lib/run/src/Obelisk/Run.hs+11−8
@@ -5,7 +5,7 @@ module Obelisk.Run where
55
66import Control.Concurrent
77import Control.Exception
8−import Control.Lens ((^?), _Right, _Just)
8+import Control.Lens ((^?), _Just, _Right)
99import qualified Data.Attoparsec.ByteString.Char8 as A
1010import Data.ByteString (ByteString)
1111import qualified Data.ByteString.Char8 as BSC
@@ -14,15 +14,15 @@ import Data.Maybe
1414import Data.Semigroup ((<>))
1515import Data.Streaming.Network (bindPortTCP)
1616import qualified Data.Text as T
17−import Language.Javascript.JSaddle.WebSockets
1817import Language.Javascript.JSaddle.Run (syncPoint)
19−import Network.HTTP.Client (defaultManagerSettings, newManager, Manager)
18+import Language.Javascript.JSaddle.WebSockets
19+import Network.HTTP.Client (Manager, defaultManagerSettings, newManager)
2020import qualified Network.HTTP.ReverseProxy as RP
2121import Network.Socket
2222import Network.Wai (Application)
2323import Network.Wai.Handler.Warp
24+import Network.Wai.Handler.Warp.Internal (settingsHost, settingsPort)
2425import Network.WebSockets.Connection (defaultConnectionOptions)
25−import Network.Wai.Handler.Warp.Internal (settingsPort, settingsHost)
2626import Obelisk.ExecutableConfig (get)
2727import Reflex.Dom.Core
2828import System.Environment
@@ -34,7 +34,7 @@ import Text.URI.Lens
3434
3535run :: Int -- ^ Port to run the backend
3636 -> IO () -- ^ Backend
37− -> Widget () () -- ^ Frontend widget
37+ -> (Widget () (), Widget () ()) -- ^ Frontend widget (head, body)
3838 -> IO ()
3939run port backend frontend = do
4040 let handleBackendErr (_ :: SomeException) = hPutStrLn stderr "backend stopped; make a change to your code to reload"
@@ -52,8 +52,8 @@ getConfigRoute = do
5252defAppUri :: URI
5353defAppUri = fromMaybe (error "defAppUri") $ URI.mkURI "http://127.0.0.1:8000"
5454
55−runWidget :: RunConfig -> Widget () () -> IO ()
56−runWidget conf w = do
55+runWidget :: RunConfig -> (Widget () (), Widget () ()) -> IO ()
56+runWidget conf (h, b) = do
5757 uri <- fromMaybe defAppUri <$> getConfigRoute
5858 let port = fromIntegral $ fromMaybe 80 $ uri ^? uriAuthority . _Right . authPort . _Just
5959 redirectHost = _runConfig_redirectHost conf
@@ -66,7 +66,10 @@ runWidget conf w = do
6666 close
6767 (\skt -> do
6868 man <- newManager defaultManagerSettings
69− app <- jsaddleWithAppOr defaultConnectionOptions (mainWidget' w >> syncPoint) (fallbackProxy redirectHost redirectPort man)
69+ app <- jsaddleWithAppOr
70+ defaultConnectionOptions
71+ (mainWidgetWithHead' (const h, const b) >> syncPoint)
72+ (fallbackProxy redirectHost redirectPort man)
7073 runSettingsSocket settings skt app)
7174
7275-- | like 'bindPortTCP' but reconnects on exception
skeleton/frontend/src/Frontend.hs+10−8
@@ -1,18 +1,20 @@
1+{-# LANGUAGE DataKinds #-}
12{-# LANGUAGE OverloadedStrings #-}
23{-# LANGUAGE TypeApplications #-}
3−{-# LANGUAGE DataKinds #-}
44module Frontend where
55
66import Reflex.Dom
77
88import qualified Data.Text as T
99
10−import Static
1110import Common.Api
11+import Static
1212
13−frontend :: Widget x ()
14−frontend = do
15− text "Welcome to Obelisk!"
16− el "p" $ text $ T.pack commonStuff
17− elAttr "img" ("src" =: static @"obelisk.jpg") blank
18−
13+frontend :: (Widget x (), Widget x ())
14+frontend = (head', body)
15+ where
16+ head' = el "title" $ text "Obelisk Minimal Example"
17+ body = do
18+ text "Welcome to Obelisk!"
19+ el "p" $ text $ T.pack commonStuff
20+ elAttr "img" ("src" =: static @"obelisk.jpg") blank