145 lines
3.1 KiB
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
|
|
]
|