3.1 reducer.ts is 1,936 lines of undifferentiated switch cases
File: src/store/reducer.ts
Problem:
The entire app state mutation lives in a single file with a single switch statement. As the app grows, finding and changing any single action requires reading past hundreds of unrelated cases. Related actions (e.g., all shape geometry actions) are not grouped together.
Recommended split:
Recommended split:
New file | Actions it handles
-- | --
reducer/shapes.ts | ADD_SHAPE, REMOVE_SHAPE, UPDATE_SHAPE, MOVE_SHAPE, RESIZE_SHAPE, GROUP_SHAPE, UNGROUP_SHAPE
reducer/assets.ts | ADD_IMAGE_ASSET, UPDATE_IMAGE_ASSET, DELETE_IMAGE_ASSET, ADD_PIXEL_ASSET
reducer/pages.ts | ADD_PAGE, REMOVE_PAGE, REORDER_PAGE, UPDATE_PAGE, ADD_PAGE_FOLDER
reducer/powerups.ts | ADD_SHAPE_POWER_UP, REMOVE_SHAPE_POWER_UP, UPDATE_SHAPE_POWER_UP_FEATURE
reducer/document.ts | LOAD_DOCUMENT, LOAD_LIBRARY, SET_DOCUMENT_NAME
reducer/ui.ts | SET_TOOL_MODE, SET_ZOOM, SCROLL_CANVAS, SET_SELECTION
Each sub-reducer receives (state, action) and returns a new state slice, then reducer.ts becomes an orchestrating dispatcher.
3.1 reducer.ts is 1,936 lines of undifferentiated switch cases
File: src/store/reducer.ts
Problem:
The entire app state mutation lives in a single file with a single switch statement. As the app grows, finding and changing any single action requires reading past hundreds of unrelated cases. Related actions (e.g., all shape geometry actions) are not grouped together.
Recommended split:
Recommended split:
New file | Actions it handles -- | -- reducer/shapes.ts | ADD_SHAPE, REMOVE_SHAPE, UPDATE_SHAPE, MOVE_SHAPE, RESIZE_SHAPE, GROUP_SHAPE, UNGROUP_SHAPE reducer/assets.ts | ADD_IMAGE_ASSET, UPDATE_IMAGE_ASSET, DELETE_IMAGE_ASSET, ADD_PIXEL_ASSET reducer/pages.ts | ADD_PAGE, REMOVE_PAGE, REORDER_PAGE, UPDATE_PAGE, ADD_PAGE_FOLDER reducer/powerups.ts | ADD_SHAPE_POWER_UP, REMOVE_SHAPE_POWER_UP, UPDATE_SHAPE_POWER_UP_FEATURE reducer/document.ts | LOAD_DOCUMENT, LOAD_LIBRARY, SET_DOCUMENT_NAME reducer/ui.ts | SET_TOOL_MODE, SET_ZOOM, SCROLL_CANVAS, SET_SELECTIONEach sub-reducer receives
(state, action)and returns a new state slice, thenreducer.tsbecomes an orchestrating dispatcher.