summaryrefslogtreecommitdiff
path: root/elm3/User/PassSet.elm
blob: b85f715aa9f7cb9ff3435bbfcdd0e4ce13043fbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
module User.PassSet exposing (main)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Json.Encode as JE
import Browser
import Browser.Navigation exposing (load)
import Lib.Api as Api
import Lib.Gen as Gen
import Lib.Html exposing (..)


main : Program String Model Msg
main = Browser.element
  { init = \s ->
    ( { url     = s
      , pass1   = ""
      , pass2   = ""
      , badPass = False
      , state   = Api.Normal
      }
    , Cmd.none)
  , subscriptions = always Sub.none
  , view = view
  , update = update
  }


encodeForm : Model -> JE.Value
encodeForm o = JE.object
  [ ("pass", JE.string o.pass1) ]


type alias Model =
  { url     : String
  , pass1   : String
  , pass2   : String
  , badPass : Bool
  , state   : Api.State
  }


type Msg
  = Pass1 String
  | Pass2 String
  | Submit
  | Submitted Api.Response


update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Pass1 n -> ({ model | pass1 = n, badPass = False }, Cmd.none)
    Pass2 n -> ({ model | pass2 = n, badPass = False }, Cmd.none)

    Submit ->
      if model.pass1 /= model.pass2
      then ({ model | badPass = True }, Cmd.none)
      else ( { model | state = Api.Loading }
           , Api.post model.url (encodeForm model) Submitted)

    Submitted Gen.Success -> (model, load "/")
    Submitted e           -> ({ model | state = Api.Error e }, Cmd.none)


view : Model -> Html Msg
view model =
  let err s =
        div [ class "card__section card__section--error fs-medium" ]
            [ h5 [] [ text "Error" ]
            , text s
            ]
  in form_ Submit (model.state == Api.Loading)
  [ div [ class "card card--white card--no-separators flex-expand small-card mb-5" ]
    [ div [ class "card__header" ] [ div [ class "card__title" ] [ text "Set password" ]]
    , case model.state of
        Api.Error e -> err <| Api.showResponse e
        _ -> text ""
    , if model.badPass then err "Passwords to not match" else text ""
    , div [ class "card__section fs-medium" ]
      [ div [ class "form-group" ] [ inputText "pass1" model.pass1 Pass1 [placeholder "New password", required True, minlength 4, maxlength 500, type_ "password"] ]
      , div [ class "form-group" ] [ inputText "pass2" model.pass2 Pass2 [placeholder "Repeat",       required True, minlength 4, maxlength 500, type_ "password"] ]
      ]
    , div [ class "card__section" ]
      [ div [ class "d-flex jc-end" ]
        [ if model.state == Api.Loading
          then div [ class "spinner spinner--md pull-right" ] []
          else text ""
        , input [ type_ "submit", class "btn", tabindex 10, value "Submit" ] []
        ]
      ]
    ]
  ]