67 lines
1.2 KiB
Elm
67 lines
1.2 KiB
Elm
|
module Viewer exposing (Viewer, avatar, cred, decoder, minPasswordChars, store, username)
|
||
|
|
||
|
{-| The logged-in user currently viewing this page. It stores enough data to
|
||
|
be able to render the menu bar (username and avatar), along with Cred so it's
|
||
|
impossible to have a Viewer if you aren't logged in.
|
||
|
-}
|
||
|
|
||
|
import Api exposing (Cred)
|
||
|
import Avatar exposing (Avatar)
|
||
|
import Email exposing (Email)
|
||
|
import Json.Decode as Decode exposing (Decoder)
|
||
|
import Json.Decode.Pipeline exposing (custom, required)
|
||
|
import Json.Encode as Encode exposing (Value)
|
||
|
import Profile exposing (Profile)
|
||
|
import Username exposing (Username)
|
||
|
|
||
|
|
||
|
|
||
|
-- TYPES
|
||
|
|
||
|
|
||
|
type Viewer
|
||
|
= Viewer Avatar Cred
|
||
|
|
||
|
|
||
|
|
||
|
-- INFO
|
||
|
|
||
|
|
||
|
cred : Viewer -> Cred
|
||
|
cred (Viewer _ val) =
|
||
|
val
|
||
|
|
||
|
|
||
|
username : Viewer -> Username
|
||
|
username (Viewer _ val) =
|
||
|
Api.username val
|
||
|
|
||
|
|
||
|
avatar : Viewer -> Avatar
|
||
|
avatar (Viewer val _) =
|
||
|
val
|
||
|
|
||
|
|
||
|
{-| Passwords must be at least this many characters long!
|
||
|
-}
|
||
|
minPasswordChars : Int
|
||
|
minPasswordChars =
|
||
|
6
|
||
|
|
||
|
|
||
|
|
||
|
-- SERIALIZATION
|
||
|
|
||
|
|
||
|
decoder : Decoder (Cred -> Viewer)
|
||
|
decoder =
|
||
|
Decode.succeed Viewer
|
||
|
|> custom (Decode.field "image" Avatar.decoder)
|
||
|
|
||
|
|
||
|
store : Viewer -> Cmd msg
|
||
|
store (Viewer avatarVal credVal) =
|
||
|
Api.storeCredWith
|
||
|
credVal
|
||
|
avatarVal
|