From 9d2b6ee10ec5359cc91769d430485c8c869ba1a8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Dec 2020 10:51:40 +0530 Subject: monorepo --- frontend/src/Login.elm | 119 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 frontend/src/Login.elm (limited to 'frontend/src/Login.elm') diff --git a/frontend/src/Login.elm b/frontend/src/Login.elm new file mode 100644 index 0000000..dd168f0 --- /dev/null +++ b/frontend/src/Login.elm @@ -0,0 +1,119 @@ +module Login exposing (..) + +import Browser +import Browser.Navigation as Nav +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (..) +import Http +import Json.Encode as Encode +import Url +import Url.Parser as P exposing ((), Parser, int, oneOf, s, string) + + +type alias Model = + { username : String + , password : String + , loginStatus : LoginStatus + } + + +type LoginStatus + = NotLoggedIn + | LoggedIn + | InvalidLogin + | LoggingIn + + +type Msg + = PassEntered String + | UserEntered String + | LoginPressed + | LoginSuccess (Result Http.Error ()) + | LoginFail + + +init : Model +init = + Model "" "" NotLoggedIn + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + PassEntered s -> + ( { model | password = s } + , Cmd.none + ) + + UserEntered s -> + ( { model | username = s } + , Cmd.none + ) + + LoginPressed -> + ( { model | loginStatus = LoggingIn }, tryLogin model ) + + LoginSuccess res -> + case res of + Ok s -> + ( { model | loginStatus = LoggedIn }, Cmd.none ) + + Err e -> + ( { model | loginStatus = InvalidLogin }, Cmd.none ) + + LoginFail -> + ( { model | loginStatus = InvalidLogin }, Cmd.none ) + + +encodeLogin : Model -> Encode.Value +encodeLogin model = + Encode.object + [ ( "username", Encode.string model.username ) + , ( "password", Encode.string model.password ) + ] + + +tryLogin : Model -> Cmd Msg +tryLogin model = + Http.riskyRequest + { method = "POST" + , headers = [] + , url = "http://127.0.0.1:7878/user/login" + , body = model |> encodeLogin |> Http.jsonBody + , expect = Http.expectWhatever LoginSuccess + , timeout = Nothing + , tracker = Nothing + } + + +viewStatus : LoginStatus -> String +viewStatus ls = + case ls of + NotLoggedIn -> + "Not Logged In" + + InvalidLogin -> + "Invalid Login" + + LoggedIn -> + "Logged in!" + + LoggingIn -> + "Logging In ..." + + +viewInput : String -> String -> String -> (String -> msg) -> Html msg +viewInput t p v toMsg = + input [ type_ t, placeholder p, value v, onInput toMsg ] [] + + +view : Model -> Html Msg +view model = + div [] + [ div [] [ viewInput "text" "Enter name here" model.username UserEntered ] + , div [] [ viewInput "password" "Password" model.password PassEntered ] + , div [] [ button [ onClick LoginPressed ] [ text "Login" ] ] + , div [] [ text (viewStatus model.loginStatus) ] + , div [] [ text "Don't have an account? ", a [ href "/signup" ] [ text "Register now!" ] ] + ] -- cgit v1.2.3