source: CookCraft-FrontEnd/CookCraft-FrontEnd-master/cookcraft-app/src/components/ShoppingCartComponents/OrderContext.jsx@ f08e256

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

Add project

  • Property mode set to 100644
File size: 4.2 KB
Line 
1import React, { createContext, useState, useEffect, useContext, useCallback} from 'react';
2import { useNavigate } from 'react-router-dom';
3import { CartContext } from './CartContext';
4import styles from '../..//css/ShoppingCartCss/delivery-details-style.module.css';
5
6export const OrderContext = createContext();
7
8export const OrderProvider = ({ children }) => {
9 const [isOrderInProgress, setIsOrderInProgress] = useState(JSON.parse(localStorage.getItem('isOrderInProgress')) || false);
10 const [orderId, setOrderId] = useState(localStorage.getItem('orderId'));
11 const [isOrderFinished, setIsOrderFinished] = useState(false);
12 const [orderStatus, setOrderStatus] = useState('');
13 const [showRatingModal, setShowRatingModal] = useState(false);
14 const [disableNewOrder, setDisableNewOrder] = useState(false);
15 const { setCart } = useContext(CartContext);
16 const navigate = useNavigate();
17
18 const finishOrder = useCallback(() => {
19 setOrderId(null);
20 setIsOrderInProgress(false);
21 setIsOrderFinished(true);
22 setCart([]);
23 setOrderStatus('Order delivered!');
24 localStorage.removeItem('isOrderInProgress');
25 setShowRatingModal(true);
26 setDisableNewOrder(true);
27 }, [setCart]);
28
29 const checkOrderStatus = useCallback(async (id) => {
30 try {
31 const response = await fetch(`http://localhost:8080/api/orders/status/${id}`, {
32 method: 'GET',
33 headers: {
34 'Content-Type': 'application/json',
35 'Authorization': `Bearer ${localStorage.getItem('token')}`,
36 },
37 });
38
39 const orderStatusMessage = await response.text();
40 setOrderStatus(orderStatusMessage);
41 if (orderStatusMessage.toLowerCase().includes('review')) {
42 finishOrder();
43 }
44 } catch (error) {
45 console.error('Error checking order status:', error);
46 setOrderStatus('Error checking order status.');
47 }
48 }, [finishOrder]);
49
50 useEffect(() => {
51 const fetchActiveOrder = async () => {
52 try {
53 const response = await fetch('http://localhost:8080/api/orders/active', {
54 method: 'GET',
55 headers: {
56 'Content-Type': 'application/json',
57 'Authorization': `Bearer ${localStorage.getItem('token')}`,
58 },
59 });
60 const order = await response.json();
61 if (order && !order.isFinished) {
62 setOrderId(order.id);
63 localStorage.setItem('orderId', order.id);
64 setIsOrderInProgress(true);
65 localStorage.setItem('isOrderInProgress', true);
66 setIsOrderFinished(false);
67 } else if (order && order.isFinished) {
68 setOrderId(order.id);
69 setIsOrderInProgress(false);
70 setIsOrderFinished(true);
71 }
72 } catch (error) {
73 console.error('Error fetching active order:', error);
74 }
75 };
76
77 if (orderId) {
78 checkOrderStatus(orderId);
79 } else {
80 fetchActiveOrder();
81 }
82 }, [orderId, checkOrderStatus]);
83
84 const startOrder = async (id, items) => {
85 if (!disableNewOrder) {
86 setOrderId(id);
87 localStorage.setItem('orderId', id);
88 setIsOrderInProgress(true);
89 localStorage.setItem('isOrderInProgress', true);
90 setIsOrderFinished(false);
91 }
92 };
93
94 const handleRateNow = () => {
95 setShowRatingModal(false);
96 navigate("/delivery-review")
97 };
98
99 const handleMaybeLater = () => {
100 setShowRatingModal(false);
101 navigate("/")
102 localStorage.removeItem('orderId');
103 window.location.reload();
104 };
105
106 return (
107 <OrderContext.Provider value={{
108 isOrderInProgress,
109 isOrderFinished,
110 orderId,
111 orderStatus,
112 startOrder,
113 finishOrder,
114 checkOrderStatus,
115 }}>
116 {children}
117 {showRatingModal && (
118 <div className={styles.ratingModal}>
119 <div className={styles.ratingModalContent}>
120 <button onClick={handleMaybeLater} className={styles.closeRatingModal}>&times;</button>
121 <h3>Do you want to rate the delivery person?</h3>
122 <div className={styles.ratingButtonGroup}>
123 <button onClick={handleRateNow} className={styles.ratingProceedButton}>Yes</button>
124 <button onClick={handleMaybeLater} className={styles.ratingCloseButton}>Maybe Next Time</button>
125 </div>
126 </div>
127 </div>
128)}
129
130 </OrderContext.Provider>
131 );
132};
Note: See TracBrowser for help on using the repository browser.