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.

ShippingDetailsForm.jsx 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { Box, Button, Paper, TextField } from '@mui/material';
  2. import { useFormik } from 'formik';
  3. import { useRouter } from 'next/router';
  4. import PropType from 'prop-types';
  5. import { useState } from 'react';
  6. import { shippingDetailsSchema } from '../../../schemas/shippingDetailsSchema';
  7. import { useUserData } from '../../../store/user-context';
  8. import ErrorMessageComponent from '../../mui/ErrorMessageComponent';
  9. const ShippingDetailsForm = ({
  10. backBtn = false,
  11. isCheckout = false,
  12. submitHandler,
  13. enableBtn = true,
  14. }) => {
  15. const [error] = useState({ hasError: false, errorMessage: '' });
  16. const { userStorage } = useUserData();
  17. const router = useRouter();
  18. const formikSubmitHandler = async (values) => {
  19. submitHandler(values);
  20. };
  21. const formik = useFormik({
  22. initialValues: {
  23. fullName: userStorage ? userStorage.fullName : '',
  24. address: userStorage ? userStorage.address : '',
  25. address2: userStorage ? userStorage.address2 : '',
  26. city: userStorage ? userStorage.city : '',
  27. country: userStorage ? userStorage.country : '',
  28. postcode: userStorage ? userStorage.postcode : '',
  29. },
  30. validationSchema: shippingDetailsSchema,
  31. onSubmit: formikSubmitHandler,
  32. validateOnBlur: true,
  33. enableReinitialize: true,
  34. });
  35. return (
  36. <Paper
  37. sx={{ p: 3, width: '90%', ml: 12, mt: 2, backgroundColor: '#f2f2f2' }}
  38. elevation={3}
  39. >
  40. <Box
  41. sx={{
  42. width: '100%',
  43. display: 'flex',
  44. flexDirection: 'column',
  45. }}
  46. >
  47. {error.hasError && <ErrorMessageComponent error={error.errorMessage} />}
  48. <Box
  49. component="form"
  50. onSubmit={formik.handleSubmit}
  51. sx={{ position: 'relative', mt: 1, p: 1 }}
  52. >
  53. <TextField
  54. name="fullName"
  55. label="Name"
  56. margin="normal"
  57. value={formik.values.fullName}
  58. onChange={formik.handleChange}
  59. error={formik.touched.fullName && Boolean(formik.errors.fullName)}
  60. helperText={formik.touched.fullName && formik.errors.fullName}
  61. fullWidth
  62. />
  63. <TextField
  64. name="address"
  65. label="Address"
  66. margin="normal"
  67. value={formik.values.address}
  68. onChange={formik.handleChange}
  69. error={formik.touched.address && Boolean(formik.errors.address)}
  70. helperText={formik.touched.address && formik.errors.address}
  71. fullWidth
  72. />
  73. <TextField
  74. name="address2"
  75. label="Address Line 2"
  76. margin="normal"
  77. value={formik.values.address2}
  78. onChange={formik.handleChange}
  79. error={formik.touched.address2 && Boolean(formik.errors.address2)}
  80. helperText={formik.touched.address2 && formik.errors.address2}
  81. fullWidth
  82. />
  83. <TextField
  84. name="city"
  85. label="City"
  86. margin="normal"
  87. value={formik.values.city}
  88. onChange={formik.handleChange}
  89. error={formik.touched.city && Boolean(formik.errors.city)}
  90. helperText={formik.touched.city && formik.errors.city}
  91. fullWidth
  92. />
  93. <Box sx={{ display: 'flex' }}>
  94. <TextField
  95. name="country"
  96. label="Country"
  97. margin="normal"
  98. value={formik.values.country}
  99. onChange={formik.handleChange}
  100. error={formik.touched.country && Boolean(formik.errors.country)}
  101. helperText={formik.touched.country && formik.errors.country}
  102. fullWidth
  103. sx={{ mr: 1.5 }}
  104. />
  105. <TextField
  106. name="postcode"
  107. label="Postal Code"
  108. margin="normal"
  109. value={formik.values.postcode}
  110. onChange={formik.handleChange}
  111. error={formik.touched.postcode && Boolean(formik.errors.postcode)}
  112. helperText={formik.touched.postcode && formik.errors.postcode}
  113. fullWidth
  114. />
  115. </Box>
  116. {backBtn && (
  117. <Button
  118. variant="contained"
  119. sx={{
  120. mt: 3,
  121. mb: 2,
  122. height: 50,
  123. width: 150,
  124. textTransform: 'none',
  125. backgroundColor: 'primary.main',
  126. color: 'white',
  127. mr: 2,
  128. }}
  129. onClick={() => {
  130. router.push('/cart');
  131. }}
  132. >
  133. Back to cart
  134. </Button>
  135. )}
  136. <Button
  137. type="submit"
  138. variant="contained"
  139. sx={{
  140. mt: 3,
  141. mb: 2,
  142. backgroundColor: '#CBA213',
  143. height: 50,
  144. width: isCheckout ? 200 : 150,
  145. textTransform: 'none',
  146. color: 'white',
  147. }}
  148. disabled={!enableBtn}
  149. onClick={() => {
  150. submitHandler;
  151. }}
  152. >
  153. {isCheckout ? 'Proceed to shipping' : 'Submit Details'}
  154. </Button>
  155. </Box>
  156. </Box>
  157. </Paper>
  158. );
  159. };
  160. ShippingDetailsForm.propTypes = {
  161. backBtn: PropType.Boolean,
  162. isCheckout: PropType.Boolean,
  163. submitHandler: PropType.func,
  164. };
  165. export default ShippingDetailsForm;