aboutsummaryrefslogtreecommitdiffstats
path: root/thallium-frontend/src/slices/cart.ts
blob: ab22e2eb3086a28987574fa9b88544e2d9276a7d (plain) (blame)
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
import { createSlice } from "@reduxjs/toolkit";

export interface CartItem {
    product_template_id: number,
    quantity: number,
    variant_id: number,
    estPrice: string,
}

const cartSlice = createSlice({
    name: "cart",
    initialState: {
        cart: [] as CartItem[],
        maxPrice: null as number | null,
    },
    reducers: {
        addCartItem(state, action: { payload: { product_template_id: number, variant_id: number, estPrice: string } }) {
            const existingItem = state.cart.find((item) => item.product_template_id === action.payload.product_template_id && item.variant_id === action.payload.variant_id);

            if (existingItem) {
                existingItem.quantity += 1;
                return;
            }

            state.cart.push({
                product_template_id: action.payload.product_template_id,
                quantity: 1,
                variant_id: action.payload.variant_id,
                estPrice: action.payload.estPrice,
            });
        },
        removeCartItem(state, action: { payload: CartItem }) {
            const existingItem = state.cart.find((item) => item.product_template_id === action.payload.product_template_id && item.variant_id === action.payload.variant_id);

            if (existingItem) {
                existingItem.quantity -= 1;
                if (existingItem.quantity === 0) {
                    const idx = state.cart.findIndex((item) => item.product_template_id === action.payload.product_template_id && item.variant_id === action.payload.variant_id);

                    state.cart.splice(idx, 1);
                }
            }
        },
        setMaxPrice(state, action: { payload: number }) {
            state.maxPrice = action.payload;
        }
    },
});

export const { addCartItem, removeCartItem, setMaxPrice } = cartSlice.actions;

export default cartSlice.reducer;