diff options
Diffstat (limited to 'src/client/Update.elm')
| -rw-r--r-- | src/client/Update.elm | 182 | 
1 files changed, 182 insertions, 0 deletions
| diff --git a/src/client/Update.elm b/src/client/Update.elm new file mode 100644 index 0000000..7006d5a --- /dev/null +++ b/src/client/Update.elm @@ -0,0 +1,182 @@ +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) | 
