You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ShippingContent.jsx 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { Checkbox, FormControlLabel } from '@mui/material';
  2. import { Box } from '@mui/system';
  3. import { useRouter } from 'next/router';
  4. import { setCookie } from 'nookies';
  5. import { useEffect, useState } from 'react';
  6. import {
  7. useCheckoutData,
  8. useCheckoutDataUpdate,
  9. } from '../../store/checkout-context';
  10. import { stripe } from '../../utils/helpers/stripe';
  11. import CardContainer from '../cards/card-container/CardContainer';
  12. import DataCard from '../cards/data-card/DataCard';
  13. import ContentContainer from '../layout/content-wrapper/ContentContainer';
  14. import PageWrapper from '../layout/page-wrapper/PageWrapper';
  15. import StepTitle from '../layout/steps-title/StepTitle';
  16. import PageDescription from '../page-description/PageDescription';
  17. import ButtonGroup from './shipping-btnGroup/ButtonGroup';
  18. import ShippingData from './shipping-data/ShippingData';
  19. import ShippingModal from './shipping-modal/ShippingModal';
  20. const ShippingContent = () => {
  21. const { checkoutStorage } = useCheckoutData();
  22. const { changeContact, changeShippingData } = useCheckoutDataUpdate();
  23. const [open, setOpen] = useState({ isOpen: false, type: '' });
  24. const [checkoutData, setCheckoutData] = useState({});
  25. const router = useRouter();
  26. useEffect(() => {
  27. setCheckoutData(checkoutStorage);
  28. }, [checkoutStorage]);
  29. const handleOpen = (type) => setOpen({ isOpen: true, type });
  30. const handleClose = () => setOpen({ isOpen: false, type: '' });
  31. const handleChangeShipping = (values) => {
  32. changeShippingData(values);
  33. handleClose();
  34. };
  35. const handleChangeContact = (values) => {
  36. changeContact(values);
  37. handleClose();
  38. };
  39. const handleStripePayment = () => {
  40. stripe({
  41. lineItems: checkoutData.products.map((el) => ({
  42. price: el.product.stripeID,
  43. quantity: el.quantity,
  44. })),
  45. userInfo: checkoutData.userInfo,
  46. });
  47. setCookie(null, 'review-session', 'active', {
  48. maxAge: 3600,
  49. expires: new Date(Date.now() + 3600),
  50. path: '/',
  51. });
  52. };
  53. const handleBackToCart = () => {
  54. router.replace('/cart');
  55. };
  56. const mapProductsToDom = () => {
  57. return checkoutData?.products?.map((entry, i) => (
  58. <DataCard
  59. key={i}
  60. data={entry.product}
  61. quantity={entry.quantity}
  62. ></DataCard>
  63. ));
  64. };
  65. return (
  66. <PageWrapper>
  67. <StepTitle
  68. title="Shipping"
  69. breadcrumbsArray={['Cart', 'Checkout', 'Shipping']}
  70. />
  71. <PageDescription
  72. description="The following fields will be used as the shipping details for your
  73. order"
  74. />
  75. <ContentContainer>
  76. <Box flexGrow={1} sx={{ minWidth: '65%' }}>
  77. <ShippingData
  78. email={checkoutData?.userInfo?.email}
  79. address={checkoutData?.userInfo?.address}
  80. city={checkoutData?.userInfo?.city}
  81. postcode={checkoutData?.userInfo?.postcode}
  82. handleOpen={handleOpen}
  83. />
  84. <Box
  85. sx={{
  86. display: 'flex',
  87. justifyContent: 'space-between',
  88. backgroundColor: '#f2f2f2',
  89. alignItems: 'center',
  90. mb: 2,
  91. width: { sm: '200px' },
  92. borderRadius: 2,
  93. p: 1,
  94. }}
  95. >
  96. <FormControlLabel
  97. control={<Checkbox checked disabled />}
  98. label="Free Shipping"
  99. sx={{ color: 'black', ml: 2 }}
  100. />
  101. </Box>
  102. <ButtonGroup
  103. handleStripePayment={handleStripePayment}
  104. handleBackToCart={handleBackToCart}
  105. />
  106. </Box>
  107. <CardContainer>{mapProductsToDom()}</CardContainer>
  108. </ContentContainer>
  109. <ShippingModal
  110. open={open}
  111. handleClose={handleClose}
  112. handleChangeShipping={handleChangeShipping}
  113. handleChangeContact={handleChangeContact}
  114. />
  115. </PageWrapper>
  116. );
  117. };
  118. export default ShippingContent;