adriano2005 commited on
Commit
b5d475e
·
verified ·
1 Parent(s): feeff2c

Create src/stores/useCartStore.ts

Browse files
Files changed (1) hide show
  1. src/stores/useCartStore.ts +81 -0
src/stores/useCartStore.ts ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // src/stores/useCartStore.ts
2
+ import { create } from 'zustand';
3
+ import { persist } from 'zustand/middleware';
4
+ import { CartItem, Product } from '@/lib/schemas'; // Importamos os tipos do Zod
5
+
6
+ // Define o formato do estado do nosso carrinho
7
+ interface CartState {
8
+ items: CartItem[]; // A lista de itens no carrinho
9
+ addItem: (product: Product) => void; // Ação: Adicionar item
10
+ removeItem: (productId: number) => void; // Ação: Remover item
11
+ clearCart: () => void; // Ação: Limpar carrinho
12
+ calculateTotal: () => number; // Ação: Calcular total
13
+ }
14
+
15
+ // 🎯 [DECISÃO ARQUITETURAL]: Usamos o middleware `persist` para salvar o estado
16
+ // no `localStorage` do navegador. Isso garante que o carrinho não seja perdido
17
+ // quando o usuário recarregar a página ou navegar para outras rotas.
18
+ export const useCartStore = create<CartState>()(
19
+ persist(
20
+ (set, get) => ({
21
+ // Estado inicial do carrinho
22
+ items: [],
23
+
24
+ // --- Ações ---
25
+
26
+ // Adicionar um produto ao carrinho
27
+ addItem: (product) => {
28
+ set((state) => {
29
+ // 1. Verificamos se o produto já está no carrinho
30
+ const existingItemIndex = state.items.findIndex(
31
+ (item) => item.product.id === product.id
32
+ );
33
+
34
+ if (existingItemIndex > -1) {
35
+ // Se o produto já existe, incrementamos a quantidade
36
+ const newItems = [...state.items];
37
+ newItems[existingItemIndex] = {
38
+ ...newItems[existingItemIndex],
39
+ quantity: newItems[existingItemIndex].quantity + 1,
40
+ };
41
+ return { items: newItems };
42
+ } else {
43
+ // Se o produto é novo, adicionamos ele com quantidade 1
44
+ const newItem: CartItem = { product, quantity: 1 };
45
+ return { items: [...state.items, newItem] };
46
+ }
47
+ });
48
+ },
49
+
50
+ // Remover um produto do carrinho (diminui a quantidade ou remove se for 1)
51
+ removeItem: (productId) => {
52
+ set((state) => ({
53
+ items: state.items
54
+ .map((item) => {
55
+ if (item.product.id === productId) {
56
+ // Diminui a quantidade, mas nunca abaixo de 0
57
+ return { ...item, quantity: item.quantity - 1 };
58
+ }
59
+ return item;
60
+ })
61
+ // Filtra o array para remover itens com quantidade 0
62
+ .filter((item) => item.quantity > 0),
63
+ }));
64
+ },
65
+
66
+ // Limpar todos os itens do carrinho
67
+ clearCart: () => set({ items: [] }),
68
+
69
+ // Calcular o valor total do carrinho
70
+ calculateTotal: () => {
71
+ return get().items.reduce(
72
+ (total, item) => total + item.product.price * item.quantity,
73
+ 0
74
+ );
75
+ },
76
+ }),
77
+ {
78
+ name: 'ecommerce-cart-storage', // Nome da chave no localStorage
79
+ }
80
+ )
81
+ );