module Update.LoggedIn ( updateLoggedIn ) where import Date import Dict import Debug import Task import Effects exposing (Effects) import Http exposing (Error(..)) import Server import Model exposing (Model) import Model.User exposing (UserId) import Model.Payment exposing (..) import Model.Action.LoggedInAction exposing (..) import Model.Action.AccountAction as Account import Model.Action.MonthlyAction as Monthly import Model.Action.AddPaymentAction as AddPayment import Model.View.LoggedInView exposing (..) import Model.View.LoggedIn.AddPayment exposing (..) import Update.LoggedIn.AddPayment exposing (updateAddPayment, addPaymentError) import Update.LoggedIn.Monthly exposing (updateMonthly) import Update.LoggedIn.Account exposing (updateAccount) updateLoggedIn : Model -> LoggedInAction -> LoggedInView -> (LoggedInView, Effects LoggedInAction) updateLoggedIn model action loggedInView = case action of NoOp -> (loggedInView, Effects.none) UpdateAdd addPaymentAction -> ( { loggedInView | add = updateAddPayment addPaymentAction loggedInView.add } , Effects.none ) UpdatePayments payments -> ( { loggedInView | payments = payments } , Effects.none ) AddPayment name cost frequency -> ( { loggedInView | add = updateAddPayment AddPayment.WaitingServer loggedInView.add } , Server.addPayment model.translations name cost frequency |> flip Task.onError (\err -> case err of BadResponse 400 jsonErr -> case addPaymentError model.translations jsonErr of Just addPaymentAction -> Task.succeed (UpdateAdd addPaymentAction) Nothing -> Task.succeed NoOp _ -> Task.succeed NoOp ) |> Effects.task ) ValidateAddPayment paymentId name cost frequency -> let newPayment = Payment paymentId (Date.fromTime model.currentTime) name cost loggedInView.account.me newAdd = initAddPayment frequency in case frequency of Punctual -> let (newAccount, accountEffects) = updateAccount (Account.UpdatePayer loggedInView.account.me model.currentTime cost) loggedInView.account in ( { loggedInView | currentPage = 1 , add = newAdd , account = newAccount , payments = newPayment :: loggedInView.payments , paymentsCount = loggedInView.paymentsCount + 1 } , Effects.map UpdateAccount accountEffects ) Monthly -> ( { loggedInView | add = newAdd , monthly = updateMonthly (Monthly.AddPayment newPayment) loggedInView.monthly } , Effects.none ) ToggleEdit id -> ( { loggedInView | paymentEdition = if loggedInView.paymentEdition == Just id then Nothing else Just id } , Effects.none ) DeletePayment payment frequency -> ( loggedInView , Server.deletePayment payment frequency |> flip Task.onError (always <| Task.succeed NoOp) |> Effects.task ) ValidateDeletePayment payment frequency -> case frequency of Monthly -> ( { loggedInView | monthly = updateMonthly (Monthly.DeletePayment payment) loggedInView.monthly } , Effects.none ) Punctual -> let (newAccount, accountEffects) = updateAccount (Account.UpdatePayer payment.userId (Date.toTime payment.creation) -payment.cost) loggedInView.account in ( { loggedInView | account = newAccount , payments = deletePayment payment.id loggedInView.payments , paymentsCount = loggedInView.paymentsCount - 1 } , Effects.map UpdateAccount accountEffects ) UpdatePage page -> ( { loggedInView | currentPage = page } , Effects.none ) UpdateMonthly monthlyAction -> ( { loggedInView | monthly = updateMonthly monthlyAction loggedInView.monthly } , Effects.none ) UpdateAccount accountAction -> let (newAccount, accountEffects) = updateAccount accountAction loggedInView.account in ( { loggedInView | account = newAccount } , Effects.map UpdateAccount accountEffects )