diff options
Diffstat (limited to 'frontend/src/Login.elm')
-rw-r--r-- | frontend/src/Login.elm | 119 |
1 files changed, 119 insertions, 0 deletions
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 @@ | |||
1 | module Login exposing (..) | ||
2 | |||
3 | import Browser | ||
4 | import Browser.Navigation as Nav | ||
5 | import Html exposing (..) | ||
6 | import Html.Attributes exposing (..) | ||
7 | import Html.Events exposing (..) | ||
8 | import Http | ||
9 | import Json.Encode as Encode | ||
10 | import Url | ||
11 | import Url.Parser as P exposing ((</>), Parser, int, oneOf, s, string) | ||
12 | |||
13 | |||
14 | type alias Model = | ||
15 | { username : String | ||
16 | , password : String | ||
17 | , loginStatus : LoginStatus | ||
18 | } | ||
19 | |||
20 | |||
21 | type LoginStatus | ||
22 | = NotLoggedIn | ||
23 | | LoggedIn | ||
24 | | InvalidLogin | ||
25 | | LoggingIn | ||
26 | |||
27 | |||
28 | type Msg | ||
29 | = PassEntered String | ||
30 | | UserEntered String | ||
31 | | LoginPressed | ||
32 | | LoginSuccess (Result Http.Error ()) | ||
33 | | LoginFail | ||
34 | |||
35 | |||
36 | init : Model | ||
37 | init = | ||
38 | Model "" "" NotLoggedIn | ||
39 | |||
40 | |||
41 | update : Msg -> Model -> ( Model, Cmd Msg ) | ||
42 | update msg model = | ||
43 | case msg of | ||
44 | PassEntered s -> | ||
45 | ( { model | password = s } | ||
46 | , Cmd.none | ||
47 | ) | ||
48 | |||
49 | UserEntered s -> | ||
50 | ( { model | username = s } | ||
51 | , Cmd.none | ||
52 | ) | ||
53 | |||
54 | LoginPressed -> | ||
55 | ( { model | loginStatus = LoggingIn }, tryLogin model ) | ||
56 | |||
57 | LoginSuccess res -> | ||
58 | case res of | ||
59 | Ok s -> | ||
60 | ( { model | loginStatus = LoggedIn }, Cmd.none ) | ||
61 | |||
62 | Err e -> | ||
63 | ( { model | loginStatus = InvalidLogin }, Cmd.none ) | ||
64 | |||
65 | LoginFail -> | ||
66 | ( { model | loginStatus = InvalidLogin }, Cmd.none ) | ||
67 | |||
68 | |||
69 | encodeLogin : Model -> Encode.Value | ||
70 | encodeLogin model = | ||
71 | Encode.object | ||
72 | [ ( "username", Encode.string model.username ) | ||
73 | , ( "password", Encode.string model.password ) | ||
74 | ] | ||
75 | |||
76 | |||
77 | tryLogin : Model -> Cmd Msg | ||
78 | tryLogin model = | ||
79 | Http.riskyRequest | ||
80 | { method = "POST" | ||
81 | , headers = [] | ||
82 | , url = "http://127.0.0.1:7878/user/login" | ||
83 | , body = model |> encodeLogin |> Http.jsonBody | ||
84 | , expect = Http.expectWhatever LoginSuccess | ||
85 | , timeout = Nothing | ||
86 | , tracker = Nothing | ||
87 | } | ||
88 | |||
89 | |||
90 | viewStatus : LoginStatus -> String | ||
91 | viewStatus ls = | ||
92 | case ls of | ||
93 | NotLoggedIn -> | ||
94 | "Not Logged In" | ||
95 | |||
96 | InvalidLogin -> | ||
97 | "Invalid Login" | ||
98 | |||
99 | LoggedIn -> | ||
100 | "Logged in!" | ||
101 | |||
102 | LoggingIn -> | ||
103 | "Logging In ..." | ||
104 | |||
105 | |||
106 | viewInput : String -> String -> String -> (String -> msg) -> Html msg | ||
107 | viewInput t p v toMsg = | ||
108 | input [ type_ t, placeholder p, value v, onInput toMsg ] [] | ||
109 | |||
110 | |||
111 | view : Model -> Html Msg | ||
112 | view model = | ||
113 | div [] | ||
114 | [ div [] [ viewInput "text" "Enter name here" model.username UserEntered ] | ||
115 | , div [] [ viewInput "password" "Password" model.password PassEntered ] | ||
116 | , div [] [ button [ onClick LoginPressed ] [ text "Login" ] ] | ||
117 | , div [] [ text (viewStatus model.loginStatus) ] | ||
118 | , div [] [ text "Don't have an account? ", a [ href "/signup" ] [ text "Register now!" ] ] | ||
119 | ] | ||