diff options
author | Ben Sima <ben@bsima.me> | 2020-04-15 09:54:10 -0700 |
---|---|---|
committer | Ben Sima <ben@bsima.me> | 2020-04-15 10:06:56 -0700 |
commit | f4b8c0df041b063c0b47d2ec6c818a9c202fd833 (patch) | |
tree | 01ad246a83fda29c079847b3397ca6509a7f6106 /Biz/Ibb/Move.hs | |
parent | 6ed475ca94209ce92e75f48764cb9d361029ea26 (diff) |
Re-namespacing
Moving away from the DNS-driven namespacing toward more condensed names,
mostly because I don't like typing so much.
Diffstat (limited to 'Biz/Ibb/Move.hs')
-rw-r--r-- | Biz/Ibb/Move.hs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/Biz/Ibb/Move.hs b/Biz/Ibb/Move.hs new file mode 100644 index 0000000..1e635ac --- /dev/null +++ b/Biz/Ibb/Move.hs @@ -0,0 +1,48 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE OverloadedStrings #-} + +-- | App update logic +module Biz.Ibb.Move + ( move + -- * Server interactions + , fetchPeople + ) +where + +import Alpha +import Biz.Ibb.Core as Core +import Network.RemoteData +import Data.Aeson +import JavaScript.Web.XMLHttpRequest ( Request(..) + , Method(GET) + , RequestData(NoData) + , contents + , xhrByteString + ) +import Miso +import Miso.String + +move :: Action -> Model -> Effect Action Model +move Nop m = noEff m +move (HandleRoute u) m = m { uri = u } <# pure Nop +move (ChangeRoute u) m = m <# do + pushURI u >> pure Nop +move FetchPeople m = m <# (SetPeople </ fetchPeople) +move (SetPeople ps) m = noEff m { people = ps } + +fetchPeople :: IO (WebData [Core.Person]) +fetchPeople = do + mjson <- contents </ xhrByteString req + case mjson of + Nothing -> pure $ Failure "could not read from server" + Just a -> + pure $ fromEither $ either (Left . ms) pure $ eitherDecodeStrict a + where + req = Request { reqMethod = GET + -- FIXME: can replace this hardcoding with a function? + , reqURI = "/api/people" + , reqLogin = Nothing + , reqHeaders = [] + , reqWithCredentials = False + , reqData = NoData + } |