module Update exposing ( update , urlUpdate ) import Task import Platform.Cmd exposing (Cmd) import Navigation 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 Utils.Http exposing (errorKey) update : Msg -> Model -> (Model, Cmd Msg) update action model = case action of NoOp -> (model, Cmd.none) SignIn email -> ( applySignIn model (SignInMsg.WaitingServer) , Server.signIn email |> Task.perform (\error -> UpdateSignIn (SignInMsg.ErrorLogin (errorKey error))) (\() -> UpdateSignIn SignInMsg.ValidLogin) ) 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 |> Task.perform (always NoOp) (always GoSignInView) ) 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 (loggedInView, cmd) = LoggedInUpdate.update model loggedInMsg loggedInView in ( { model | view = V.LoggedInView loggedInView } , Cmd.map UpdateLoggedIn cmd ) _ -> (model, Cmd.none) urlUpdate : Result String Page -> Model -> (Model, Cmd Msg) urlUpdate result model = case Debug.log "urlUpdate" result of Err _ -> (model, Navigation.modifyUrl (Page.toHash model.page)) Ok page -> ({ model | page = page }, Cmd.none)