All files / src/stores eventParticipantStore.ts

100% Statements 18/18
100% Branches 0/0
100% Functions 15/15
100% Lines 18/18

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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117                                                            3x         3x           3x   3x       9x 9x                   6x 6x               5x 5x               3x 3x               4x 4x                   3x 3x                 2x   19x                
/**
 * Event Participant Store
 *
 * Zustand store for client-side state management of event participants list
 * filters, pagination, and search query.
 *
 * Story 3.3: Event Participants Tab
 */
 
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';
import type { ParticipantFilters, ParticipantPagination } from '@/types/eventParticipant.types';
 
interface EventParticipantState {
  // State
  filters: ParticipantFilters;
  pagination: ParticipantPagination;
  searchQuery: string;
 
  // Actions
  setFilters: (filters: ParticipantFilters) => void;
  setPagination: (pagination: Partial<ParticipantPagination>) => void;
  setPage: (page: number) => void;
  setLimit: (limit: number) => void;
  setSearchQuery: (query: string) => void;
  resetFilters: () => void;
  resetPagination: () => void;
  reset: () => void;
}
 
const DEFAULT_PAGINATION: ParticipantPagination = {
  page: 1,
  limit: 25,
};
 
const initialState = {
  filters: {},
  pagination: DEFAULT_PAGINATION,
  searchQuery: '',
};
 
export const useEventParticipantStore = create<EventParticipantState>()(
  devtools(
    (set) => ({
      ...initialState,
 
      setFilters: (filters: ParticipantFilters) =>
        set(
          (state) => ({
            filters,
            // Reset to page 1 when filters change
            pagination: { ...state.pagination, page: 1 },
          }),
          false,
          'setFilters'
        ),
 
      setPagination: (pagination: Partial<ParticipantPagination>) =>
        set(
          (state) => ({
            pagination: { ...state.pagination, ...pagination },
          }),
          false,
          'setPagination'
        ),
 
      setPage: (page: number) =>
        set(
          (state) => ({
            pagination: { ...state.pagination, page },
          }),
          false,
          'setPage'
        ),
 
      setLimit: (limit: number) =>
        set(
          (state) => ({
            pagination: { ...state.pagination, limit, page: 1 }, // Reset to page 1 on limit change
          }),
          false,
          'setLimit'
        ),
 
      setSearchQuery: (query: string) =>
        set(
          (state) => ({
            searchQuery: query,
            // Reset to page 1 when search query changes
            pagination: { ...state.pagination, page: 1 },
          }),
          false,
          'setSearchQuery'
        ),
 
      resetFilters: () =>
        set(
          (state) => ({
            filters: {},
            searchQuery: '',
            pagination: { ...state.pagination, page: 1 },
          }),
          false,
          'resetFilters'
        ),
 
      resetPagination: () => set({ pagination: DEFAULT_PAGINATION }, false, 'resetPagination'),
 
      reset: () => set(initialState, false, 'reset'),
    }),
    {
      name: 'event-participant-store',
      enabled: import.meta.env.DEV,
    }
  )
);