Compare commits

..

No commits in common. "5efb2deab6bba3c7a9ed3c05b973bf564b44393a" and "ff231322c78aa0e191c67694b5257d516273260b" have entirely different histories.

2 changed files with 18 additions and 74 deletions

View File

@ -20,13 +20,9 @@ executable frontend
-- other-modules: -- other-modules:
-- other-extensions: -- other-extensions:
build-depends: base >=4.11 && <4.12 build-depends: base >=4.11 && <4.12
, common
, generic-lens
, jsaddle-warp
, lens
, miso , miso
, jsaddle-warp
, mtl , mtl
, servant , common
hs-source-dirs: src hs-source-dirs: src
default-language: Haskell2010 default-language: Haskell2010
ghc-options: -Wall

View File

@ -1,93 +1,41 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-} {-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE GADTs #-}
module Main where module Main where
import Control.Lens (over, set)
import Control.Monad.Trans (liftIO) import Control.Monad.Trans (liftIO)
import Data.Generics.Product
import GHC.Generics (Generic)
import Language.Javascript.JSaddle.Warp import Language.Javascript.JSaddle.Warp
import Miso hiding (set) import Miso
import Miso.String import Miso.String
import Servant.API
import Servant.Links
import Data.Proxy (Proxy(..))
type API = Home :<|> Login :<|> Register
type Home = View Action
type Login = "login" :> View Action
type Register = "register" :> View Action
data Action = Add data Action = Add
| Subtract | Subtract
| SayHello | SayHello
| HandleURI URI
| ChangeURI URI
| NoOp | NoOp
data Model = Model { counter :: Int newtype Model = Model Int deriving (Eq, Num, ToMisoString)
, uri :: URI }
deriving (Eq, Generic)
updateModel :: Model -> Action -> Effect Action Model updateModel :: Action -> Model -> Effect Action Model
updateModel m = \case updateModel Add m = noEff (m + 1)
Add -> noEff (over (field @"counter") (+1) m) updateModel Subtract m = noEff (m - 1)
Subtract -> noEff (over (field @"counter") (\x -> x - 1) m) updateModel SayHello m = m <# (liftIO (putStrLn "Hello world") >> pure NoOp)
SayHello -> m <# (liftIO (putStrLn "Hello world") >> pure NoOp) updateModel NoOp m = noEff m
HandleURI uri -> noEff (set (field @"uri") uri m)
ChangeURI uri -> m <# do
liftIO $ putStrLn $ "Pushing uri " <> show uri
pushURI uri
return $ HandleURI uri
NoOp -> noEff m
viewModel :: Model -> View Action viewModel :: Model -> View Action
viewModel model = view viewModel x =
where div_ [] [ button_ [ onClick Add ] [ text "+" ]
view = either (const the404) id $ runRoute @API Proxy handlers uri model , text (ms x)
handlers = home :<|> login :<|> register
home _ = div_ [] [ button_ [ onClick Add ] [ text "+" ]
, text (ms (counter model))
, button_ [ onClick Subtract ] [ text "-" ] , button_ [ onClick Subtract ] [ text "-" ]
, button_ [ onClick goLogin ] [ text "go login" ]
, button_ [ onClick goRegister ] [ text "go register" ]
] ]
login _ = div_ [] []
register _ = div_ [] [
h3_ [] [text "register"]
, label_ [] [text "Username"], input_ [id_ "username", name_ "username"]
, label_ [] [text "Email"], input_ [id_ "email", name_ "email"]
, label_ [] [text "Password"], input_ [id_ "password", name_ "password"]
, label_ [] [text "Password again"], input_ [id_ "passwordAgain", name_ "passwordAgain"]
, button_ [] [text "Register"]
]
the404 = div_ [] []
goLogin, goHome, goRegister :: Action
goLogin = goto @Login @API Proxy Proxy
goHome = goto @Home @API Proxy Proxy
goRegister = goto @Register @API Proxy Proxy
goto :: (IsElem endpoint api, HasLink endpoint, MkLink endpoint Link ~ Link) => Proxy api -> Proxy endpoint -> Action
goto a b = ChangeURI (linkURI (safeLink a b))
main :: IO () main :: IO ()
main = run 8081 $ do main = run 8081 $ startApp App{..}
model <- mkModel
startApp App{..}
where where
mkModel = Model <$> pure 0 <*> getCurrentURI model = Model 0
initialAction = SayHello initialAction = SayHello
update = flip updateModel update = updateModel
view = viewModel view = viewModel
subs = [ uriSub HandleURI ] subs = []
events = defaultEvents events = defaultEvents
mountPoint = Nothing mountPoint = Nothing