added store for all filter along with actions to add, remove and reset all.
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Vercel Preview Deployment / Deploy-Preview (push) Successful in 1m8s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Vercel Preview Deployment / Deploy-Preview (push) Successful in 1m8s
				
			This commit is contained in:
		
							parent
							
								
									890595f24c
								
							
						
					
					
						commit
						d4e7ee8cf8
					
				
							
								
								
									
										10
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										10
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -22,6 +22,7 @@
 | 
				
			|||||||
        "clsx": "^2.1.1",
 | 
					        "clsx": "^2.1.1",
 | 
				
			||||||
        "drizzle-orm": "^0.29.4",
 | 
					        "drizzle-orm": "^0.29.4",
 | 
				
			||||||
        "geist": "^1.3.0",
 | 
					        "geist": "^1.3.0",
 | 
				
			||||||
 | 
					        "immer": "^10.1.1",
 | 
				
			||||||
        "lucide-react": "^0.379.0",
 | 
					        "lucide-react": "^0.379.0",
 | 
				
			||||||
        "next": "^15.0.0-rc.0",
 | 
					        "next": "^15.0.0-rc.0",
 | 
				
			||||||
        "postgres": "^3.4.3",
 | 
					        "postgres": "^3.4.3",
 | 
				
			||||||
@ -5229,6 +5230,15 @@
 | 
				
			|||||||
        "node": ">= 4"
 | 
					        "node": ">= 4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/immer": {
 | 
				
			||||||
 | 
					      "version": "10.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "type": "opencollective",
 | 
				
			||||||
 | 
					        "url": "https://opencollective.com/immer"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/import-fresh": {
 | 
					    "node_modules/import-fresh": {
 | 
				
			||||||
      "version": "3.3.0",
 | 
					      "version": "3.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@
 | 
				
			|||||||
    "clsx": "^2.1.1",
 | 
					    "clsx": "^2.1.1",
 | 
				
			||||||
    "drizzle-orm": "^0.29.4",
 | 
					    "drizzle-orm": "^0.29.4",
 | 
				
			||||||
    "geist": "^1.3.0",
 | 
					    "geist": "^1.3.0",
 | 
				
			||||||
 | 
					    "immer": "^10.1.1",
 | 
				
			||||||
    "lucide-react": "^0.379.0",
 | 
					    "lucide-react": "^0.379.0",
 | 
				
			||||||
    "next": "^15.0.0-rc.0",
 | 
					    "next": "^15.0.0-rc.0",
 | 
				
			||||||
    "postgres": "^3.4.3",
 | 
					    "postgres": "^3.4.3",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										144
									
								
								src/app/store.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								src/app/store.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,144 @@
 | 
				
			|||||||
 | 
					import { create } from "zustand";
 | 
				
			||||||
 | 
					import { produce } from "immer";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface FilterState {
 | 
				
			||||||
 | 
					  filters: Filters;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface Filters {
 | 
				
			||||||
 | 
					  regions: string[];
 | 
				
			||||||
 | 
					  countries: string[];
 | 
				
			||||||
 | 
					  producers: string[];
 | 
				
			||||||
 | 
					  price: Price;
 | 
				
			||||||
 | 
					  type: WineType;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface Price {
 | 
				
			||||||
 | 
					  min: number;
 | 
				
			||||||
 | 
					  max: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface WineType {
 | 
				
			||||||
 | 
					  sparkling: boolean;
 | 
				
			||||||
 | 
					  white: boolean;
 | 
				
			||||||
 | 
					  red: boolean;
 | 
				
			||||||
 | 
					  sweet: boolean;
 | 
				
			||||||
 | 
					  other: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FilterActions = {
 | 
				
			||||||
 | 
					  addRegion: (region: string) => void;
 | 
				
			||||||
 | 
					  removeRegion: (region: string) => void;
 | 
				
			||||||
 | 
					  addCountry: (country: string) => void;
 | 
				
			||||||
 | 
					  removeCountry: (country: string) => void;
 | 
				
			||||||
 | 
					  addProducer: (producer: string) => void;
 | 
				
			||||||
 | 
					  removeProducer: (producer: string) => void;
 | 
				
			||||||
 | 
					  setPrice: (min: number, max: number) => void;
 | 
				
			||||||
 | 
					  setType: (type: keyof WineType, value: boolean) => void;
 | 
				
			||||||
 | 
					  resetFilters: () => void;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialFilters: Filters = {
 | 
				
			||||||
 | 
					  regions: [],
 | 
				
			||||||
 | 
					  countries: [],
 | 
				
			||||||
 | 
					  producers: [],
 | 
				
			||||||
 | 
					  price: {
 | 
				
			||||||
 | 
					    min: 0,
 | 
				
			||||||
 | 
					    max: 9999,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  type: {
 | 
				
			||||||
 | 
					    sparkling: false,
 | 
				
			||||||
 | 
					    white: false,
 | 
				
			||||||
 | 
					    red: false,
 | 
				
			||||||
 | 
					    sweet: false,
 | 
				
			||||||
 | 
					    other: false,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const useFilterStore = create<FilterState & FilterActions>()((set) => ({
 | 
				
			||||||
 | 
					  filters: {
 | 
				
			||||||
 | 
					    regions: [],
 | 
				
			||||||
 | 
					    countries: [],
 | 
				
			||||||
 | 
					    producers: [],
 | 
				
			||||||
 | 
					    price: {
 | 
				
			||||||
 | 
					      min: 0,
 | 
				
			||||||
 | 
					      max: 9999,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    type: {
 | 
				
			||||||
 | 
					      sparkling: false,
 | 
				
			||||||
 | 
					      white: false,
 | 
				
			||||||
 | 
					      red: false,
 | 
				
			||||||
 | 
					      sweet: false,
 | 
				
			||||||
 | 
					      other: false,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  addRegion: (region) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        if (!state.filters.regions.includes(region)) {
 | 
				
			||||||
 | 
					          state.filters.regions.push(region);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  removeRegion: (region) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        state.filters.regions = state.filters.regions.filter(
 | 
				
			||||||
 | 
					          (r) => r !== region,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  addCountry: (country) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        if (!state.filters.countries.includes(country)) {
 | 
				
			||||||
 | 
					          state.filters.countries.push(country);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  removeCountry: (country) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        state.filters.countries = state.filters.countries.filter(
 | 
				
			||||||
 | 
					          (c) => c !== country,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  addProducer: (producer) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        if (!state.filters.producers.includes(producer)) {
 | 
				
			||||||
 | 
					          state.filters.producers.push(producer);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  removeProducer: (producer) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        state.filters.producers = state.filters.producers.filter(
 | 
				
			||||||
 | 
					          (p) => p !== producer,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  setPrice: (min, max) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        state.filters.price.min = min;
 | 
				
			||||||
 | 
					        state.filters.price.max = max;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  setType: (type, value) =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        state.filters.type[type] = value;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					  resetFilters: () =>
 | 
				
			||||||
 | 
					    set(
 | 
				
			||||||
 | 
					      produce((state: FilterState) => {
 | 
				
			||||||
 | 
					        state.filters = initialFilters;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default useFilterStore;
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user