您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ShippingDetailsForm.tsx 5.6KB

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