Skip to content

Commit 6300124

Browse files
add to cart/delete item
1 parent 71b78c3 commit 6300124

File tree

4 files changed

+56
-6
lines changed

4 files changed

+56
-6
lines changed

data.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,7 +1981,7 @@
19811981
"https://cdn.dummyjson.com/products/images/beauty/Essence%20Mascara%20Lash%20Princess/1.png"
19821982
],
19831983
"thumbnail": "https://cdn.dummyjson.com/products/images/beauty/Essence%20Mascara%20Lash%20Princess/thumbnail.png",
1984-
"quantity": 4,
1984+
"quantity": 1,
19851985
"user": "cb1b"
19861986
},
19871987
{
@@ -2043,7 +2043,7 @@
20432043
"https://cdn.dummyjson.com/products/images/beauty/Eyeshadow%20Palette%20with%20Mirror/1.png"
20442044
],
20452045
"thumbnail": "https://cdn.dummyjson.com/products/images/beauty/Eyeshadow%20Palette%20with%20Mirror/thumbnail.png",
2046-
"quantity": 1,
2046+
"quantity": 3,
20472047
"user": "cb1b"
20482048
}
20492049
]

src/features/cart/Cart.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import React, { useState, Fragment } from "react";
22
import { useSelector, useDispatch } from "react-redux";
3-
import { selectItems, updateCartAsync } from "./cartSlice";
3+
import {
4+
deleteItemFromCartAsync,
5+
selectItems,
6+
updateCartAsync,
7+
} from "./cartSlice";
48
import { Dialog, Transition } from "@headlessui/react";
59
import { XMarkIcon } from "@heroicons/react/24/outline";
610
import { Link } from "react-router-dom";
@@ -17,6 +21,10 @@ export default function Cart() {
1721
const handleQuantity = (e, item) => {
1822
dispatch(updateCartAsync({ ...item, quantity: +e.target.value }));
1923
};
24+
25+
const handleRemove = (e, id) => {
26+
dispatch(deleteItemFromCartAsync(id));
27+
};
2028
return (
2129
<>
2230
<div>
@@ -61,6 +69,7 @@ export default function Cart() {
6169
onChange={(e) => {
6270
handleQuantity(e, item);
6371
}}
72+
value={item.quantity}
6473
>
6574
<option value="1">1</option>
6675
<option value="2">2</option>
@@ -72,6 +81,9 @@ export default function Cart() {
7281

7382
<div className="flex">
7483
<button
84+
onClick={(e) => {
85+
handleRemove(e, item.id);
86+
}}
7587
type="button"
7688
className="font-medium text-indigo-600 hover:text-indigo-500"
7789
>

src/features/cart/cartAPI.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Create
12
export function addToCart(item) {
23
return new Promise(async (resolve) => {
34
const response = await fetch("http://localhost:8080/cart", {
@@ -10,6 +11,7 @@ export function addToCart(item) {
1011
resolve({ data });
1112
});
1213
}
14+
// Read
1315
export function fetchItemsByUserId(userId) {
1416
return new Promise(async (resolve) => {
1517
// TODO: we will not hard coded server url here...
@@ -18,6 +20,7 @@ export function fetchItemsByUserId(userId) {
1820
resolve({ data });
1921
});
2022
}
23+
// Update
2124
export function updateCart(update) {
2225
return new Promise(async (resolve) => {
2326
const response = await fetch("http://localhost:8080/cart/" + update.id, {
@@ -30,3 +33,15 @@ export function updateCart(update) {
3033
resolve({ data });
3134
});
3235
}
36+
// Delete
37+
export function deleteItemFromCart(itemId) {
38+
return new Promise(async (resolve) => {
39+
const response = await fetch("http://localhost:8080/cart/" + itemId, {
40+
method: "DELETE",
41+
headers: { "content-type": "application/json" },
42+
});
43+
const data = await response.json();
44+
// TODO:on server it will only return some info of user (not password)
45+
resolve({ data: { id: itemId } });
46+
});
47+
}

src/features/cart/cartSlice.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
2-
import { addToCart, fetchItemsByUserId, updateCart } from "./cartAPI";
2+
import {
3+
addToCart,
4+
fetchItemsByUserId,
5+
updateCart,
6+
deleteItemFromCart,
7+
} from "./cartAPI";
38

49
const initialState = {
510
items: [],
@@ -24,8 +29,16 @@ export const fetchItemsByUserIdAsync = createAsyncThunk(
2429
);
2530
export const updateCartAsync = createAsyncThunk(
2631
"cart/updateCart",
27-
async (item) => {
28-
const response = await updateCart(item);
32+
async (update) => {
33+
const response = await updateCart(update);
34+
// The value we return becomes the `fulfilled` action payload
35+
return response.data;
36+
}
37+
);
38+
export const deleteItemFromCartAsync = createAsyncThunk(
39+
"cart/deleteItemFromCart",
40+
async (itemId) => {
41+
const response = await deleteItemFromCart(itemId);
2942
// The value we return becomes the `fulfilled` action payload
3043
return response.data;
3144
}
@@ -64,6 +77,16 @@ export const cartSlice = createSlice({
6477
(item) => item.id === action.payload.id
6578
);
6679
state.items[index] = action.payload;
80+
})
81+
.addCase(deleteItemFromCartAsync.pending, (state) => {
82+
state.status = "loading";
83+
})
84+
.addCase(deleteItemFromCartAsync.fulfilled, (state, action) => {
85+
state.status = "idle";
86+
const index = state.items.findIndex(
87+
(item) => item.id === action.payload.id
88+
);
89+
state.items.splice(index, 1);
6790
});
6891
},
6992
});

0 commit comments

Comments
 (0)