Files
WebControlCenter/src/store/action/screens.ts
2025-09-04 20:25:15 -04:00

125 lines
3.3 KiB
TypeScript

/**
* Copyright 2024 Phenix Real Time Solutions, Inc. Confidential and Proprietary. All Rights Reserved.
*/
import {createSelector, createSlice, PayloadAction} from '@reduxjs/toolkit';
import {RootState} from '../index';
// Screen types
export enum StoreScreensType {
ChannelList = 'channelList',
ChannelDetail = 'channelDetail',
Settings = 'settings',
Login = 'login',
Channels = "Channels"
}
// Screen state interface
export interface ScreenProps {
[key: string]: unknown;
}
export interface ScreenState {
currentScreen: StoreScreensType;
screenProps: ScreenProps;
previousScreen: StoreScreensType | null;
navigationHistory: StoreScreensType[];
}
const initialState: ScreenState = {
currentScreen: StoreScreensType.Login,
screenProps: {},
previousScreen: null,
navigationHistory: []
};
// Selectors
export const screensSelector = (state: RootState): ScreenState => state.screens;
export const selectCurrentScreen = createSelector(
[screensSelector],
(screens: ScreenState) => screens.currentScreen
);
export const selectScreenProps = createSelector(
[screensSelector],
(screens: ScreenState) => screens.screenProps
);
export const selectPreviousScreen = createSelector(
[screensSelector],
(screens: ScreenState) => screens.previousScreen
);
export const selectNavigationHistory = createSelector(
[screensSelector],
(screens: ScreenState) => screens.navigationHistory
);
// Slice
const screensSlice = createSlice({
name: 'screens',
initialState,
reducers: {
setCurrentScreen: (state, action: PayloadAction<StoreScreensType>) => {
state.previousScreen = state.currentScreen;
state.currentScreen = action.payload;
// Add to navigation history (keep last 10)
state.navigationHistory.push(action.payload);
if (state.navigationHistory.length > 10) {
state.navigationHistory.shift();
}
},
setScreenProps: (state, action: PayloadAction<ScreenProps>) => {
state.screenProps = action.payload;
},
updateScreenProps: (state, action: PayloadAction<Partial<ScreenProps>>) => {
state.screenProps = {
...state.screenProps,
...action.payload
};
},
navigateToScreen: (state, action: PayloadAction<{screen: StoreScreensType; props?: ScreenProps}>) => {
state.previousScreen = state.currentScreen;
state.currentScreen = action.payload.screen;
if (action.payload.props) {
state.screenProps = action.payload.props;
}
// Add to navigation history
state.navigationHistory.push(action.payload.screen);
if (state.navigationHistory.length > 10) {
state.navigationHistory.shift();
}
},
navigateBack: (state) => {
if (state.previousScreen) {
const temp = state.currentScreen;
state.currentScreen = state.previousScreen;
state.previousScreen = temp;
}
},
clearScreenProps: (state) => {
state.screenProps = {};
},
resetNavigation: (state) => {
state.currentScreen = StoreScreensType.Login;
state.previousScreen = null;
state.screenProps = {};
state.navigationHistory = [];
}
}
});
export const {
setCurrentScreen,
setScreenProps,
updateScreenProps,
navigateToScreen,
navigateBack,
clearScreenProps,
resetNavigation
} = screensSlice.actions;
export default screensSlice.reducer;