import { FetchStatus } from "@engine/App/Core/_actions/coreTypes"; import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { ScenesDictionary, ScenesDictionaryItem, ScenesIds } from "../../scenesTypes"; export interface ScenesState { byId: ScenesDictionary; allIds: ScenesIds; status: FetchStatus; currentSceneId: string | null; currentDefaultSceneId: string | null; } const initialState: ScenesState = { byId: {}, allIds: [], status: "loading", currentSceneId: null, currentDefaultSceneId: null, }; export const scenesSlice = createSlice({ name: "scenes", initialState, reducers: { addScene: (state: ScenesState, actions: PayloadAction) => { const newScene = actions.payload; state.byId = { ...state.byId, [newScene.id]: newScene, }; state.allIds.push({ id: newScene.id }); }, setScenesStatus: (state: ScenesState, actions: PayloadAction) => { const status = actions.payload; state.status = status; }, addScenesBatch: (state: ScenesState, actions: PayloadAction) => { const newScenes = actions.payload; state.byId = { ...state.byId, ...newScenes, }; state.allIds = [...state.allIds, ...Object.keys(newScenes).map((x) => ({ id: x }))]; }, resetScenes: ( state: ScenesState, actions: PayloadAction<{ scenes: ScenesDictionary; currentSceneId: string }> ) => { const { scenes, currentSceneId } = actions.payload; state.currentSceneId = currentSceneId; state.byId = scenes; state.allIds = Object.keys(scenes).map((x) => ({ id: x })); }, setCurrentSceneId: (state: ScenesState, actions: PayloadAction) => { state.currentSceneId = actions.payload; }, setCurrentDefaultSceneId: (state: ScenesState, actions: PayloadAction) => { state.currentDefaultSceneId = actions.payload; }, updateScenes: (state: ScenesState, actions: PayloadAction) => { state.byId = actions.payload; }, updateScene: (state: ScenesState, actions: PayloadAction) => { const newScene = actions.payload; if (state.byId) { state.byId[newScene.id] = newScene; } }, removeScene: (state: ScenesState, actions: PayloadAction) => { const sceneId = actions.payload; if (state.byId) { delete state.byId[sceneId]; } state.allIds = state.allIds.filter((x) => x.id !== sceneId); }, }, }); export const { addScene, setScenesStatus, addScenesBatch, resetScenes, setCurrentSceneId, setCurrentDefaultSceneId, updateScenes, updateScene, removeScene, } = scenesSlice.actions; export default scenesSlice.reducer;