All files / lib/reducer/panier panierSlice.ts

100% Statements 20/20
100% Branches 11/11
100% Functions 6/6
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 809x         9x                   9x                           28x 28x 14x     28x 11x   17x                         11x 11x 11x     11x 10x 7x   3x 3x                     3x         9x   9x  
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import {PanierState} from "@/type/achat/offrePanier";
 
 
 
const initialState: PanierState = {
  items: [],
};
 
/**
 * Slice Redux pour la gestion du panier d'achat.
 * Contient les actions et le reducer pour ajouter, retirer et vider les articles du panier.
 *
 * @module panierSlice
 */
const panierSlice = createSlice({
  name: 'panier',
  initialState,
  reducers: {
    /**
     * Ajoute un article au panier. Si l'article existe déjà, incrémente la quantité.
     *
     * @param state L'état actuel du panier.
     * @param action L'identifiant de l'événement et de l'offre à ajouter.
     */
    addOneArticleToCart: (
      state,
      action: PayloadAction<{ evenementId: number; offreId: number }>
    ) => {
      const { evenementId, offreId } = action.payload;
      const existing = state.items.find(
        (item) => item.evenementId === evenementId && item.offreId === offreId
      );
 
      if (existing) {
        existing.quantity += 1;
      } else {
        state.items.push({ evenementId, offreId, quantity: 1 });
      }
    },
    /**
     * Retire un article du panier. Décrémente la quantité ou supprime l'article si quantité = 1.
     *
     * @param state L'état actuel du panier.
     * @param action L'identifiant de l'événement et de l'offre à retirer.
     */
    removeOneArticleFromCart: (
      state,
      action: PayloadAction<{ evenementId: number; offreId: number }>
    ) => {
      const { evenementId, offreId } = action.payload;
      const existing = state.items.find(
        (item) => item.evenementId === evenementId && item.offreId === offreId
      );
 
      if (existing) {
        if (existing.quantity > 1) {
          existing.quantity -= 1;
        } else {
          state.items = state.items.filter(
            (item) => !(item.evenementId === evenementId && item.offreId === offreId)
          );
        }
      }
    },
    /**
     * Vide complètement le panier.
     *
     * @param state L'état actuel du panier.
     */
    clearCart: (state) => {
      state.items = [];
    },
  },
});
 
export const { addOneArticleToCart, removeOneArticleFromCart, clearCart } =
  panierSlice.actions;
export default panierSlice.reducer;