-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.ts
120 lines (97 loc) · 2.61 KB
/
store.ts
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { create } from "zustand";
import { persist } from "zustand/middleware";
import { Product } from "@/app/page";
export interface CartProduct extends Product {
quantity: number;
}
type ViewType = "cart" | "checkout" | "success";
interface CartStateFields {
isOpen: boolean;
cart: CartProduct[];
paymentIntent?: string;
viewType: "cart" | "checkout" | "success";
}
interface CartState extends CartStateFields {
toggle: () => void;
add: (item: Product) => void;
remove: (id: Product["id"]) => void;
setPaymentIntent: (value: string) => void;
setViewType: (viewType: ViewType) => void;
clearCart: () => void;
}
const initialState: CartStateFields = {
cart: [],
isOpen: false,
viewType: "cart",
paymentIntent: "",
};
export const useCartStore = create<CartState>()(
persist(
(set) => ({
...initialState,
clearCart: () =>
set({
cart: [],
}),
setViewType: (viewType) =>
set({
viewType,
}),
toggle: () =>
set((state) => ({
isOpen: !state.isOpen,
})),
remove: (id) =>
set((state) => {
const item = state.cart.find((cartItem) => cartItem.id === id);
if (item && item.quantity > 1) {
const updatedCart = state.cart.map((cartItem) => {
if (cartItem.id === id) {
return { ...cartItem, quantity: cartItem.quantity - 1 };
}
return cartItem;
});
return { cart: updatedCart };
}
return {
cart: state.cart.filter((cartItem) => cartItem.id !== id),
};
}),
add: (item) =>
set((state) => {
const itemExists = state.cart.some(({ id }) => id === item.id);
if (itemExists) {
const updatedCart = state.cart.map((cartItem) => {
if (cartItem.id === item.id) {
return { ...cartItem, quantity: cartItem.quantity + 1 };
}
return cartItem;
});
return { cart: updatedCart };
}
return { cart: [...state.cart, { ...item, quantity: 1 }] };
}),
setPaymentIntent: (value) =>
set({
paymentIntent: value,
}),
}),
{ name: "cart" },
),
);
interface ThemeStore {
toggle: () => void;
mode: "light" | "dark";
}
export const useThemeStore = create<ThemeStore>()(
persist(
(set) => ({
mode: "light",
toggle: () =>
set((state) => ({
mode: state.mode === "light" ? "dark" : "light",
})),
}),
{ name: "theme" },
),
);