mi-v1/frontend/src/Pages/SignIn.elm

145 lines
3.1 KiB
Elm

module Pages.SignIn exposing (Model, Msg, page)
import Element exposing (..)
import Element.Input as Input
import Generated.Params as Params
import Global
import Http
import Mi
import Spa.Page
import Utils.Spa exposing (Page)
page : Page Params.SignIn Model Msg model msg appMsg
page =
Spa.Page.component
{ title = always "Login"
, init = always init
, update = always update
, subscriptions = always subscriptions
, view = always view
}
-- INIT
type alias Model =
{ token : String
, tokenData : Maybe Mi.TokenData
, error : Maybe String
}
init : Params.SignIn -> ( Model, Cmd Msg, Cmd Global.Msg )
init _ =
( { token = ""
, tokenData = Nothing
, error = Nothing
}
, Cmd.none
, Cmd.none
)
-- UPDATE
type Msg
= SignIn
| SignOut
| ValidateToken (Result Http.Error Mi.TokenData)
| UpdateToken String
update : Msg -> Model -> ( Model, Cmd Msg, Cmd Global.Msg )
update msg model =
case msg of
UpdateToken token ->
( { model | token = token }
, Cmd.none
, Cmd.none
)
ValidateToken result ->
case result of
Ok data ->
( { model | tokenData = Just data }
, Cmd.none
, Spa.Page.send (Global.SignIn model.token)
)
Err _ ->
( { model | token = "", error = Just "got an error :(" }
, Cmd.none
, Cmd.none
)
SignIn ->
( model
, Mi.request
"GET"
model.token
"/.within/tokeninfo"
Http.emptyBody
(Mi.expectJson ValidateToken Mi.tokenDecoder)
, Cmd.none
)
SignOut ->
( model
, Cmd.none
, Spa.Page.send Global.SignOut
)
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- VIEW
view : Model -> Element Msg
view model =
let
errMsg =
case model.error of
Just msg ->
msg
Nothing ->
""
tData =
case model.tokenData of
Just data ->
Element.paragraph []
[ text ("ID: " ++ data.jti)
, paragraph [] [ text ("Sub: " ++ data.sub) ]
]
Nothing ->
Element.column []
[ Input.text []
{ label = Input.labelAbove [] (text "API Token")
, onChange = UpdateToken
, text = model.token
, placeholder = Just (Input.placeholder [] (text ""))
}
, Input.button [] { onPress = Just SignIn, label = text "Login" }
]
in
column [ spacing 16 ]
[ tData
, text errMsg
]