Guest User

Untitled

a guest
May 11th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.69 KB | None | 0 0
  1. module Main exposing (..)
  2.  
  3. import Html exposing (Html, div, form, input, button, br, text)
  4. import Html.Events exposing (onSubmit, onClick, onInput)
  5. import Html.Attributes exposing (type_, placeholder, value, style)
  6. import Dict exposing (Dict)
  7.  
  8.  
  9. main : Program Never Model Msg
  10. main =
  11. Html.beginnerProgram { model = model, view = view, update = update }
  12.  
  13.  
  14.  
  15. -- MODEL
  16.  
  17.  
  18. type alias User =
  19. { username : String
  20. , password : String
  21. , fullName : String
  22. , moto : String
  23. }
  24.  
  25.  
  26. type alias Users =
  27. Dict String User
  28.  
  29.  
  30. type LoginError
  31. = InvalidUsername
  32. | InvalidPassword
  33. | NoError
  34.  
  35.  
  36. type alias LoggedInState =
  37. { currentUsername : String }
  38.  
  39.  
  40. type alias LoggedOutState =
  41. { usernameField : String
  42. , passwordField : String
  43. , error : LoginError
  44. }
  45.  
  46.  
  47. type State
  48. = LoggedIn LoggedInState
  49. | LoggedOut LoggedOutState
  50.  
  51.  
  52. type alias Model =
  53. { state : State, users : Users }
  54.  
  55.  
  56. model : Model
  57. model =
  58. { state =
  59. LoggedOut
  60. { usernameField = ""
  61. , passwordField = ""
  62. , error = NoError
  63. }
  64. , users =
  65. Dict.empty
  66. |> Dict.insert "nloomans"
  67. (User
  68. "nloomans"
  69. "hunter2"
  70. "Noah Loomans"
  71. "Hi my name is Noah and I like to code stuff."
  72. )
  73. |> Dict.insert "foobar"
  74. (User
  75. "foobar"
  76. "barfoo"
  77. "Foo Baz Bar"
  78. "Foo + Bar = Baz"
  79. )
  80. }
  81.  
  82.  
  83.  
  84. -- UPDATE
  85.  
  86.  
  87. type Msg
  88. = ToggleLogin
  89. | UpdateUsernameField String
  90. | UpdatePasswordField String
  91. | UpdateMoto String String
  92.  
  93.  
  94. update : Msg -> Model -> Model
  95. update msg model =
  96. case msg of
  97. ToggleLogin ->
  98. case model.state of
  99. LoggedIn { currentUsername } ->
  100. -- Log the user out
  101. { model
  102. | state =
  103. LoggedOut
  104. { usernameField = currentUsername
  105. , passwordField = ""
  106. , error = NoError
  107. }
  108. }
  109.  
  110. LoggedOut { usernameField, passwordField } ->
  111. let
  112. isUsernameCorrect =
  113. model.users |> Dict.member usernameField
  114.  
  115. isPasswordCorrect =
  116. case
  117. model.users
  118. |> Dict.get usernameField
  119. of
  120. Just user ->
  121. user.password == passwordField
  122.  
  123. Nothing ->
  124. False
  125. in
  126. if not isUsernameCorrect then
  127. -- Invalid username, display an error
  128. { model
  129. | state =
  130. LoggedOut
  131. { usernameField = usernameField
  132. , passwordField = ""
  133. , error = InvalidUsername
  134. }
  135. }
  136. else if not isPasswordCorrect then
  137. -- Invalid password, display an error
  138. { model
  139. | state =
  140. LoggedOut
  141. { usernameField = usernameField
  142. , passwordField = ""
  143. , error = InvalidPassword
  144. }
  145. }
  146. else
  147. -- Log the user in
  148. { model
  149. | state =
  150. LoggedIn
  151. { currentUsername = usernameField }
  152. }
  153.  
  154. UpdateUsernameField username ->
  155. case model.state of
  156. LoggedOut loggedOutState ->
  157. { model
  158. | state =
  159. LoggedOut
  160. { loggedOutState
  161. | usernameField =
  162. username
  163. }
  164. }
  165.  
  166. LoggedIn _ ->
  167. Debug.crash "UpdateUsernameField is only valid when logged out"
  168.  
  169. UpdatePasswordField password ->
  170. case model.state of
  171. LoggedOut loggedOutState ->
  172. { model
  173. | state =
  174. LoggedOut
  175. { loggedOutState
  176. | passwordField =
  177. password
  178. }
  179. }
  180.  
  181. LoggedIn _ ->
  182. Debug.crash "UpdatePasswordField is only valid when logged out"
  183.  
  184. UpdateMoto username moto ->
  185. { model
  186. | users =
  187. updateUser
  188. username
  189. (\user -> { user | moto = moto })
  190. model.users
  191. }
  192.  
  193.  
  194. updateUser : String -> (User -> User) -> Users -> Users
  195. updateUser username updater users =
  196. Dict.update username (Maybe.map updater) users
  197.  
  198.  
  199.  
  200. -- VIEW
  201.  
  202.  
  203. viewLoggedOut : LoggedOutState -> Html Msg
  204. viewLoggedOut { usernameField, passwordField, error } =
  205. div []
  206. [ text "Hello there, please login to use our application!"
  207. , br [] []
  208. , form [ onSubmit (ToggleLogin) ]
  209. [ input
  210. [ type_ "text"
  211. , placeholder "Username"
  212. , value usernameField
  213. , onInput UpdateUsernameField
  214. ]
  215. []
  216. , br [] []
  217. , input
  218. [ type_ "password"
  219. , placeholder "Password"
  220. , value passwordField
  221. , onInput UpdatePasswordField
  222. ]
  223. []
  224. , br [] []
  225. , button [] [ text "Login" ]
  226. ]
  227. , case error of
  228. InvalidUsername ->
  229. div [ style [ ( "background-color", "red" ) ] ]
  230. [ text "Invalid username!" ]
  231.  
  232. InvalidPassword ->
  233. div [ style [ ( "background-color", "red" ) ] ]
  234. [ text "Invalid password!" ]
  235.  
  236. NoError ->
  237. div [] []
  238. ]
  239.  
  240.  
  241. viewLoggedIn : User -> Html Msg
  242. viewLoggedIn user =
  243. div []
  244. [ button [ onClick ToggleLogin ] [ text "Logout" ]
  245. , br [] []
  246. , text ("Hello there " ++ user.fullName)
  247. , viewEditMoto user.username user.moto
  248. ]
  249.  
  250.  
  251. viewEditMoto : String -> String -> Html Msg
  252. viewEditMoto username moto =
  253. div []
  254. [ text "String: "
  255. , input
  256. [ type_ "text"
  257. , value moto
  258. , onInput (UpdateMoto username)
  259. , style [ ( "width", "300px" ) ]
  260. ]
  261. []
  262. ]
  263.  
  264.  
  265. view : Model -> Html Msg
  266. view { state, users } =
  267. case state of
  268. LoggedIn { currentUsername } ->
  269. case users |> Dict.get currentUsername of
  270. Just user ->
  271. viewLoggedIn user
  272.  
  273. Nothing ->
  274. Debug.crash "We already checked if the user exists during the login, so this should never happen, right???"
  275.  
  276. LoggedOut loggedOutState ->
  277. viewLoggedOut loggedOutState
Add Comment
Please, Sign In to add comment