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