Files
docspell/modules/webapp/src/main/elm/Comp/UiSettingsMigrate.elm
2021-09-21 22:35:38 +02:00

194 lines
5.2 KiB
Elm

{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Comp.UiSettingsMigrate exposing
( Model
, Msg
, UpdateResult
, init
, receiveBrowserSettings
, update
, view
)
import Api
import Api.Model.BasicResult exposing (BasicResult)
import Data.Flags exposing (Flags)
import Data.UiSettings exposing (StoredUiSettings, UiSettings)
import Html exposing (..)
import Html.Attributes exposing (class, href, title)
import Html.Events exposing (onClick)
import Http
import Messages.Comp.HttpError
import Ports
import Styles as S
init : Flags -> ( Model, Cmd Msg )
init flags =
( Initialized
, Cmd.batch
[ Api.getClientSettings flags GetClientSettingsResp
, requestBrowserSettings flags
]
)
type Model
= Initialized
| WaitingForHttp StoredUiSettings
| WaitingForBrowser
| MigrateActive StoredUiSettings
| MigrateDone
| MigrateRequestRunning
| MigrateRequestFailed String
type Msg
= GetClientSettingsResp (Result Http.Error UiSettings)
| GetBrowserSettings StoredUiSettings
| MigrateSettings StoredUiSettings
| SaveSettingsResp UiSettings (Result Http.Error BasicResult)
receiveBrowserSettings : StoredUiSettings -> Msg
receiveBrowserSettings sett =
GetBrowserSettings sett
--- Update
requestBrowserSettings : Flags -> Cmd Msg
requestBrowserSettings flags =
case flags.account of
Just acc ->
Ports.requestUiSettings acc
Nothing ->
Cmd.none
type alias UpdateResult =
{ model : Model
, cmd : Cmd Msg
, sub : Sub Msg
, newSettings : Maybe UiSettings
}
update : Flags -> Msg -> Model -> UpdateResult
update flags msg model =
let
empty =
{ model = model
, cmd = Cmd.none
, sub = Sub.none
, newSettings = Nothing
}
in
case msg of
GetClientSettingsResp (Err (Http.BadStatus 404)) ->
case model of
Initialized ->
{ model = WaitingForBrowser
, cmd = requestBrowserSettings flags
, sub = Sub.none
, newSettings = Nothing
}
WaitingForHttp sett ->
{ empty | model = MigrateActive sett }
_ ->
{ empty
| sub = Sub.none
, cmd = requestBrowserSettings flags
, model = model
}
GetBrowserSettings sett ->
case model of
Initialized ->
{ empty | model = WaitingForHttp sett }
WaitingForBrowser ->
{ empty | model = MigrateActive sett }
_ ->
empty
GetClientSettingsResp _ ->
{ empty | model = MigrateDone }
MigrateSettings settings ->
let
uiSettings =
Data.UiSettings.merge settings Data.UiSettings.defaults
cmd =
Api.saveClientSettings flags uiSettings (SaveSettingsResp uiSettings)
in
{ empty | model = MigrateRequestRunning, cmd = cmd }
SaveSettingsResp settings (Ok res) ->
if res.success then
{ empty | model = MigrateDone, newSettings = Just settings }
else
{ empty | model = MigrateRequestFailed "Unknown error saving settings." }
SaveSettingsResp _ (Err err) ->
{ empty | model = MigrateRequestFailed <| Messages.Comp.HttpError.gb err }
--- View
{-
Note: this module will be removed later, it only exists for the
transition from storing ui settings at the server. Therefore
strings here are not externalized; translation is not necessary.
-}
view : Model -> Html Msg
view model =
case model of
MigrateActive sett ->
div
[ class (S.box ++ " px-2 py-2")
, class S.infoMessage
, class "flex flex-col"
]
[ div [ class S.header2 ] [ text "Migrate your settings" ]
, p [ class " mb-3" ]
[ text "The UI settings are now stored at the server. You have "
, text "settings stored at the browser that you can now move to the "
, text "server by clicking below."
]
, p [ class " mb-2" ]
[ text "Alternatively, change the default settings here and submit "
, text "this form. This message will disappear as soon as there are "
, text "settings at the server."
]
, div [ class "flex flex-row items-center justify-center" ]
[ a
[ href "#"
, title "Move current settings to the server"
, onClick (MigrateSettings sett)
, class S.primaryButton
]
[ text "Migrate current settings"
]
]
]
_ ->
span [ class "hidden" ] []