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 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() {
|
||||
const filters = useFilterStore((state) => state.filters);
|
||||
|
||||
return (
|
||||
<div className="container flex w-full flex-col justify-center">
|
||||
<FormCard />
|
||||
{JSON.stringify(filters)}
|
||||
<AddRegionButton />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
177
src/app/store.ts
177
src/app/store.ts
@ -1,5 +1,6 @@
|
||||
import { create } from "zustand";
|
||||
import { produce } from "immer";
|
||||
import { persist, createJSONStorage } from "zustand/middleware";
|
||||
|
||||
interface FilterState {
|
||||
filters: Filters;
|
||||
@ -55,90 +56,98 @@ const initialFilters: Filters = {
|
||||
},
|
||||
};
|
||||
|
||||
const useFilterStore = create<FilterState & FilterActions>()((set) => ({
|
||||
filters: {
|
||||
regions: [],
|
||||
countries: [],
|
||||
producers: [],
|
||||
price: {
|
||||
min: 0,
|
||||
max: 9999,
|
||||
const useFilterStore = create<FilterState & FilterActions>()(
|
||||
persist(
|
||||
(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;
|
||||
}),
|
||||
),
|
||||
}),
|
||||
{
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user