Advertisement
AashishAxis

issue

Mar 1st, 2023
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.08 KB | None | 0 0
  1. import React, { Fragment, useEffect, useState } from "react";
  2. import { Link, useNavigate } from "react-router-dom";
  3.  
  4. import MetaData from "../layout/MetaData";
  5. import Loader from "../layout/Loader";
  6.  
  7. import { useParams } from "react-router-dom";
  8. import { useDispatch, useSelector } from "react-redux";
  9.  
  10. import {
  11. ORDER_RESET,
  12. UPDATE_ORDER_RESET,
  13. ORDER_DETAILS_RESET,
  14. } from "../constants/orderConstants";
  15.  
  16. import { toast } from "react-toastify";
  17.  
  18. import {
  19. getOrderDetails,
  20. clearErrors,
  21. updateOrderToBePaid,
  22. } from "../../actions/orderActions";
  23. import { resetCart } from "../../actions/cartActions";
  24. import {
  25. useStripe,
  26. useElements,
  27. CardNumberElement,
  28. CardExpiryElement,
  29. CardCvcElement,
  30. } from "@stripe/react-stripe-js";
  31.  
  32. import axios from "axios";
  33.  
  34. const OrderDetails2 = () => {
  35. const [initialLoading, setInitialLoading] = useState(true);
  36. const dispatch = useDispatch();
  37.  
  38. const { id } = useParams();
  39.  
  40. const { loading, success, error, order } = useSelector(
  41. (state) => state.orderDetails
  42. );
  43. const { isUpdated } = useSelector((state) => state.order);
  44.  
  45. const {
  46. shippingInfo,
  47. orderItems,
  48. paymentInfo,
  49. user,
  50. totalPrice,
  51. orderStatus,
  52. shippingPrice,
  53. taxPrice,
  54. itemsPrice,
  55. paymentMethod,
  56. } = order;
  57.  
  58. const stripe = useStripe();
  59. const elements = useElements();
  60. const queryParams = new URLSearchParams(window.location.search);
  61.  
  62. const refId = queryParams.get("refId")
  63. ? queryParams.get("refId").trim()
  64. : null;
  65.  
  66. useEffect(() => {
  67. if (refId) {
  68. const paymentInfo = {
  69. id: refId,
  70. status: "succeeded",
  71. };
  72. dispatch(updateOrderToBePaid(id, paymentInfo));
  73. if (error) {
  74. toast.error(error);
  75. dispatch(clearErrors());
  76. }
  77. }
  78. }, [refId, error]);
  79.  
  80. useEffect(() => {
  81. dispatch(getOrderDetails(id, initialLoading));
  82. if (error) {
  83. toast.error(error);
  84. dispatch(clearErrors());
  85. }
  86. dispatch({ type: ORDER_RESET });
  87. dispatch(resetCart());
  88. dispatch({ type: UPDATE_ORDER_RESET });
  89. }, [dispatch,error, isUpdated, refId]);
  90.  
  91.  
  92. useEffect(() => {
  93. if (success && initialLoading) {
  94. setInitialLoading(false);
  95. }
  96. }, [success]);
  97.  
  98. const shippingDetails =
  99. shippingInfo &&
  100. `${shippingInfo.address}, ${shippingInfo.city}, ${shippingInfo.postalCode}, ${shippingInfo.country}`;
  101. const isPaid =
  102. paymentInfo && paymentInfo.status === "succeeded" ? true : false;
  103. const paymentData = {
  104. amount: Math.round(totalPrice * 100),
  105. };
  106. const payWithEsewa = () => {
  107. var resultId = "";
  108. var characters =
  109. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  110. var charactersLength = characters.length;
  111. for (var i = 0; i < 14; i++) {
  112. resultId += characters.charAt(
  113. Math.floor(Math.random() * charactersLength)
  114. );
  115. }
  116.  
  117. var path = "https://uat.esewa.com.np/epay/main";
  118. var params = {
  119. amt: order.itemsPrice,
  120. psc: order.shippingPrice,
  121. pdc: 0,
  122. txAmt: order.taxPrice,
  123. tAmt: order.totalPrice,
  124. pid: resultId,
  125. scd: "EPAYTEST",
  126. su: `http://localhost:3000/order/${id}`,
  127. fu: `http://localhost:3000/order/${id}`,
  128. };
  129. var form = document.createElement("form");
  130. form.setAttribute("method", "POST");
  131. form.setAttribute("action", path);
  132.  
  133. Object.keys(params).forEach((key) => {
  134. var hiddenField = document.createElement("input");
  135. hiddenField.setAttribute("type", "hidden");
  136. hiddenField.setAttribute("name", key);
  137. hiddenField.setAttribute("value", params[key]);
  138. form.appendChild(hiddenField);
  139. });
  140.  
  141. document.body.appendChild(form);
  142. form.submit();
  143. };
  144. const submitHandler = async (e) => {
  145. e.preventDefault();
  146.  
  147. document.querySelector("#pay_btn").disabled = true;
  148.  
  149. let res;
  150. try {
  151. const config = {
  152. headers: {
  153. "Content-Type": "application/json",
  154. },
  155. };
  156. res = await axios.post("/api/v1/payment/process", paymentData, config);
  157. console.log(res);
  158.  
  159. const clientSecret = res.data.client_secret;
  160.  
  161. console.log(clientSecret);
  162.  
  163. if (!stripe || !elements) {
  164. return;
  165. }
  166.  
  167. const result = await stripe.confirmCardPayment(clientSecret, {
  168. payment_method: {
  169. card: elements.getElement(CardNumberElement),
  170. billing_details: {
  171. name: user.name,
  172. email: user.email,
  173. },
  174. },
  175. });
  176.  
  177. if (result.error) {
  178. toast.error(result.error.message);
  179. document.querySelector("#pay_btn").disabled = false;
  180. } else {
  181. // The payment is processed or not
  182. if (result.paymentIntent.status === "succeeded") {
  183. const paymentInfo = {
  184. id: result.paymentIntent.id,
  185. status: result.paymentIntent.status,
  186. };
  187. dispatch(updateOrderToBePaid(id, paymentInfo));
  188. } else {
  189. toast.error("There is some issue while payment processing");
  190. }
  191. }
  192. } catch (error) {
  193. document.querySelector("#pay_btn").disabled = false;
  194. toast.error(error.response.data.errMessage);
  195. }
  196. };
  197. return (
  198. <Fragment>
  199. {loading ? (
  200. <Loader />
  201. ) : (
  202. <Fragment>
  203. <MetaData title={"Order Details"} />
  204. <div className="row d-flex justify-content-between">
  205. <div className="col-12 col-lg-8 mt-5 order-details">
  206. <h1 className="my-5">Order # {order._id}</h1>
  207.  
  208. <h4 className="mb-4">Shipping Info</h4>
  209. <p>
  210. <b>Name:</b> {user && user.name}
  211. </p>
  212. <p>
  213. <b>Phone:</b> {shippingInfo && shippingInfo.phoneNo}
  214. </p>
  215. <p className="mb-4">
  216. <b>Address:</b>
  217. {shippingDetails}
  218. </p>
  219.  
  220. <hr />
  221.  
  222. <h4 className="my-4">Payment</h4>
  223. <p className={isPaid ? "greenColor" : "redColor"}>
  224. <b>{isPaid ? "PAID" : "NOT PAID"}</b>
  225. </p>
  226.  
  227. <h4 className="my-4">Order Status:</h4>
  228. <p
  229. className={
  230. order.orderStatus &&
  231. String(order.orderStatus).includes("Delivered")
  232. ? "greenColor"
  233. : "redColor"
  234. }
  235. >
  236. <b>{orderStatus}</b>
  237. </p>
  238.  
  239. <h4 className="my-4">Order Items:</h4>
  240.  
  241. <hr />
  242. <div className="cart-item my-1">
  243. {orderItems &&
  244. orderItems.map((item) => (
  245. <div key={item.product} className="row my-5">
  246. <div className="col-4 col-lg-2">
  247. <img
  248. src={item.image}
  249. alt={item.name}
  250. height="45"
  251. width="65"
  252. />
  253. </div>
  254.  
  255. <div className="col-5 col-lg-5">
  256. <Link to={`/products/${item.product}`}>
  257. {item.name}
  258. </Link>
  259. </div>
  260.  
  261. <div className="col-4 col-lg-2 mt-4 mt-lg-0">
  262. <p>${item.price}</p>
  263. </div>
  264.  
  265. <div className="col-4 col-lg-3 mt-4 mt-lg-0">
  266. <p>{item.quantity} Piece(s)</p>
  267. </div>
  268. </div>
  269. ))}
  270. </div>
  271. <hr />
  272. </div>
  273. <div className="col-lg-4 mt-5 order-summary">
  274. <h1 className="my-5">Order Summary</h1>
  275. <p>
  276. <b>ItemsPrice:</b>
  277. {itemsPrice}
  278. </p>
  279. <p>
  280. <b>ShippingPrice:</b>
  281. {shippingPrice}
  282. </p>
  283. <p>
  284. <b>TaxPrice:</b>
  285. {taxPrice}
  286. </p>
  287. <p>
  288. <b>TotalPrice:</b>
  289. {totalPrice}
  290. </p>
  291. {paymentMethod &&
  292. paymentMethod === "Credit/Debit Card" &&
  293. !isPaid && (
  294. <form className="shadow-lg" onSubmit={submitHandler}>
  295. <h1 className="mb-4">Card Info</h1>
  296. <div className="form-group">
  297. <label htmlFor="card_num_field">Card Number</label>
  298. <CardNumberElement
  299. type="text"
  300. id="card_num_field"
  301. className="form-control"
  302. />
  303. </div>
  304.  
  305. <div className="form-group">
  306. <label htmlFor="card_exp_field">Card Expiry</label>
  307. <CardExpiryElement
  308. type="text"
  309. id="card_exp_field"
  310. className="form-control"
  311. />
  312. </div>
  313.  
  314. <div className="form-group">
  315. <label htmlFor="card_cvc_field">Card CVC</label>
  316. <CardCvcElement
  317. type="text"
  318. id="card_cvc_field"
  319. className="form-control"
  320. />
  321. </div>
  322.  
  323. <button
  324. id="pay_btn"
  325. className="btn btn-primary btn-block"
  326. type="submit"
  327. >
  328. Pay with Stripe
  329. </button>
  330. </form>
  331. )}
  332. {paymentMethod && paymentMethod === "Esewa" && !isPaid && (
  333. <button onClick={payWithEsewa}>Pay With Esewa</button>
  334. )}
  335. </div>
  336. </div>
  337. </Fragment>
  338. )}
  339. </Fragment>
  340. );
  341. };
  342.  
  343. export default OrderDetails2;
  344.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement