docspell/modules/webapp/src/main/elm/App/Update.elm

483 lines
13 KiB
Elm
Raw Normal View History

2019-12-29 20:55:12 +00:00
module App.Update exposing
( initPage
, update
)
2019-07-17 20:03:10 +00:00
import Api
2019-12-29 20:55:12 +00:00
import App.Data exposing (..)
2019-07-17 20:03:10 +00:00
import Browser exposing (UrlRequest(..))
import Browser.Navigation as Nav
import Data.Flags
import Data.UiTheme
2019-07-17 20:03:10 +00:00
import Page exposing (Page(..))
2019-12-29 20:55:12 +00:00
import Page.CollectiveSettings.Data
import Page.CollectiveSettings.Update
2019-07-17 20:03:10 +00:00
import Page.Home.Data
import Page.Home.Update
import Page.ItemDetail.Data
import Page.ItemDetail.Update
2019-07-17 20:03:10 +00:00
import Page.Login.Data
import Page.Login.Update
import Page.ManageData.Data
import Page.ManageData.Update
2019-12-29 20:55:12 +00:00
import Page.NewInvite.Data
import Page.NewInvite.Update
import Page.Queue.Data
import Page.Queue.Update
import Page.Register.Data
import Page.Register.Update
import Page.Upload.Data
import Page.Upload.Update
2019-12-29 20:55:12 +00:00
import Page.UserSettings.Data
import Page.UserSettings.Update
import Ports
import Url
import Util.Maybe
import Util.Update
2019-07-17 20:03:10 +00:00
2019-12-29 20:55:12 +00:00
update : Msg -> Model -> ( Model, Cmd Msg )
2019-07-17 20:03:10 +00:00
update msg model =
let
2019-12-29 20:55:12 +00:00
( m, c, s ) =
updateWithSub msg model
in
( { m | subs = s }, c )
2019-12-29 20:55:12 +00:00
updateWithSub : Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateWithSub msg model =
2019-07-17 20:03:10 +00:00
case msg of
ToggleSidebar ->
( { model | sidebarVisible = not model.sidebarVisible }, Cmd.none, Sub.none )
ToggleDarkMode ->
let
settings =
model.uiSettings
next =
Data.UiTheme.cycle settings.uiTheme
newSettings =
{ settings | uiTheme = next }
in
case model.flags.account of
Just _ ->
-- when authenticated, store it in settings only
-- once new settings arrive via a subscription,
-- the ui is updated. so it is also updated on
-- page refresh
( { model | userMenuOpen = False }
, Ports.storeUiSettings model.flags newSettings
, Sub.none
)
Nothing ->
-- when not logged in, simply set the theme
( { model | userMenuOpen = False }
, Ports.setUiTheme next
, Sub.none
)
2019-07-17 20:03:10 +00:00
HomeMsg lm ->
updateHome lm model
2019-07-17 20:03:10 +00:00
LoginMsg lm ->
updateLogin lm model
ManageDataMsg lm ->
updateManageData lm model
CollSettingsMsg m ->
updateCollSettings m model
UserSettingsMsg m ->
updateUserSettings m model
QueueMsg m ->
updateQueue m model
2019-07-17 20:03:10 +00:00
RegisterMsg m ->
updateRegister m model
UploadMsg m ->
updateUpload m model
NewInviteMsg m ->
updateNewInvite m model
2019-07-17 20:03:10 +00:00
ItemDetailMsg m ->
updateItemDetail m model
2019-07-17 20:03:10 +00:00
VersionResp (Ok info) ->
( { model | version = info }, Cmd.none, Sub.none )
2019-07-17 20:03:10 +00:00
2019-12-29 20:55:12 +00:00
VersionResp (Err _) ->
( model, Cmd.none, Sub.none )
2019-07-17 20:03:10 +00:00
Logout ->
2019-12-29 20:55:12 +00:00
( model
, Cmd.batch
[ Api.logout model.flags LogoutResp
, Ports.removeAccount ()
]
2019-12-29 20:55:12 +00:00
, Sub.none
)
2019-07-17 20:03:10 +00:00
LogoutResp _ ->
( { model | loginModel = Page.Login.Data.emptyModel }
, Page.goto (LoginPage Nothing)
, Sub.none
)
2019-07-17 20:03:10 +00:00
SessionCheckResp res ->
case res of
Ok lr ->
let
2019-12-29 20:55:12 +00:00
newFlags =
if lr.success then
Data.Flags.withAccount model.flags lr
else
Data.Flags.withoutAccount model.flags
command =
if lr.success then
Cmd.batch
[ Api.refreshSession newFlags SessionCheckResp
, Ports.setAccount lr
, case model.flags.account of
Just _ ->
Cmd.none
Nothing ->
Page.goto model.page
]
2019-12-29 20:55:12 +00:00
else
Cmd.batch
[ Ports.removeAccount ()
2020-12-05 23:58:15 +00:00
, case model.page of
LoginPage _ ->
Cmd.none
_ ->
Page.goto (Page.loginPage model.page)
2019-12-29 20:55:12 +00:00
]
2019-07-17 20:03:10 +00:00
in
2019-12-29 20:55:12 +00:00
( { model | flags = newFlags }, command, Sub.none )
Err _ ->
2019-12-29 20:55:12 +00:00
( model
, Cmd.batch
[ Ports.removeAccount ()
2020-12-05 23:58:15 +00:00
, case model.page of
LoginPage _ ->
Cmd.none
_ ->
Page.goto (Page.loginPage model.page)
2019-12-29 20:55:12 +00:00
]
, Sub.none
)
2019-07-17 20:03:10 +00:00
NavRequest req ->
case req of
Internal url ->
let
isCurrent =
2019-12-29 20:55:12 +00:00
Page.fromUrl url
|> Maybe.map (\p -> p == model.page)
|> Maybe.withDefault True
2019-07-17 20:03:10 +00:00
in
2019-12-29 20:55:12 +00:00
( model
, if isCurrent then
Cmd.none
else
Nav.pushUrl model.key (Url.toString url)
, Sub.none
)
2019-07-17 20:03:10 +00:00
External url ->
( model
, Nav.load url
, Sub.none
2019-07-17 20:03:10 +00:00
)
NavChange url ->
let
2019-12-29 20:55:12 +00:00
page =
Page.fromUrl url
|> Maybe.withDefault (defaultPage model.flags)
( m, c, s ) =
initPage model page
2019-07-17 20:03:10 +00:00
in
( { m | page = page }, c, s )
ToggleNavMenu ->
( { model
| navMenuOpen = not model.navMenuOpen
, userMenuOpen =
if not model.navMenuOpen then
False
else
model.userMenuOpen
}
, Cmd.none
, Sub.none
)
ToggleUserMenu ->
( { model
| userMenuOpen = not model.userMenuOpen
, navMenuOpen =
if not model.userMenuOpen then
False
else
model.navMenuOpen
}
, Cmd.none
, Sub.none
)
2019-07-17 20:03:10 +00:00
GetUiSettings settings ->
let
setTheme =
Ports.setUiTheme settings.uiTheme
in
Util.Update.andThen2
[ \m ->
( { m | sidebarVisible = settings.sideMenuVisible }
, setTheme
, Sub.none
)
, updateUserSettings Page.UserSettings.Data.UpdateSettings
2020-10-27 21:35:52 +00:00
, updateHome Page.Home.Data.UiSettingsUpdated
, updateItemDetail Page.ItemDetail.Data.UiSettingsUpdated
]
2020-06-07 22:54:47 +00:00
{ model | uiSettings = settings }
2019-07-17 20:03:10 +00:00
updateItemDetail : Page.ItemDetail.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateItemDetail lmsg model =
let
inav =
Page.Home.Data.itemNav model.itemDetailModel.detail.item.id model.homeModel
result =
Page.ItemDetail.Update.update
model.key
model.flags
inav
model.uiSettings
lmsg
model.itemDetailModel
model_ =
{ model
| itemDetailModel = result.model
}
( hm, hc, hs ) =
updateHome (Page.Home.Data.SetLinkTarget result.linkTarget) model_
in
( hm
, Cmd.batch [ Cmd.map ItemDetailMsg result.cmd, hc ]
, Sub.batch [ Sub.map ItemDetailMsg result.sub, hs ]
)
updateNewInvite : Page.NewInvite.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateNewInvite lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc ) =
Page.NewInvite.Update.update model.flags lmsg model.newInviteModel
in
2019-12-29 20:55:12 +00:00
( { model | newInviteModel = lm }
, Cmd.map NewInviteMsg lc
, Sub.none
2019-12-29 20:55:12 +00:00
)
2019-12-29 20:55:12 +00:00
updateUpload : Page.Upload.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateUpload lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc, ls ) =
Page.Upload.Update.update
(Page.uploadId model.page)
model.flags
lmsg
model.uploadModel
in
2019-12-29 20:55:12 +00:00
( { model | uploadModel = lm }
, Cmd.map UploadMsg lc
, Sub.map UploadMsg ls
)
updateRegister : Page.Register.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateRegister lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc ) =
Page.Register.Update.update model.flags lmsg model.registerModel
in
2019-12-29 20:55:12 +00:00
( { model | registerModel = lm }
, Cmd.map RegisterMsg lc
, Sub.none
2019-12-29 20:55:12 +00:00
)
updateQueue : Page.Queue.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateQueue lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc ) =
Page.Queue.Update.update model.flags lmsg model.queueModel
in
2019-12-29 20:55:12 +00:00
( { model | queueModel = lm }
, Cmd.map QueueMsg lc
, Sub.none
2019-12-29 20:55:12 +00:00
)
updateUserSettings : Page.UserSettings.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateUserSettings lmsg model =
let
( lm, lc, ls ) =
2020-06-07 22:54:47 +00:00
Page.UserSettings.Update.update model.flags model.uiSettings lmsg model.userSettingsModel
in
( { model
| userSettingsModel = lm
}
2019-12-29 20:55:12 +00:00
, Cmd.map UserSettingsMsg lc
, Sub.map UserSettingsMsg ls
2019-12-29 20:55:12 +00:00
)
2019-12-29 20:55:12 +00:00
updateCollSettings : Page.CollectiveSettings.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateCollSettings lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc ) =
Page.CollectiveSettings.Update.update model.flags
lmsg
model.collSettingsModel
in
2019-12-29 20:55:12 +00:00
( { model | collSettingsModel = lm }
, Cmd.map CollSettingsMsg lc
, Sub.none
2019-12-29 20:55:12 +00:00
)
updateLogin : Page.Login.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
2019-07-17 20:03:10 +00:00
updateLogin lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc, ar ) =
Page.Login.Update.update (Page.loginPageReferrer model.page)
model.flags
lmsg
model.loginModel
newFlags =
Maybe.map (Data.Flags.withAccount model.flags) ar
|> Maybe.withDefault model.flags
2019-07-17 20:03:10 +00:00
in
2019-12-29 20:55:12 +00:00
( { model | loginModel = lm, flags = newFlags }
, Cmd.map LoginMsg lc
, Sub.none
2019-12-29 20:55:12 +00:00
)
2019-07-17 20:03:10 +00:00
2019-12-29 20:55:12 +00:00
updateHome : Page.Home.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
2019-07-17 20:03:10 +00:00
updateHome lmsg model =
let
mid =
case model.page of
HomePage ->
Util.Maybe.fromString model.itemDetailModel.detail.item.id
_ ->
Nothing
( lm, lc, ls ) =
Page.Home.Update.update mid model.key model.flags model.uiSettings lmsg model.homeModel
2019-07-17 20:03:10 +00:00
in
( { model
| homeModel = lm
}
2019-12-29 20:55:12 +00:00
, Cmd.map HomeMsg lc
, Sub.map HomeMsg ls
2019-12-29 20:55:12 +00:00
)
2019-07-17 20:03:10 +00:00
updateManageData : Page.ManageData.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateManageData lmsg model =
let
2019-12-29 20:55:12 +00:00
( lm, lc ) =
Page.ManageData.Update.update model.flags lmsg model.manageDataModel
in
2019-12-29 20:55:12 +00:00
( { model | manageDataModel = lm }
, Cmd.map ManageDataMsg lc
, Sub.none
2019-12-29 20:55:12 +00:00
)
2019-07-17 20:03:10 +00:00
initPage : Model -> Page -> ( Model, Cmd Msg, Sub Msg )
initPage model_ page =
let
model =
{ model_ | page = page }
in
2019-07-17 20:03:10 +00:00
case page of
HomePage ->
Util.Update.andThen2
2019-12-29 20:55:12 +00:00
[ updateHome Page.Home.Data.Init
, updateQueue Page.Queue.Data.StopRefresh
]
model
LoginPage _ ->
updateQueue Page.Queue.Data.StopRefresh model
ManageDataPage ->
updateQueue Page.Queue.Data.StopRefresh model
CollectiveSettingPage ->
Util.Update.andThen2
2019-12-29 20:55:12 +00:00
[ updateQueue Page.Queue.Data.StopRefresh
, updateCollSettings Page.CollectiveSettings.Data.Init
]
model
UserSettingPage ->
Util.Update.andThen2
2020-04-19 21:46:46 +00:00
[ updateQueue Page.Queue.Data.StopRefresh
]
model
QueuePage ->
updateQueue Page.Queue.Data.Init model
RegisterPage ->
updateQueue Page.Queue.Data.StopRefresh model
UploadPage _ ->
2020-10-02 22:36:53 +00:00
Util.Update.andThen2
[ updateQueue Page.Queue.Data.StopRefresh
, updateUpload Page.Upload.Data.Clear
]
model
NewInvitePage ->
updateQueue Page.Queue.Data.StopRefresh model
ItemDetailPage id ->
Util.Update.andThen2
[ updateItemDetail (Page.ItemDetail.Data.Init id)
, updateQueue Page.Queue.Data.StopRefresh
]
model