source: CookCraft-FrontEnd/CookCraft-FrontEnd-master/cookcraft-app/src/components/ShoppingCartComponents/Checkout.jsx

Last change on this file was d7b7f00, checked in by Gorazd Biskoski <gorazdbiskoskii@…>, 4 weeks ago

Add project

  • Property mode set to 100644
File size: 4.7 KB
Line 
1import React, { useContext, useState } from 'react';
2import { FaTrashAlt, FaUtensils, FaArrowLeft } from "react-icons/fa";
3import { CartContext } from './CartContext';
4import { OrderContext } from './OrderContext';
5import { useNavigate } from 'react-router-dom';
6import styles from '../../css/ShoppingCartCss/checkout-style.module.css';
7
8const Checkout = () => {
9 const { cart, removeFromCart } = useContext(CartContext);
10 const { isOrderInProgress } = useContext(OrderContext);
11 const navigate = useNavigate();
12
13 const [quantities, setQuantities] = useState(() => {
14 const savedCart = localStorage.getItem('cart');
15 return savedCart ? JSON.parse(savedCart) : cart.map(item => ({ id: item.id, grams: "" }));
16 });
17
18 const cartLength = cart?.length || 0;
19
20 const handleBackClick = () => {
21 navigate(-1);
22 };
23
24 const roundToNearest50 = (value) => {
25 let rounded = Math.round(value / 50) * 50;
26 return Math.max(50, Math.min(rounded, 2000));
27 };
28
29 const updateLocalStorageCart = (updatedCart) => {
30 localStorage.setItem('cart', JSON.stringify(updatedCart));
31 };
32
33 const handleQuantityChange = (id, newGrams) => {
34 const updatedQuantities = quantities.map(q => q.id === id ? { ...q, grams: newGrams } : q);
35 setQuantities(updatedQuantities);
36 updateLocalStorageCart(updatedQuantities);
37 };
38
39 const handleQuantityBlur = (id, newGrams) => {
40 const roundedGrams = roundToNearest50(newGrams);
41 const updatedQuantities = quantities.map(q => q.id === id ? { ...q, grams: roundedGrams } : q);
42 setQuantities(updatedQuantities);
43 updateLocalStorageCart(updatedQuantities);
44 };
45
46 const handleRemoveFromCart = (item) => {
47 removeFromCart(item);
48 const updatedQuantities = quantities.filter(q => q.id !== item.id);
49 setQuantities(updatedQuantities);
50 updateLocalStorageCart(updatedQuantities);
51 };
52
53 const allInputsFilled = quantities.every(q => q.grams >= 50 && q.grams <= 2000);
54
55 const handleProceed = () => {
56 if (!isOrderInProgress) {
57 const itemsWithQuantities = cart.map((item) => ({
58 id: item.id,
59 name: item.name,
60 measurement: item.measurement,
61 grams: quantities.find(q => q.id === item.id)?.grams || 0
62 }));
63 navigate('/delivery-details', { state: { itemsWithQuantities } });
64 }
65 };
66
67 return (
68 <div className={styles.checkoutContainer}>
69 <div className={styles.checkoutCard}>
70 <h2 className={styles.checkoutTitle}>Checkout</h2>
71 <div className={styles.backArrow} onClick={handleBackClick}>
72 <FaArrowLeft />
73 </div>
74 {cartLength === 0 ? (
75 <p>Your cart is empty</p>
76 ) : (
77 <div className={styles.cartItems}>
78 <p>You have {cartLength} items in your cart:</p>
79 <p>Enter the amount of grams needed for each ingredient:</p>
80 <ul className={styles.itemList}>
81 {cart.map((item, index) => {
82 const currentQuantity = quantities.find(q => q.id === item.id)?.grams || "";
83 return (
84 <li key={index} className={styles.cartItem}>
85 <FaUtensils className={styles.cartItemIcon} />
86 <div className={styles.itemDetails}>
87 <p className={styles.itemLabel}>{item.name}</p>
88 <p className={styles.quantityLabel}>In Recipe: {item.measurement}</p>
89 </div>
90 <input
91 type="number"
92 min="50"
93 max="2000"
94 step="50"
95 value={currentQuantity}
96 onChange={(e) => handleQuantityChange(item.id, e.target.value)}
97 onBlur={(e) => handleQuantityBlur(item.id, e.target.value)}
98 className={styles.quantityInput}
99 placeholder="Enter grams"
100 disabled={isOrderInProgress}
101 />
102 <p className={styles.gramsInfo}>50g - 2000g</p>
103 <button
104 className={styles.removeButton}
105 onClick={() => handleRemoveFromCart(item)}
106 disabled={isOrderInProgress}
107 >
108 <FaTrashAlt />
109 </button>
110 </li>
111 );
112 })}
113 </ul>
114 </div>
115 )}
116 <button
117 className={cartLength > 0 && allInputsFilled ? styles.proceedButton : styles.disabledButton}
118 disabled={cartLength === 0 || !allInputsFilled || isOrderInProgress}
119 onClick={handleProceed}
120 >
121 Get Items Delivered
122 </button>
123 </div>
124 </div>
125 );
126};
127
128export default Checkout;
Note: See TracBrowser for help on using the repository browser.