module Update ( update ) where import Task import Effects exposing (Effects) import Server import Model exposing (Model) import Model.Translations exposing (getMessage) import Model.Action exposing (..) import Model.Action.LoggedInAction exposing (LoggedInAction) import Model.View as V import Model.View.LoggedInView exposing (..) import SignIn.Model as SignInModel import SignIn.Action as SignInAction import SignIn.Update as SignInUpdate import Update.LoggedIn exposing (updateLoggedIn) import Utils.Http exposing (errorKey) update : Action -> Model -> (Model, Effects Action) update action model = case action of NoOp -> (model, Effects.none) SignIn email -> ( applySignIn model (SignInAction.WaitingServer) , Server.signIn email |> Task.map (always (UpdateSignIn SignInAction.ValidLogin)) |> flip Task.onError (\error -> Task.succeed (UpdateSignIn (SignInAction.ErrorLogin (errorKey error))) ) |> Effects.task ) GoLoggedInView init -> ( { model | view = V.LoggedInView (initLoggedInView init) } , Effects.none ) UpdateTime time -> ({ model | currentTime = time }, Effects.none) GoSignInView -> ({ model | view = V.SignInView (SignInModel.init Nothing) }, Effects.none) UpdateSignIn signInAction -> (applySignIn model signInAction, Effects.none) UpdateLoggedIn loggedInAction -> applyLoggedIn model loggedInAction SignOut -> ( model , Server.signOut |> Task.map (always GoSignInView) |> flip Task.onError (always <| Task.succeed NoOp) |> Effects.task ) applySignIn : Model -> SignInAction.Action -> Model applySignIn model signInAction = case model.view of V.SignInView signInView -> { model | view = V.SignInView (SignInUpdate.update model.translations signInAction signInView) } _ -> model applyLoggedIn : Model -> LoggedInAction -> (Model, Effects Action) applyLoggedIn model loggedInAction = case model.view of V.LoggedInView loggedInView -> let (loggedInView, effects) = updateLoggedIn model loggedInAction loggedInView in ( { model | view = V.LoggedInView loggedInView } , Effects.map UpdateLoggedIn effects ) _ -> (model, Effects.none)