Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ShippingDetailsForm.tsx 5.7KB

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