module Update exposing ( update ) import Task import Platform.Cmd exposing (Cmd) import Navigation exposing (Location) import Page exposing (Page) import Server import Msg exposing (..) import Model exposing (Model) import Model.Translations exposing (getMessage) import Model.View as V import LoggedIn.Model as LoggedInModel import LoggedIn.Msg as LoggedInMsg import LoggedIn.Update as LoggedInUpdate import SignIn.Model as SignInModel import SignIn.Msg as SignInMsg import SignIn.Update as SignInUpdate import Dialog import Dialog.Update as DialogUpdate import Tooltip import Utils.Http exposing (errorKey) import Utils.Cmd exposing ((:>)) update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of NoOp -> (model, Cmd.none) UpdatePage page -> ({ model | page = page }, Cmd.none) SignIn email -> ( applySignIn model (SignInMsg.WaitingServer) , Server.signIn email (\result -> case result of Ok _ -> UpdateSignIn SignInMsg.ValidLogin Err error -> UpdateSignIn (SignInMsg.ErrorLogin (errorKey error)) ) ) GoLoggedInView init -> ( { model | view = V.LoggedInView (LoggedInModel.init init) } , Cmd.none ) UpdateTime time -> ({ model | currentTime = time }, Cmd.none) GoSignInView -> ({ model | view = V.SignInView (SignInModel.init Nothing) }, Cmd.none) UpdateSignIn signInMsg -> (applySignIn model signInMsg, Cmd.none) UpdateLoggedIn loggedInMsg -> applyLoggedIn model loggedInMsg SignOut -> ( model , Server.signOut (\result -> case result of Ok _ -> GoSignInView Err _ -> Error "SignOutError" ) ) Error error -> ({ model | errors = model.errors ++ [ error ] }, Cmd.none) Dialog dialogMsg -> Dialog.update DialogUpdate.update dialogMsg model.dialog.model model.dialog |> Tuple.mapFirst (\dialog -> { model | dialog = dialog }) :> update (Tooltip Tooltip.HideMessage) Tooltip tooltipMsg -> let (newTooltip, command) = Tooltip.update tooltipMsg model.tooltip in ( { model | tooltip = newTooltip } , Cmd.map Tooltip command ) CreatePayment name cost date category frequency -> ( model , Server.createPayment name cost date category frequency (\result -> case result of Ok paymentId -> UpdateLoggedIn <| LoggedInMsg.ValidateCreatePayment paymentId name cost date category frequency Err _ -> Error "CreatePaymentError" ) ) EditPayment paymentId name cost date category frequency -> ( model , Server.editPayment paymentId name cost date category frequency (\result -> case result of Ok _ -> UpdateLoggedIn <| LoggedInMsg.ValidateEditPayment paymentId name cost date category frequency Err _ -> Error "EditPaymentError" ) ) DeletePayment paymentId -> ( model , Server.deletePayment paymentId (\result -> case result of Ok _ -> UpdateLoggedIn <| LoggedInMsg.ValidateDeletePayment paymentId Err _ -> Error "DeletePaymentError" ) ) CreateIncome amount date -> ( model , Server.createIncome amount date (\result -> case result of Ok incomeId -> UpdateLoggedIn <| LoggedInMsg.ValidateCreateIncome incomeId amount date Err _ -> Error "CreateIncomeError" ) ) EditIncome incomeId amount date -> ( model , Server.editIncome incomeId amount date (\result -> case result of Ok _ -> UpdateLoggedIn <| LoggedInMsg.ValidateEditIncome incomeId amount date Err _ -> Error "EditIncomeError" ) ) DeleteIncome incomeId -> ( model , Server.deleteIncome incomeId (\result -> case result of Ok _ -> UpdateLoggedIn <| LoggedInMsg.ValidateDeleteIncome incomeId Err _ -> Error "DeleteIncomeError" ) ) CreateCategory name color -> ( model , Server.createCategory name color (\result -> case result of Ok categoryId -> UpdateLoggedIn <| LoggedInMsg.ValidateCreateCategory categoryId name color Err _ -> Error "CreateCategoryError" ) ) EditCategory categoryId name color -> ( model , Server.editCategory categoryId name color (\result -> case result of Ok _ -> UpdateLoggedIn <| LoggedInMsg.ValidateEditCategory categoryId name color Err _ -> Error "EditCategoryError" ) ) DeleteCategory categoryId -> ( model , Server.deleteCategory categoryId (\result -> case result of Ok _ -> UpdateLoggedIn <| LoggedInMsg.ValidateDeleteCategory categoryId Err _ -> Error "DeleteCategoryError" ) ) applySignIn : Model -> SignInMsg.Msg -> Model applySignIn model signInMsg = case model.view of V.SignInView signInView -> { model | view = V.SignInView (SignInUpdate.update model.translations signInMsg signInView) } _ -> model applyLoggedIn : Model -> LoggedInMsg.Msg -> (Model, Cmd Msg) applyLoggedIn model loggedInMsg = case model.view of V.LoggedInView loggedInView -> let (view, cmd) = LoggedInUpdate.update model loggedInMsg loggedInView in ( { model | view = V.LoggedInView view } , Cmd.map UpdateLoggedIn cmd ) _ -> (model, Cmd.none)