form.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 UberDriver from "./formPages/uberDriver";
  6. import CarInformation from "./formPages/carInformation";
  7. import PaginationIndicator from "../../global/PaginationIndicator";
  8. import { SignUpFormData, SignUpFormDataKey } from "../../../types/signup";
  9. import CreateWallet from "./formPages/createWallet";
  10. import FinishSignUp from "./formPages/finishSignUp";
  11. import LoginPage from "./formPages/loginPage";
  12. import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view";
  13. type FormProps = {
  14. formData: SignUpFormData;
  15. setFormData: React.Dispatch<React.SetStateAction<SignUpFormData>>;
  16. };
  17. const Form: React.FC<FormProps> = ({ formData, setFormData }) => {
  18. const [screen, setScreen] = useState<number>(0);
  19. const FormTitle = [
  20. "",
  21. "註冊 - 電話驗證",
  22. "註冊 - 基本資料",
  23. "註冊 - Uber Driver",
  24. "註冊 - 車輛資料",
  25. "註冊 - 設立銀包",
  26. ];
  27. const handleFormDataChange = <K extends SignUpFormDataKey>(field: K, value: SignUpFormData[K]) => {
  28. setFormData((prevFormData) => ({
  29. ...prevFormData,
  30. [field]: value,
  31. }));
  32. };
  33. const ScreenDisplay = () => {
  34. switch (screen) {
  35. case 0:
  36. return <LoginPage goToNextPage={goToNextPage} />;
  37. case 1:
  38. return (
  39. <Verification
  40. setScreen={setScreen}
  41. formData={formData}
  42. handleFormDataChange={handleFormDataChange}
  43. />
  44. );
  45. case 2:
  46. return (
  47. <BasicInformation
  48. formData={formData}
  49. handleFormDataChange={handleFormDataChange}
  50. goToNextPage={goToNextPage}
  51. />
  52. );
  53. case 3:
  54. return (
  55. <UberDriver
  56. formData={formData}
  57. handleFormDataChange={handleFormDataChange}
  58. goToNextPage={goToNextPage}
  59. />
  60. );
  61. case 4:
  62. return (
  63. <CarInformation
  64. formData={formData}
  65. handleFormDataChange={handleFormDataChange}
  66. goToNextPage={goToNextPage}
  67. />
  68. );
  69. case 5:
  70. return (
  71. <CreateWallet
  72. formData={formData}
  73. handleFormDataChange={handleFormDataChange}
  74. goToNextPage={goToNextPage}
  75. />
  76. );
  77. case 6:
  78. return <FinishSignUp />;
  79. default:
  80. return <></>;
  81. }
  82. };
  83. const goToPreviousPage = () => {
  84. setScreen((prevState) => {
  85. if (prevState > 0) {
  86. return prevState - 1;
  87. } else {
  88. return prevState;
  89. }
  90. });
  91. };
  92. const goToNextPage = () => {
  93. setScreen((prevState) => {
  94. if (prevState < 6) {
  95. return prevState + 1;
  96. } else {
  97. return prevState;
  98. }
  99. });
  100. };
  101. return (
  102. <>
  103. <KeyboardAwareScrollView enableOnAndroid={true} resetScrollToCoords={{ x: 0, y: 0 }}>
  104. {/* not showing title and pagination on the first and last page */}
  105. {screen == 0 ||
  106. (screen < 6 && (
  107. //dismiss keyboard when user click outside of the input field to improve user experience
  108. <TouchableWithoutFeedback onPress={() => Keyboard.dismiss()}>
  109. <View style={styles.topContainer}>
  110. <Text style={styles.text}>{FormTitle[screen]}</Text>
  111. <View style={styles.breakline} />
  112. <View style={styles.previouspageAndPaginationWrapper}>
  113. <Pressable onPress={goToPreviousPage}>
  114. <Text style={{ color: "#888888" }}>{`< 上一步`}</Text>
  115. </Pressable>
  116. <PaginationIndicator totalPages={FormTitle.length} currentPage={screen} />
  117. <Pressable disabled={true} onPress={goToNextPage}>
  118. <Text style={{ color: "#888888", opacity: 0 }}>{`下一步 >`}</Text>
  119. </Pressable>
  120. </View>
  121. </View>
  122. </TouchableWithoutFeedback>
  123. ))}
  124. <View style={styles.bottomContainer}>{ScreenDisplay()}</View>
  125. </KeyboardAwareScrollView>
  126. </>
  127. );
  128. };
  129. const styles = StyleSheet.create({
  130. topContainer: { flex: 1, alignItems: "center", justifyContent: "center", paddingBottom: "20%", paddingTop: "15%" },
  131. previouspageAndPaginationWrapper: {
  132. display: "flex",
  133. width: "100%",
  134. flexDirection: "row",
  135. justifyContent: "space-between",
  136. alignItems: "center",
  137. paddingHorizontal: 25,
  138. },
  139. bottomContainer: { flex: 2.5 },
  140. breakline: { width: 24, height: 1, backgroundColor: "#000000", marginVertical: 17 },
  141. text: { fontSize: 24, fontWeight: "300" },
  142. });
  143. export default Form;