All files / src/stores companyStore.ts

100% Statements 11/11
100% Branches 2/2
100% Functions 10/10
100% Lines 10/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68                                      1x   1x                 39x       12x         36x     7x 30x       7x         30x               161x              
/**
 * Company Management Zustand Store
 *
 * Story 2.5.1 - Task 9b (GREEN Phase)
 * AC14: State Management
 *
 * Manages UI state for company management feature:
 * - Filter state (persisted in localStorage)
 * - View mode toggle (grid/list, persisted)
 * - Selected company name (transient, not persisted) - Story 1.16.2: uses company name as identifier
 * - Modal states (transient, not persisted)
 *
 * Uses Zustand with persist middleware for filter and view mode persistence
 */
 
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import { CompanyStore, CompanyFilters } from '@/types/company.types';
 
export const useCompanyStore = create<CompanyStore>()(
  persist(
    (set) => ({
      // Initial state
      filters: {},
      viewMode: 'grid',
      selectedCompanyName: undefined,
      isCreateModalOpen: false,
      isEditModalOpen: false,
 
      // Filter management
      setFilters: (filters: CompanyFilters) => set({ filters }),
 
      // View mode toggle
      toggleViewMode: () =>
        set((state) => ({
          viewMode: state.viewMode === 'grid' ? 'list' : 'grid',
        })),
 
      // Selected company management (Story 1.16.2: uses company name as identifier)
      setSelectedCompanyName: (name?: string) => set({ selectedCompanyName: name }),
 
      // Create modal management
      openCreateModal: () => set({ isCreateModalOpen: true }),
      closeCreateModal: () => set({ isCreateModalOpen: false }),
 
      // Edit modal management
      openEditModal: (name: string) =>
        set({
          selectedCompanyName: name,
          isEditModalOpen: true,
        }),
      closeEditModal: () =>
        set({
          isEditModalOpen: false,
          selectedCompanyName: undefined,
        }),
    }),
    {
      name: 'company-store', // localStorage key
      // Partial persist: only persist filters and viewMode
      partialize: (state) => ({
        filters: state.filters,
        viewMode: state.viewMode,
      }),
    }
  )
);