Skip to content

Instantly share code, notes, and snippets.

@crappygraphix
Last active June 26, 2019 21:58
Show Gist options
  • Save crappygraphix/8e06cfc7c16c14e0d6bedca0406dddba to your computer and use it in GitHub Desktop.
Save crappygraphix/8e06cfc7c16c14e0d6bedca0406dddba to your computer and use it in GitHub Desktop.
Example of do some stuff before link redirect
{-# LANGUAGE CPP #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Monad ( void )
import Control.Monad.IO.Class ( liftIO )
import Data.Map as Map
import Data.Text as T
import Language.Javascript.JSaddle
-- import Lens.Micro.Platform
import Reflex.Dom
main :: IO ()
main = mainWidgetWithHead header body
header :: MonadWidget t m => m ()
header = do
(ev, fire) <- newTriggerEvent
liftIO $ fire ()
meta
dyEvMT <- widgetHold (return never) $ cssFile "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" <$ ev
_ <- widgetHold (return never) $ cssFile "https://fonts.googleapis.com/icon?family=Material+Icons" <$ switchPromptlyDyn dyEvMT
return ()
body :: MonadWidget t m => m ()
body = do
ev <- lynk "I'm a link"
ev' <- doStuff (traceEvent "I did stuff" ev)
performEvent_ (liftJSM goAway <$ ev')
lynk :: MonadWidget t m => Text -> m (Event t ())
lynk t = do
(l, _) <- elAttr' "a" (Map.fromList [("href","javascript:void(0);")]) $ text t
return $ domEvent Click l
doStuff :: MonadWidget t m => Event t () -> m (Event t ())
doStuff ev = do
evDec::(Event t (Maybe Text)) <- getAndDecode ("https://www.reddit.com/r/javascript.json" <$ ev)
return $ () <$ evDec
goAway :: JSM ()
goAway = void $ eval ("window.location.assign('https://www.w3schools.com')"::Text)
meta :: MonadWidget t m => m ()
meta = elAttr "meta" (Map.fromList [
("name", "viewport")
, ("content", "width=device-width,initial-scale=1")
, ("charset", "UTF-8")
]) $ return ()
cssFile :: MonadWidget t m => Text -> m (Event t ())
cssFile r = do
(e, _) <- elAttr' "link" (Map.fromList [
("rel", "stylesheet")
, ("type", "text/css")
, ("href", r)]) $ return ()
return $ domEvent Load e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment