public State Reduce(State state, StateAction action) { if (!(action.Reducer is PageInitReducer)) { return(state); } var definitionKey = PageConst.StateDefinitionKey; var stackKey = PageConst.StateStackKey; var definition = action.GetValue <PageDefinition>(); if (state.Get(stackKey).IsNull() || state.Get(definitionKey).IsNull()) { var pageStack = new PageStack(); pageStack.Push(new Page { Name = definition.RootPageName, Data = null }); state.Set(definitionKey, new Any(definition)); state.Set(stackKey, new Any(pageStack)); // load permanent scenes PageReducerUtility.ChangeScenes(state, definition.PermanentScenes, true); state.NotifyValue(SceneConst.StateKey); } return(state); }
public State Reduce(State state, StateAction action) { if (!(action.Reducer is PagePushReducer)) { return(state); } if (!action.IsValueOf <Page>()) { throw new ArgumentException($"StateAction.Value ({action.Value.Type}) is not type of Page"); } var definition = state.GetValue <PageDefinition>(PageConst.StateDefinitionKey); var stack = state.GetValue <PageStack>(PageConst.StateStackKey); var nextPage = action.GetValue <Page>(); var nextPageScene = definition.GetPageScene(nextPage?.Name); var previousPage = stack.Peek(); var previousPageScene = definition.GetPageScene(previousPage?.Name); stack.Push(nextPage); if (previousPageScene != null) { PageReducerUtility.ChangeScenes(state, previousPageScene.Scenes, false); } else { var scenes = PageReducerUtility.GetCleanUpScenes(state, nextPageScene.Scenes, definition.PermanentScenes); PageReducerUtility.ChangeScenes(state, scenes, false); } if (nextPageScene != null) { PageReducerUtility.ChangeScenes(state, nextPageScene.Scenes, true); } state.NotifyValue(SceneConst.StateKey); state.NotifyValue(PageConst.StateStackKey); return(state); }