Use project listing functionality to check for whether we have a cookie.
[?]
Aug 18, 2020, 4:49 AM
WRPIYG3EUHZR6N6T74ZXZDXATRMIRLXAQ24UNUNSVTVYGMT2VDSQCDependencies
- [2]
BFZN4SUAMake timeline component work. - [3]
NJNMO72SAdd zcash.com submodule and update client to modern halogen. - [4]
JXG3FCXYUpgrade ps + halogen versions. - [5]
HO2PFRABClient login now handles response correctly. - [6]
TKGBRIQTLogin component now raises LoginComplete message. - [7]
TUA4HMUDUse real API capability for login. - [8]
3LMXT7Z6preventDefault on login form submission. - [9]
ARX7SHY5Begin work on login UI. - [10]
EA5BFM5GSplit Login component into its own module. - [*]
RB2ETNIFAdd skeletal PureScript client project.
Change contents
- edit in client/package-lock.json at line 5855
},"purty": {"version": "6.2.0","resolved": "https://registry.npmjs.org/purty/-/purty-6.2.0.tgz","integrity": "sha512-JfT8kJHSyxuOFQtRiH2x55SiPxXZsSdedQlZap8JehQ7KzB49B5C9cWwVybtSB36BdADQcxPvtw8D52z4EPnBw==","dev": true - edit in client/package-lock.json at line 7242
"uuid-validate": {"version": "0.0.3","resolved": "https://registry.npmjs.org/uuid-validate/-/uuid-validate-0.0.3.tgz","integrity": "sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w=="}, - replacement in client/package.json at line 6
"spago": "^0.15.3""spago": "^0.15.3","uuid-validate": "^0.0.3" - edit in client/package.json at line 15
},"dependencies": {"uuid-validate": "0.0.3" - edit in client/spago.dhall at line 10
, "uuid", "js-date" - replacement in client/src/Aftok/Login.purs at line 50
data LoginComplete = LoginCompletenewtype LoginComplete = LoginComplete { username :: String } - edit in client/src/Aftok/Login.purs at line 72
- replacement in client/src/Aftok/Login.purs at line 169
OK -> H.raise LoginCompleteOK -> H.raise (LoginComplete { username: user }) - file addition: Project.purs[3.1]
module Aftok.Project whereimport Preludeimport Control.Monad.Trans.Class (lift)import Control.Monad.Except.Trans (ExceptT, runExceptT, except)import Control.Monad.Error.Class (throwError)import Data.Argonaut.Core (Json)import Data.Argonaut.Decode (class DecodeJson, decodeJson, (.:))import Data.Bifunctor (lmap)import Data.DateTime (DateTime)import Data.JSDate as JSDateimport Data.Either (Either(..), note)-- import Data.HTTP.Method (Method(POST))import Data.Maybe (Maybe(..))import Data.Traversable (traverse)import Data.UUID (UUID, parseUUID)import Effect (Effect)import Effect.Aff (Aff)import Effect.Class (liftEffect)import Affjax (get, printError)import Affjax.StatusCode (StatusCode(..))import Affjax.ResponseFormat as RF-- import Halogen as H-- import Halogen.HTML.Core (ClassName(..))-- import Halogen.HTML as HH-- import Halogen.HTML.CSS as CSS-- import Halogen.HTML.Events as E-- import Web.Event.Event as WE-- import Halogen.HTML.Properties as Pnewtype Project' date = Project'{ projectName :: String, inceptionDate :: date, initiator :: UUID}type Project = Project' DateTimetype Capability m ={ listProjects :: m (Either APIError (Array Project))}data APIError= Forbidden| ParseFailure Json String| Error { status :: Maybe StatusCode, message :: String }instance decodeJsonProject :: DecodeJson (Project' String) wheredecodeJson json = dox <- decodeJson jsonprojectName <- x .: "projectName"inceptionDate <- x .: "inceptionDate"initiatorStr <- x .: "initiator"initiator <- note "Failed to decode initiator UUID" $ parseUUID initiatorStrpure $ Project' { projectName, inceptionDate, initiator }listProjects :: Aff (Either APIError (Array Project))listProjects = doresult <- get RF.json "/api/projects"liftEffect <<< runExceptT $ case result ofLeft err -> throwError $ Error { status: Nothing, message: printError err }Right r -> case r.status ofStatusCode 403 ->throwError ForbiddenStatusCode 200 -> dorecords <- except $ lmap (ParseFailure r.body) (decodeJson r.body)traverse parseProject recordsother ->throwError $ Error { status: Just other, message: r.statusText }parseProject :: Json -> ExceptT APIError Effect ProjectparseProject json = doProject' p <- except <<< lmap (ParseFailure json) $ decodeJson jsonjsDate <- lift $ JSDate.parse p.inceptionDatepdate <- except $ note (ParseFailure json "Could not parse inception date")(JSDate.toDateTime jsDate)pure $ Project' (p { inceptionDate = pdate })apiCapability :: Capability AffapiCapability = { listProjects }mockCapability :: forall m. Applicative m => Capability mmockCapability = { listProjects: pure (Right []) } - edit in client/src/Aftok/Timeline.purs at line 12
import Data.Int (toNumber) - replacement in client/src/Aftok/Timeline.purs at line 122
endOfDay = adjust (Days (toNumber 1)) startOfDayendOfDay = adjust (Days 1.0) startOfDay - replacement in client/src/Aftok/Timeline.purs at line 155
let px5 = px (toNumber 5)let px5 = px 5.0 - replacement in client/src/Aftok/Timeline.purs at line 158
border solid (px $ toNumber 3) (rgb 0x00 0xFF 0x00)height (px $ toNumber 50)border solid (px 3.0) (rgb 0x00 0xFF 0x00)height (px 50.0) - replacement in client/src/Aftok/Timeline.purs at line 175
px5 = px (toNumber 5)toPct n = pct (toNumber 100 * n / maxWidth)px5 = px (5.0)toPct n = pct (100.0 * n / maxWidth) - replacement in client/src/Aftok/Timeline.purs at line 181
height (px $ toNumber 44)height (px $ 44.0) - replacement in client/src/Aftok/Timeline.purs at line 191
Aff.delay $ Aff.Milliseconds 1000.0Aff.delay $ Aff.Milliseconds 10000.0 - edit in client/src/Main.purs at line 4
import Control.Monad.Trans.Class (lift) - replacement in client/src/Main.purs at line 7
import Data.Int (toNumber)import Data.Either (Either(..)) - edit in client/src/Main.purs at line 21
import Aftok.Project as Project - replacement in client/src/Main.purs at line 30[2.1658]→[2.1658:1693](∅→∅),[3.578]→[3.307936:307956](∅→∅),[2.1693]→[3.307936:307956](∅→∅),[3.307936]→[3.307936:307956](∅→∅)
let c = component login timelinerunUI c unit bodyproject = Project.apiCapabilitymainc = component login timeline projectrunUI mainc unit body - replacement in client/src/Main.purs at line 39
= LoginComplete Login.LoginComplete= Initialize| LoginComplete Login.LoginComplete - edit in client/src/Main.purs at line 54
-> Project.Capability Aff - replacement in client/src/Main.purs at line 56
component loginCap tlCap = H.mkComponentcomponent loginCap tlCap pCap = H.mkComponent - replacement in client/src/Main.purs at line 59
, eval: H.mkEval $ H.defaultEval { handleAction = eval }, eval: H.mkEval $ H.defaultEval{ handleAction = eval, initialize = Just Initialize} - edit in client/src/Main.purs at line 64
- replacement in client/src/Main.purs at line 72
HH.div_ [ HH.slot _timeline unit (Timeline.component tlCap { width: toNumber 600 }) unit absurd ]HH.div_ [ HH.slot _timeline unit (Timeline.component tlCap { width: 600.0 }) unit absurd ] - replacement in client/src/Main.purs at line 76
LoginComplete _ -> H.put LoggedIn[3.309026]Initialize -> doprojects <- lift pCap.listProjectscase projects ofLeft err -> H.put LoggedOutRight _ -> H.put LoggedInLoginComplete (Login.LoginComplete xs) ->H.put LoggedIn