Autofill signup form from query string parameters.

[?]
Feb 9, 2021, 1:05 AM
I5MPORH45P3FYFJU4DINO2PW3YPIPGE2FYSSF4XUQ6WGKWWMSKZQC

Dependencies

  • [2] I4W76IFV Render recaptcha explicitly.
  • [3] DAPLYXHY Successfully rendering QR codes sometimes.
  • [4] QH4UB73N Format with purty.
  • [5] SAESJLLY Initial experiments in hash routing.
  • [6] 5R2Z7FSX Initial rendering for signup controls.
  • [7] QU5FW67R Add project selection to time tracker.
  • [8] QMEYU4MW Add display for prior intervals.
  • [9] N6FG4EW6 Working bootstrap modal! Only a little FFI.
  • [10] O2BZOX7M Add signup form, captcha check.
  • [11] U7YAT2ZK Add error reporting to signup form.
  • [12] V54JCKJX Payment request creation.
  • [*] NJNMO72S Add zcash.com submodule and update client to modern halogen.
  • [*] T2DN23M7 Factor out billing create component.
  • [*] EA5BFM5G Split Login component into its own module.
  • [*] RB2ETNIF Add skeletal PureScript client project.

Change contents

  • edit in client/spago.dhall at line 19
    [15.251]
    [15.251]
    , "uri"
  • edit in client/src/Aftok/HTML/QRious.js at line 1
    [3.1106]
    [3.1107]
    "use strict"
  • file addition: Navigation.purs (----------)
    [16.1]
    module Aftok.Navigation where
    import Prelude
    import Data.Either (Either)
    import Data.Lens (view)
    import Data.Maybe (Maybe)
    import URI.URI
    ( HierPath
    , Host
    , Path
    , Port
    , URIOptions
    , UserInfo
    , parser
    , _query
    )
    import URI.Extra.QueryPairs (QueryPairs, Key, Value)
    import URI.Extra.QueryPairs as QueryPairs
    import URI.Fragment (Fragment)
    import URI.HostPortPair as HostPortPair
    import URI.HostPortPair (HostPortPair)
    import Text.Parsing.Parser (runParser, ParseError)
    parseURIQuery :: String -> Either ParseError (Maybe (QueryPairs Key Value))
    parseURIQuery uriStr =
    view _query <$> runParser uriStr (parser options)
    options ∷ Record (URIOptions UserInfo (HostPortPair Host Port) Path HierPath (QueryPairs Key Value) Fragment)
    options =
    { parseUserInfo: pure
    , printUserInfo: identity
    , parseHosts: HostPortPair.parser pure pure
    , printHosts: HostPortPair.print identity identity
    , parsePath: pure
    , printPath: identity
    , parseHierPath: pure
    , printHierPath: identity
    , parseQuery: QueryPairs.parse pure pure
    , printQuery: QueryPairs.print identity identity
    , parseFragment: pure
    , printFragment: identity
    }
  • replacement in client/src/Aftok/Signup.purs at line 5
    [4.89][4.4975:5002]()
    import Data.Foldable (any)
    [4.4974]
    [4.89]
    import Data.Bifunctor (bimap)
    import Data.Either (Either(..), note, fromRight)
    import Data.Foldable (any, intercalate)
  • edit in client/src/Aftok/Signup.purs at line 9
    [4.130][4.5003:5110]()
    import Data.Either (Either(..), note)
    import Data.Validation.Semigroup (V(..), toEither, andThen, invalid)
  • edit in client/src/Aftok/Signup.purs at line 10
    [4.12268]
    [4.12268]
    import Data.String.Regex (regex, split)
    import Data.String.Regex.Flags (global)
  • edit in client/src/Aftok/Signup.purs at line 13
    [4.12298]
    [4.5111]
    import Data.Traversable (traverse_)
    import Data.Validation.Semigroup (V(..), toEither, andThen, invalid)
  • edit in client/src/Aftok/Signup.purs at line 17
    [4.5168]
    [4.131]
    import Partial.Unsafe (unsafePartial)
  • edit in client/src/Aftok/Signup.purs at line 32
    [4.836]
    [4.591]
    import URI.Extra.QueryPairs (QueryPairs(..), keyToString, valueToString)
  • edit in client/src/Aftok/Signup.purs at line 37
    [2.193]
    [4.619]
    import Aftok.Navigation (parseURIQuery)
  • edit in client/src/Aftok/Signup.purs at line 48
    [4.5495]
    [4.5495]
    | CodesParseFailure
  • edit in client/src/Aftok/Signup.purs at line 58
    [4.12400]
    [4.12400]
    | InvCodesField
  • edit in client/src/Aftok/Signup.purs at line 79
    [4.14711]
    [4.12531]
    , invitationCodes :: Array String
  • edit in client/src/Aftok/Signup.purs at line 91
    [4.1255]
    [4.1280]
    | SetInvitationCodes String
  • edit in client/src/Aftok/Signup.purs at line 135
    [4.15690]
    [4.12584]
    , invitationCodes: []
  • edit in client/src/Aftok/Signup.purs at line 204
    [4.18997]
    [4.18997]
    , HH.div
    [ P.classes (ClassName <$> [ "form-group" ]) ] $
    [ HH.label [ P.for "invitationCodes" ] [ HH.text "Invitation Codes" ]
    , HH.input
    [ P.type_ P.InputText
    , P.classes (ClassName <$> [ "form-control" ])
    , P.id_ "invitationCodes"
    , P.placeholder "abcdefgh, ..."
    , P.value (intercalate ", " st.invitationCodes)
    , E.onValueInput (Just <<< SetInvitationCodes)
    ]
    ] <> signupErrors InvCodesField st
  • edit in client/src/Aftok/Signup.purs at line 235
    [4.5821]
    [4.19957]
    setZAddr addr = do
    zres <- lift $ caps.checkZAddr addr
    H.modify_ (_ { recoveryZAddr = Just addr })
    case zres of
    Acc.ZAddrCheckValid ->
    H.modify_ (\st -> st { signupErrors = M.delete ZAddrField st.signupErrors, recoveryType = RecoveryZAddr })
    Acc.ZAddrCheckInvalid ->
    H.modify_ (\st -> st { signupErrors = M.insert ZAddrField ZAddrInvalid st.signupErrors })
  • edit in client/src/Aftok/Signup.purs at line 247
    [2.463]
    [2.463]
    lift $ system.log "Initializing signup page..."
    loc <- lift system.href
    case parseURIQuery loc of
    (Right (Just (QueryPairs q))) -> do
    let pairsMap = M.fromFoldable $ (bimap keyToString (map valueToString)) <$> q
    traverse_ (\c -> H.modify_ (_ { invitationCodes = [c] })) (join $ M.lookup "invcode" pairsMap)
    traverse_ setZAddr (join $ M.lookup "zaddr" pairsMap)
    (Right Nothing) -> pure unit
    (Left err) ->
    lift $ system.error ("Parsing failed for location string " <> loc)
  • replacement in client/src/Aftok/Signup.purs at line 283
    [4.15610][4.15610:15827](),[4.15827][2.791:1068]()
    --lift $ system.log "Switching to signin..."
    when (addr /= "")
    $ do
    zres <- lift $ caps.checkZAddr addr
    H.modify_ (_ { recoveryZAddr = Just addr })
    case zres of
    Acc.ZAddrCheckValid ->
    H.modify_ (\st -> st { signupErrors = M.delete ZAddrField st.signupErrors })
    Acc.ZAddrCheckInvalid ->
    H.modify_ (\st -> st { signupErrors = M.insert ZAddrField ZAddrInvalid st.signupErrors })
    [4.15610]
    [4.21353]
    when (addr /= "") (setZAddr addr)
    SetInvitationCodes codeStr -> do
    let r = unsafePartial (fromRight $ regex "\\s*,\\s*" global)
    H.modify_ (_ { invitationCodes = split r codeStr })
  • edit in client/src/Aftok/Signup.purs at line 335
    [4.17162]
    [4.17162]
    CodesParseFailure -> InvCodesField
  • edit in client/src/Aftok/Signup.purs at line 376
    [4.24007]
    [4.24007]
    , P.checked (rt == RecoveryZAddr)
  • replacement in client/src/Aftok/Types.purs at line 23
    [4.11510][4.3576:3606]()
    import Web.HTML (HTMLElement)
    [4.11510]
    [4.3606]
    import Web.HTML (HTMLElement, window)
    import Web.HTML.Window (location)
    import Web.HTML.Location (href)
  • replacement in client/src/Aftok/Types.purs at line 34
    [4.36355][4.36355:36385]()
    = { log :: String -> m Unit
    [4.36355]
    [4.36385]
    = { href :: m String
    , log :: String -> m Unit
  • replacement in client/src/Aftok/Types.purs at line 62
    [4.36622][4.11721:11751](),[4.11721][4.11721:11751]()
    { log: liftEffect <<< C.log
    [4.36622]
    [4.11751]
    { href: liftEffect $ href =<< location =<< window
    , log: liftEffect <<< C.log
  • edit in client/src/Main.purs at line 190
    [4.19899]
    [4.19899]
    "billing" -> VBilling