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.currentPassword [ Input.focusedOnLoad ] { label = Input.labelAbove [] (text "API Token") , onChange = UpdateToken , text = model.token , placeholder = Just (Input.placeholder [] (text "")) , show = False } , Input.button [] { onPress = Just SignIn, label = text "Login" } ] in column [ spacing 16 ] [ tData , text errMsg ]