form.tsx 7.2 KB

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