@@ -0,0 +1,82 @@
1+{-# LANGUAGE ConstraintKinds #-}
2+{-# LANGUAGE FlexibleContexts #-}
3+{-# LANGUAGE DataKinds #-}
4+{-# LANGUAGE LambdaCase #-}
5+{-# LANGUAGE OverloadedStrings #-}
6+{-# LANGUAGE RecursiveDo #-}
7+{-# LANGUAGE TemplateHaskell #-}
8+{-# LANGUAGE TypeApplications #-}
11+import Data.Text (Text)
12+import Obelisk.Frontend
14+import Reflex.Dom.Core
15+import Control.Monad.Fix (MonadFix)
16+import Language.Javascript.JSaddle (MonadJSM)
20+import Obelisk.Generated.Static
22+type AppWidget js t m =
32+type FrontendWidget js t m =
35+ , MonadJSM (Performable m)
36+ , HasJSContext (Performable m)
39+data State = NotStarted | Loading | Loaded (Maybe Text)
41+urlInput :: AppWidget js t m => m (Dynamic t State)
43+ inputEl <- el "label" $ do
46+ click <- button "shorten"
47+ let url = tagPromptlyDyn (_inputElement_value inputEl) click
50+ ((decodeXhrResponse <$>) <$> (performRequestAsync $ shortenRequest <$> url))
51+ let requestEv = switchDyn request
53+ leftmost [Loading <$ click, Loaded <$> requestEv]
55+createShortLinkRoute :: Text
56+createShortLinkRoute = renderBackendRoute checkedFullRouteEncoder $ BackendRoute_Shorten :/ ()
58+shortenRequest :: Text -> XhrRequest Text
59+shortenRequest s = postJson createShortLinkRoute (ShortenRequest s)
61+createdLink :: AppWidget js t m => State -> m ()
64+ Loading -> text "loading"
65+ Loaded a -> case a of
66+ Nothing -> text "Error"
69+app :: AppWidget js t m => m ()
72+ _ <- dyn $ createdLink <$> state
75+frontend :: Frontend (R FrontendRoute)
77+ { _frontend_head = do
78+ el "title" $ text "Url Shortener"
79+ elAttr "link" ("rel" =: "stylesheet" <> "href" =: static @"style.css") blank
80+ , _frontend_body = do