added state persistance
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Vercel Preview Deployment / Deploy-Preview (push) Failing after 36s
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Vercel Preview Deployment / Deploy-Preview (push) Failing after 36s
				
			This commit is contained in:
		
							parent
							
								
									d4e7ee8cf8
								
							
						
					
					
						commit
						3faa9fe73b
					
				@ -1,9 +1,26 @@
 | 
				
			|||||||
 | 
					"use client";
 | 
				
			||||||
 | 
					import { Button } from "~/components/ui/button";
 | 
				
			||||||
import FormCard from "./_components/FormCard";
 | 
					import FormCard from "./_components/FormCard";
 | 
				
			||||||
 | 
					import useFilterStore from "./store";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const AddRegionButton: React.FC = () => {
 | 
				
			||||||
 | 
					  const addRegion = useFilterStore((state) => state.addRegion);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const handleClick = () => {
 | 
				
			||||||
 | 
					    addRegion("sverige");
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return <Button onClick={handleClick}>Add Region "Sverige"</Button>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function App() {
 | 
					export default function App() {
 | 
				
			||||||
 | 
					  const filters = useFilterStore((state) => state.filters);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className="container flex w-full flex-col justify-center">
 | 
					    <div className="container flex w-full flex-col justify-center">
 | 
				
			||||||
      <FormCard />
 | 
					      <FormCard />
 | 
				
			||||||
 | 
					      {JSON.stringify(filters)}
 | 
				
			||||||
 | 
					      <AddRegionButton />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										177
									
								
								src/app/store.ts
									
									
									
									
									
								
							
							
						
						
									
										177
									
								
								src/app/store.ts
									
									
									
									
									
								
							@ -1,5 +1,6 @@
 | 
				
			|||||||
import { create } from "zustand";
 | 
					import { create } from "zustand";
 | 
				
			||||||
import { produce } from "immer";
 | 
					import { produce } from "immer";
 | 
				
			||||||
 | 
					import { persist, createJSONStorage } from "zustand/middleware";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface FilterState {
 | 
					interface FilterState {
 | 
				
			||||||
  filters: Filters;
 | 
					  filters: Filters;
 | 
				
			||||||
@ -55,90 +56,98 @@ const initialFilters: Filters = {
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const useFilterStore = create<FilterState & FilterActions>()((set) => ({
 | 
					const useFilterStore = create<FilterState & FilterActions>()(
 | 
				
			||||||
  filters: {
 | 
					  persist(
 | 
				
			||||||
    regions: [],
 | 
					    (set) => ({
 | 
				
			||||||
    countries: [],
 | 
					      filters: {
 | 
				
			||||||
    producers: [],
 | 
					        regions: [],
 | 
				
			||||||
    price: {
 | 
					        countries: [],
 | 
				
			||||||
      min: 0,
 | 
					        producers: [],
 | 
				
			||||||
      max: 9999,
 | 
					        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;
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    }),
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      name: "filter-storage", // name of the item in the storage (must be unique)
 | 
				
			||||||
 | 
					      storage: createJSONStorage(() => sessionStorage), // (optional) by default, 'localStorage' is used
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    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;
 | 
					export default useFilterStore;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user