front-hub/src/stores/BasketStore.ts

97 lines
2.4 KiB
TypeScript
Raw Normal View History

2023-03-20 19:46:28 +00:00
import { create } from "zustand";
import { persist } from "zustand/middleware";
interface Templ {
name: string;
desc: string;
id: string;
privelegeid: string;
amount: number;
price: number;
}
interface BasketStore {
templ: Record<string, Templ>;
squiz: Record<string, Templ>;
reducer: Record<string, Templ>;
openDrawer: boolean;
add: (params: { id: string; obj: Templ; type: "templ" | "squiz" | "reducer" }) => void;
remove: (type: "templ" | "squiz" | "reducer", id: string) => void;
open: (boolean: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => void;
}
export const basketStore = create<BasketStore>()(
2023-03-24 18:30:56 +00:00
persist(
(set, get) => ({
templ: {
id1: {
name: "Шаблонизатор",
desc: "Дисковое хранилище 5 гб",
id: "id1",
privelegeid: "1",
amount: 5,
price: 390,
},
id2: {
name: "Шаблонизатор",
desc: "Подписка на месяц",
id: "id2",
privelegeid: "2",
amount: 30,
price: 290,
},
2023-03-22 11:51:16 +00:00
},
2023-03-24 18:30:56 +00:00
squiz: {
id1: {
name: "Шаблонизатор",
desc: "Дисковое хранилище 5 гб",
id: "id1",
2023-03-24 18:30:56 +00:00
privelegeid: "1",
amount: 5,
price: 390,
},
id2: {
name: "Шаблонизатор",
desc: "Подписка на месяц",
id: "id2",
privelegeid: "2",
amount: 30,
price: 290,
},
},
reducer: {},
openDrawer: false,
add: ({ id, obj, type }) => {
const store: Record<string, Templ> = get()[type] || {};
2023-03-24 18:30:56 +00:00
const newStore = {
[type]: {
...store,
[id]: obj,
},
};
set(() => newStore);
},
remove: (type, id: string) => {
const store: Record<string, Templ> = get()[type] || {};
2023-03-21 18:52:19 +00:00
const newStore = Object.entries(store).reduce<Record<string, Templ>>((accamulator, [key, value]) => {
2023-03-24 18:30:56 +00:00
if (key !== id) {
accamulator[key] = value;
}
2023-03-22 11:51:16 +00:00
2023-03-24 18:30:56 +00:00
return accamulator;
}, {});
2023-03-24 15:30:58 +00:00
2023-03-24 18:30:56 +00:00
set({ [type]: newStore });
},
open: (boolean: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => {
set(() => ({ openDrawer: boolean }));
},
}),
{
name: "basket",
}
)
);