module LoggedIn.Account.Update ( update ) where import Maybe import Dict import Task import Effects exposing (Effects) import Server import LoggedIn.Account.Action as AccountAction import LoggedIn.Account.Model as AccountModel import Utils.Maybe exposing (isJust) update : AccountAction.Action -> AccountModel.Model -> (AccountModel.Model, Effects AccountAction.Action) update action account = case action of AccountAction.NoOp -> (account, Effects.none) AccountAction.ToggleDetail -> ( { account | visibleDetail = not account.visibleDetail } , Effects.none ) AccountAction.ToggleIncomeEdition -> ( { account | incomeEdition = if isJust account.incomeEdition then Nothing else Just (AccountModel.initIncomeEdition (Maybe.withDefault 0 (AccountModel.getCurrentIncome account))) } , Effects.none ) AccountAction.UpdateIncomeEdition income -> case account.incomeEdition of Just incomeEdition -> ( { account | incomeEdition = Just { incomeEdition | income = income } } , Effects.none ) Nothing -> ( account , Effects.none ) AccountAction.UpdateEditionError error -> case account.incomeEdition of Just incomeEdition -> ( { account | incomeEdition = Just { incomeEdition | error = Just error } } , Effects.none ) Nothing -> ( account , Effects.none ) AccountAction.UpdateIncome currentTime amount -> ( account , Server.setIncome currentTime amount |> Task.map (\incomeId -> (AccountAction.ValidateUpdateIncome incomeId currentTime amount)) |> flip Task.onError (always <| Task.succeed AccountAction.NoOp) |> Effects.task ) AccountAction.ValidateUpdateIncome incomeId currentTime amount -> ( { account | incomes = Dict.insert incomeId { userId = account.me, creation = currentTime, amount = amount } account.incomes , incomeEdition = Nothing } , Effects.none )