import type { CameraFeedAction, CameraFeedState, PaintedCell } from "../../types/types"; import { CAMERA_IDS, DEFAULT_REGIONS, type CameraID } from "../config/cameraConfig"; export const initialState: CameraFeedState = { cameraFeedID: CAMERA_IDS[0], paintedCells: CAMERA_IDS.reduce( (acc, id) => { acc[id] = new Map(); return acc; }, {} as Record>, ), regionsByCamera: CAMERA_IDS.reduce( (acc, id) => { acc[id] = DEFAULT_REGIONS; return acc; }, {} as Record, ), selectedRegionIndex: 0, modeByCamera: CAMERA_IDS.reduce( (acc, id) => { acc[id] = "painter"; return acc; }, {} as Record, ), zoomLevel: CAMERA_IDS.reduce( (acc, id) => { acc[id] = 1; return acc; }, {} as Record, ), }; export function reducer(state: CameraFeedState, action: CameraFeedAction) { switch (action.type) { case "SET_CAMERA_FEED": return { ...state, cameraFeedID: action.payload, }; case "CHANGE_MODE": return { ...state, modeByCamera: { ...state.modeByCamera, [action.payload.cameraFeedID]: action.payload.mode, }, }; case "SET_SELECTED_REGION_INDEX": return { ...state, selectedRegionIndex: action.payload, }; case "SET_SELECTED_REGION_COLOUR": return { ...state, regionsByCamera: { ...state.regionsByCamera, [action.payload.cameraFeedID]: state.regionsByCamera[action.payload.cameraFeedID].map((region) => region.name === action.payload.regionName ? { ...region, brushColour: action.payload.newColour } : region, ), }, }; case "ADD_NEW_REGION": return { ...state, regionsByCamera: { ...state.regionsByCamera, [action.payload.cameraFeedID]: [ ...state.regionsByCamera[action.payload.cameraFeedID], { name: action.payload.regionName, brushColour: action.payload.brushColour }, ], }, }; case "REMOVE_REGION": return { ...state, regionsByCamera: { ...state.regionsByCamera, [action.payload.cameraFeedID]: state.regionsByCamera[action.payload.cameraFeedID].filter( (region) => region.name !== action.payload.regionName, ), }, }; case "RESET_PAINTED_CELLS": return { ...state, paintedCells: { ...state.paintedCells, [state.cameraFeedID]: new Map(), }, }; case "SET_CAMERA_FEED_DATA": return { ...action.cameraState, }; case "RESET_CAMERA_FEED": return { ...initialState, }; case "SET_ZOOM_LEVEL": return { ...state, zoomLevel: { ...state.zoomLevel, [action.payload.cameraFeedID]: action.payload.zoomLevel, }, }; default: return state; } }