summaryrefslogtreecommitdiff
path: root/elm3/User/Settings.elm
diff options
context:
space:
mode:
Diffstat (limited to 'elm3/User/Settings.elm')
-rw-r--r--elm3/User/Settings.elm206
1 files changed, 0 insertions, 206 deletions
diff --git a/elm3/User/Settings.elm b/elm3/User/Settings.elm
deleted file mode 100644
index 43ab941a..00000000
--- a/elm3/User/Settings.elm
+++ /dev/null
@@ -1,206 +0,0 @@
-module User.Settings exposing (main)
-
-import Bitwise exposing (..)
-import Html exposing (..)
-import Html.Attributes exposing (..)
-import Html.Events exposing (..)
-import Browser
-import Browser.Navigation exposing (reload)
-import Lib.Html exposing (..)
-import Lib.Gen as Gen
-import Lib.Api as Api
-
-
-main : Program Gen.UserEdit Model Msg
-main = Browser.element
- { init = init
- , view = view
- , update = update
- , subscriptions = always Sub.none
- }
-
-
-type alias Model =
- { state : Api.State
- , saved : Bool
- , data : Gen.UserEdit
- , cpass : Bool
- , pass1 : String
- , pass2 : String
- , opass : String
- , passNeq : Bool
- }
-
-
-init : Gen.UserEdit -> (Model, Cmd Msg)
-init d =
- ({state = Api.Normal
- , saved = False
- , data = d
- , cpass = False
- , pass1 = ""
- , pass2 = ""
- , opass = ""
- , passNeq = False
- }, Cmd.none)
-
-
-encode : Model -> Gen.UserEditSend
-encode model =
- { hide_list = model.data.hide_list
- , ign_votes = model.data.ign_votes
- , mail = model.data.mail
- , password = if model.cpass then Just { old = model.opass, new = model.pass1 } else Nothing
- , perm = model.data.perm
- , show_nsfw = model.data.show_nsfw
- , spoilers = model.data.spoilers
- , tags_all = model.data.tags_all
- , tags_cont = model.data.tags_cont
- , tags_ero = model.data.tags_ero
- , tags_tech = model.data.tags_tech
- , traits_sexual = model.data.traits_sexual
- , username = model.data.username
- }
-
-
-type UpdateMsg
- = Username String
- | Email String
- | Perm Int Bool
- | IgnVotes Bool
- | HideList Bool
- | ShowNsfw Bool
- | TraitsSexual Bool
- | Spoilers String
- | TagsAll Bool
- | TagsCont Bool
- | TagsEro Bool
- | TagsTech Bool
-
-type Msg
- = Submit
- | Submitted Api.Response
- | Set UpdateMsg
- | CPass Bool
- | OPass String
- | Pass1 String
- | Pass2 String
-
-
-updateField : UpdateMsg -> Gen.UserEdit -> Gen.UserEdit
-updateField msg model =
- case msg of
- Username s -> { model | username = s }
- Email s -> { model | mail = s }
- Perm n b -> { model | perm = if b then or model.perm n else and model.perm (complement n) }
- IgnVotes b -> { model | ign_votes = b }
- HideList b -> { model | hide_list = b }
- ShowNsfw b -> { model | show_nsfw = b }
- TraitsSexual b -> { model | traits_sexual = b }
- Spoilers s -> { model | spoilers = Maybe.withDefault model.spoilers (String.toInt s) }
- TagsAll b -> { model | tags_all = b }
- TagsCont b -> { model | tags_cont = b }
- TagsEro b -> { model | tags_ero = b }
- TagsTech b -> { model | tags_tech = b }
-
-
-update : Msg -> Model -> (Model, Cmd Msg)
-update msg model =
- case msg of
- Set m -> ({ model | saved = False, data = updateField m model.data }, Cmd.none)
- CPass b -> ({ model | saved = False, cpass = b }, Cmd.none)
- OPass s -> ({ model | saved = False, opass = s }, Cmd.none)
- Pass1 s -> ({ model | saved = False, pass1 = s, passNeq = s /= model.pass2 }, Cmd.none)
- Pass2 s -> ({ model | saved = False, pass2 = s, passNeq = s /= model.pass1 }, Cmd.none)
-
- Submit ->
- let
- path = "/u" ++ String.fromInt model.data.id ++ "/edit"
- body = Gen.usereditSendEncode (encode model)
- in ({ model | state = Api.Loading }, Api.post path body Submitted)
-
- Submitted (Gen.Success) ->
- ( { model | state = Api.Normal, saved = True, cpass = False, opass = "", pass1 = "", pass2 = "" }
- , if model.cpass then reload else Cmd.none
- )
- Submitted r -> ({ model | state = Api.Error r }, Cmd.none)
-
-
-view : Model -> Html Msg
-view model =
- form_ Submit (model.state == Api.Loading)
- [ card "account" "Account info" [] <|
-
- [ cardRow "General" Nothing <| formGroups
- [ [ label [ for "username" ] [ text "Username" ]
- , inputText "username" model.data.username (Set << Username) [required True, maxlength 200, pattern "[a-z0-9-]{2,15}", disabled (not model.data.authmod)]
- ]
- , [ label [ for "email" ] [ text "Email address" ]
- , inputText "email" model.data.mail (Set << Email) [type_ "email", required True, pattern Gen.emailPattern]
- ]
- ]
-
- , cardRow "Password" Nothing <| formGroups <|
- [ label [ class "checkbox" ]
- [ inputCheck "" model.cpass CPass
- , text " Change password" ]
- ]
- :: if not model.cpass then [] else
- [ [ label [ class "opass" ] [ text "Current password" ]
- , inputText "opass" model.opass OPass [type_ "password", required True, minlength 4, maxlength 500]
- ]
- , [ label [ class "pass1" ] [ text "New password" ]
- , inputText "pass1" model.pass1 Pass1 [type_ "password", required True, minlength 4, maxlength 500]
- ]
- , [ label [ class "pass2" ] [ text "Repeat" ]
- , inputText "pass2" model.pass2 Pass2 [type_ "password", required True, minlength 4, maxlength 500, classList [("is-invalid", model.passNeq)]]
- , if model.passNeq
- then div [class "invalid-feedback"]
- [ text "Passwords do not match." ]
- else text ""
- ]
- ]
-
- ] ++ if not model.data.authmod then [] else
- [ cardRow "Mod options" Nothing <| formGroups
- [ [ label [] [ text "Permissions" ]
- ] ++ List.map (\(n,s) ->
- label [ class "checkbox" ] [ inputCheck "" (and model.data.perm n > 0) (Set << Perm n), text (" " ++ s) ]
- ) Gen.userPerms
- , [ label [] [ text "Other" ]
- , label [ class "checkbox" ] [ inputCheck "" model.data.ign_votes (Set << IgnVotes), text "Ignore votes in VN statistics" ]
- ]
- ]
- ]
-
- , card "preferences" "Preferences" [] <|
-
- [ cardRow "Privacy" Nothing <| formGroup
- [ label [ class "checkbox" ] [ inputCheck "" model.data.hide_list (Set << HideList), text "Hide my visual novel list, vote list and wishlist and exclude these lists from the database dumps and API" ] ]
-
- , cardRow "NSFW" Nothing <| formGroups
- [ [ label [ class "checkbox" ] [ inputCheck "" model.data.show_nsfw (Set << ShowNsfw), text "Disable warnings for images that are not safe for work" ] ]
- , [ label [ class "checkbox" ] [ inputCheck "" model.data.traits_sexual (Set << TraitsSexual), text "Show sexual traits by default on character pages" ] ]
- ]
-
- , cardRow "Spoilers" Nothing <| formGroup
- [ label [ for "spoilers" ] [ text "Default spoiler level" ]
- , inputSelect [onInput (Set << Spoilers)] (String.fromInt model.data.spoilers)
- [ ("0", "Hide spoilers")
- , ("1", "Show only minor spoilers")
- , ("2", "Show all spoilers")
- ]
- ]
-
- , cardRow "Tags" Nothing <| formGroups
- [ [ label [ class "checkbox" ] [ inputCheck "" model.data.tags_all (Set << TagsAll), text "Show all tags by default on visual novel pages (don't summarize)" ] ]
- , [ label [] [ text "Default tag categories on visual novel pages:" ]
- , label [ class "chexkbox" ] [ inputCheck "" model.data.tags_cont (Set << TagsCont), text "Content" ]
- , label [ class "chexkbox" ] [ inputCheck "" model.data.tags_ero (Set << TagsEro ), text "Sexual content" ]
- , label [ class "chexkbox" ] [ inputCheck "" model.data.tags_tech (Set << TagsTech), text "Technical" ]
- ]
- ]
- ]
-
- , submitButton (if model.saved then "Saved!" else "Save") model.state (not model.passNeq) False
- ]