All files / src/store useFiltersStore.ts

14.28% Statements 2/14
0% Branches 0/2
11.11% Functions 1/9
9.09% Lines 1/11

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                                  5x                                                                                    
import { create } from "zustand";
import { IGenre, ISortingOption } from "@/interfaces";
import { sortingOptions } from "@/utils/constants";
 
interface IFiltersStore {
  sortBy: ISortingOption;
  releaseDate: {
    start: null | Date;
    end: null | Date;
  };
  selectedGenres: IGenre[];
  setSort: (param: ISortingOption) => void;
  setStartDate: (param: Date | null) => void;
  setEndDate: (param: Date | null) => void;
  setGenres: (param: IGenre) => void;
}
 
const useFiltersStore = create<IFiltersStore>((set) => ({
  sortBy: sortingOptions[0],
  releaseDate: {
    start: null,
    end: null,
  },
  selectedGenres: [],
 
  setSort: (sortingOption) =>
    set({
      sortBy: sortingOption,
    }),
 
  setStartDate: (startDate: null | Date) => {
    set((state) => ({
      releaseDate: { ...state.releaseDate, start: startDate },
    }));
  },
 
  setEndDate: (endDate: null | Date) => {
    set((state) => ({
      releaseDate: { ...state.releaseDate, end: endDate },
    }));
  },
 
  setGenres: (genre: IGenre) => {
    set((state) => {
      const updatedGenres = [...state.selectedGenres];
 
      if (updatedGenres.includes(genre)) {
        return {
          selectedGenres: updatedGenres.filter((selectedGenre) => selectedGenre.id !== genre.id),
        };
      } else {
        updatedGenres.push(genre);
        return { selectedGenres: updatedGenres };
      }
    });
  },
}));
 
export default useFiltersStore;