form.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import { useState } from 'react';
  2. import { View, Text, StyleSheet, Pressable, TouchableWithoutFeedback, Keyboard } from 'react-native';
  3. import Verification from './formPages/verification';
  4. import BasicInformation from './formPages/basicInformation';
  5. import CarInformation from './formPages/carInformation';
  6. import PaginationIndicator from '../../global/PaginationIndicator';
  7. import CreateWallet from './formPages/createWallet';
  8. import FinishSignUp from './formPages/finishSignUp';
  9. import LoginPage from './formPages/loginPage';
  10. import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
  11. import ChooseCarBrand from './formPages/chooseCarPage/carBrand';
  12. import ChooseCarSeries from './formPages/chooseCarPage/carSeries';
  13. import ChooseCarModel from './formPages/chooseCarPage/carModel';
  14. import ForgetPasswordForm from '../../forgetPasswordMultiStepForm/forgetPasswordForm';
  15. import BindingMultiStepForm from '../../bindingMultiStepForm/bindingMultiStepForm';
  16. import { useTranslation } from '../../../util/hooks/useTranslation';
  17. type FormProps = {};
  18. const Form: React.FC<FormProps> = ({}) => {
  19. const { t } = useTranslation(); // 使用翻译钩子
  20. const [screen, setScreen] = useState<number>(0);
  21. const FormTitle = [
  22. '',
  23. t('register.phone_verification'),
  24. t('register.basic_info'),
  25. t('register.basic_info'),
  26. t('register.create_wallet')
  27. ];
  28. const ScreenDisplay = () => {
  29. switch (screen) {
  30. case 0:
  31. return (
  32. <LoginPage
  33. goToNextPage={goToNextPage}
  34. goToForgetPassWordPage={goToForgetPassWordPage}
  35. goToBindingPhoneNumberPage={goToBindingPhoneNumberPage}
  36. />
  37. );
  38. case 1:
  39. return <Verification setScreen={setScreen} />;
  40. case 2:
  41. return <BasicInformation goToNextPage={goToNextPage} />;
  42. case 3:
  43. return <CreateWallet goToNextPage={goToNextPage} />;
  44. case 4:
  45. return <FinishSignUp />;
  46. case 6:
  47. return (
  48. <ChooseCarBrand
  49. goToCarInformation={goToCarInformation}
  50. goToChooseCarSeriesPage={goToChooseCarSeriesPage}
  51. />
  52. );
  53. case 7:
  54. return (
  55. <ChooseCarSeries
  56. goToChooseCarBrandPage={goToChooseCarBrandPage}
  57. goToChooseCarModelPage={goToChooseCarModelPage}
  58. />
  59. );
  60. case 8:
  61. return (
  62. <ChooseCarModel
  63. goToChooseCarSeriesPage={goToChooseCarSeriesPage}
  64. goToCarInformation={goToCarInformation}
  65. />
  66. );
  67. case 9:
  68. return <ForgetPasswordForm />;
  69. case 11:
  70. return <BindingMultiStepForm />;
  71. default:
  72. return <></>;
  73. }
  74. };
  75. const goToPreviousPage = () => {
  76. setScreen((prevState) => {
  77. if (prevState > 0) {
  78. return prevState - 1;
  79. } else {
  80. return prevState;
  81. }
  82. });
  83. };
  84. const goToNextPage = () => {
  85. setScreen((prevState) => {
  86. if (prevState < 6) {
  87. return prevState + 1;
  88. } else {
  89. return prevState;
  90. }
  91. });
  92. };
  93. const goToChooseCarBrandPage = () => {
  94. setScreen((prevState) => {
  95. return 6;
  96. });
  97. };
  98. const goToChooseCarSeriesPage = () => {
  99. setScreen((prevState) => {
  100. return 7;
  101. });
  102. };
  103. const goToChooseCarModelPage = () => {
  104. setScreen((prevState) => {
  105. return 8;
  106. });
  107. };
  108. const goToCarInformation = () => {
  109. setScreen((prevState) => {
  110. return 4;
  111. });
  112. };
  113. const goToForgetPassWordPage = () => {
  114. setScreen((prevState) => {
  115. return 9;
  116. });
  117. };
  118. const goToBindingPhoneNumberPage = () => {
  119. setScreen((prevState) => {
  120. return 11;
  121. });
  122. };
  123. return (
  124. <KeyboardAwareScrollView
  125. enableOnAndroid={true}
  126. // resetScrollToCoords={{ x: 0, y: 0 }}
  127. >
  128. {/* not showing title and pagination on the first and last page */}
  129. {screen == 0 ||
  130. (screen < 4 && (
  131. //dismiss keyboard when user click outside of the input field to improve user experience
  132. <TouchableWithoutFeedback onPress={() => Keyboard.dismiss()}>
  133. <View style={styles.topContainer}>
  134. <Text style={styles.text}>{FormTitle[screen]}</Text>
  135. <View style={styles.breakline} />
  136. <View style={styles.previouspageAndPaginationWrapper}>
  137. <Pressable onPress={goToPreviousPage}>
  138. <Text style={{ color: '#888888' }}>{t('common.previous')}</Text>
  139. </Pressable>
  140. <PaginationIndicator totalPages={FormTitle.length} currentPage={screen} />
  141. <Pressable disabled={true} onPress={goToNextPage}>
  142. <Text
  143. style={{
  144. color: '#888888',
  145. opacity: 0
  146. }}
  147. >{t('common.next')}</Text>
  148. </Pressable>
  149. </View>
  150. </View>
  151. </TouchableWithoutFeedback>
  152. ))}
  153. <View style={styles.bottomContainer}>{ScreenDisplay()}</View>
  154. </KeyboardAwareScrollView>
  155. );
  156. };
  157. const styles = StyleSheet.create({
  158. topContainer: {
  159. flex: 1,
  160. alignItems: 'center',
  161. justifyContent: 'center',
  162. paddingBottom: '20%',
  163. paddingTop: '15%'
  164. },
  165. previouspageAndPaginationWrapper: {
  166. display: 'flex',
  167. width: '100%',
  168. flexDirection: 'row',
  169. justifyContent: 'space-between',
  170. alignItems: 'center',
  171. paddingHorizontal: 25
  172. },
  173. bottomContainer: { flex: 2.5 },
  174. breakline: {
  175. width: 24,
  176. height: 1,
  177. backgroundColor: '#000000',
  178. marginVertical: 17
  179. },
  180. text: { fontSize: 24, fontWeight: '300' }
  181. });
  182. export default Form;