veza/apps/web/docs/STATE_UTILITIES_AUDIT.md

7.8 KiB

State Utilities Audit

Date: 2026-01-11
Action: 4.6.1.1 - List all state utility files
Status: Complete

Summary

This document lists all state utility files found in apps/web/src/utils/ and documents their purposes, usage, and status.

State Utility Files Found

1. stateMiddleware.ts

  • Purpose: Zustand middleware for analytics tracking and error handling
  • Exports:
    • setAnalyticsHandler() - Set analytics handler
    • setErrorHandler() - Set error handler
    • stateMiddleware() - Middleware function
  • Key Features:
    • Tracks state changes for analytics
    • Handles errors in state updates
    • Provides context for debugging
  • Used By: Library Store (stores/library.ts)
  • Status: ⚠️ Used by Library Store (may be unnecessary complexity)
  • Test File: stateMiddleware.test.ts

2. stateNormalization.ts

  • Purpose: Utilities for normalized state management (entities by ID)
  • Exports:
    • normalize() - Convert array to normalized state
    • denormalize() - Convert normalized state to array
    • addToNormalized() - Add item to normalized state
    • updateInNormalized() - Update item in normalized state
    • removeFromNormalized() - Remove item from normalized state
    • replaceNormalized() - Replace normalized state
    • mergeNormalized() - Merge normalized states
    • getById() - Get item by ID
    • getByIds() - Get items by IDs
  • Key Features:
    • Normalized state structure: { byId: Record<string, T>, allIds: string[] }
    • Efficient lookups and updates
  • Used By: Library Store (stores/library.ts)
  • Status: ⚠️ Used by Library Store (will become obsolete when Library Store migrates to React Query)
  • Test File: None

3. stateInvalidation.ts

  • Purpose: Unified state invalidation for Zustand stores and React Query
  • Exports:
    • invalidateState() - Invalidate state by resource type
    • invalidateStateAfterMutation() - Invalidate after mutation
  • Key Features:
    • Invalidates both Zustand stores and React Query cache
    • Supports resource-based invalidation
    • Integrates with response cache
  • Used By: Various mutation handlers
  • Status: Active (useful for migration period)
  • Test File: None

4. stateHydration.ts

  • Purpose: Hydrate Zustand stores from API on app load
  • Exports:
    • hydrateState() - Hydrate stores from API
    • useStateHydration() - React hook for hydration
  • Key Features:
    • Loads initial state from API
    • Hydrates Auth, Library, and Chat stores
    • Handles errors and loading states
  • Used By: App initialization, store hydration
  • Status: ⚠️ Used for Zustand stores (will become obsolete when stores migrate to React Query)
  • Test File: None

5. stateCleanup.ts

  • Purpose: Cleanup utilities for Zustand stores (size/age-based)
  • Exports:
    • applyCleanup() - Apply cleanup strategy to store
  • Key Features:
    • Size-based cleanup (keep N items)
    • Age-based cleanup (remove old items)
    • Normalized state cleanup support
  • Used By: Potentially Library Store
  • Status: ⚠️ May be unused (needs verification)
  • Test File: stateCleanup.test.ts

6. stateVersioning.ts

  • Purpose: State versioning and migration utilities for Zustand stores
  • Exports:
    • applyMigrations() - Apply migrations to state
    • versionState() - Add version to state
    • unversionState() - Remove version from state
    • createVersionedStorage() - Create versioned storage adapter
  • Key Features:
    • Supports state schema migrations
    • Version tracking for persisted state
    • Migration functions for breaking changes
  • Used By: Potentially for store migrations
  • Status: ⚠️ May be unused (needs verification)
  • Test Files: stateVersioning.test.ts , stateVersioning.example.ts

7. statePersistence.ts

  • Purpose: Persistence utilities for Zustand stores
  • Exports: (needs inspection)
  • Key Features: (needs inspection)
  • Used By: (needs inspection)
  • Status: ⚠️ Needs inspection
  • Test File: None

8. broadcastSync.ts

  • Purpose: Synchronize Zustand stores across browser tabs/windows
  • Exports:
    • broadcastSync() - Middleware for tab synchronization
    • createSynchronizedStore() - Create synchronized store
  • Key Features:
    • Uses BroadcastChannel API
    • Syncs state changes across tabs
    • Handles conflicts and race conditions
  • Used By: UI Store (stores/ui.ts), Auth Store (features/auth/store/authStore.ts)
  • Status: Active (useful for multi-tab sync)
  • Test File: None

9. undoRedo.ts

  • Purpose: Undo/redo functionality for Zustand stores
  • Exports:
    • undoRedo() - Middleware for undo/redo
    • useUndoRedo() - React hook for undo/redo
    • UndoRedoManager - Class for managing history
    • undoRedoManager - Singleton instance
  • Key Features:
    • History tracking for state changes
    • Undo/redo operations
    • Configurable history size
  • Used By: Library Store (stores/library.ts)
  • Status: ⚠️ Used by Library Store (will become obsolete when Library Store migrates to React Query)
  • Test File: None

10. storeSelectors.ts

  • Purpose: Optimized selectors for Zustand stores to prevent unnecessary re-renders
  • Exports:
    • useAuthUser() - Get user from auth store
    • useAuthStatus() - Get auth status
    • useStoreSelector() - Generic store selector
  • Key Features:
    • Uses useShallow for shallow comparison
    • Prevents unnecessary re-renders
    • Type-safe selectors
  • Used By: Various components
  • Status: Active (useful optimization)
  • Test File: None

File Statistics

  • Total State Utility Files: 10
  • With Tests: 3 (30%)
  • Without Tests: 7 (70%)
  • Actively Used: 6
  • Potentially Unused: 2 (stateCleanup, stateVersioning - needs verification)
  • Will Become Obsolete: 4 (stateMiddleware, stateNormalization, stateHydration, undoRedo - when stores migrate)

Usage Analysis

Utilities Used by Stores

  • Library Store: stateMiddleware, stateNormalization, undoRedo
  • UI Store: broadcastSync
  • Auth Store: broadcastSync
  • Chat Store: None (uses Immer middleware)

Utilities Used by Components

  • storeSelectors: Used by various components for optimized selectors
  • stateInvalidation: Used by mutation handlers
  • stateHydration: Used for app initialization

Migration Impact

Will Become Obsolete (After Store Migration)

  1. stateMiddleware - Only used by Library Store
  2. stateNormalization - Only used by Library Store
  3. stateHydration - Only hydrates Zustand stores
  4. undoRedo - Only used by Library Store

Will Remain Useful

  1. broadcastSync - Useful for UI state sync across tabs
  2. storeSelectors - Useful for optimized Zustand selectors
  3. stateInvalidation - Useful during migration period

Needs Investigation

  1. stateCleanup - Verify if actually used
  2. stateVersioning - Verify if actually used
  3. statePersistence - Inspect purpose and usage

Recommendations

High Priority

  1. Action 4.6.1.1: Audit complete - 10 utilities documented
  2. Action 4.6.1.2: Verify usage of stateCleanup, stateVersioning, statePersistence
  3. Action 4.6.1.3: Add tests for utilities without tests (7 files)

Medium Priority

  1. Plan removal of obsolete utilities after store migration
  2. Document migration path for utilities that will become obsolete

Low Priority

  1. Consider consolidating similar utilities
  2. Review if stateMiddleware complexity is justified

Next Steps

  1. Action 4.6.1.1: List complete - 10 state utilities documented
  2. Action 4.6.1.2: Verify usage of potentially unused utilities
  3. Action 4.6.1.3: Add missing tests