index.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { FC, useEffect, useState } from 'react';
  2. import { View } from 'react-native';
  3. import { NavigationProp, useNavigation, CommonActions } from '@react-navigation/native';
  4. import { Formik } from 'formik';
  5. import * as yup from 'yup';
  6. import { Header, Input, Button, BigText, PageWrapper, WarningModal } from '../../components';
  7. import { ButtonVariants } from '../../types/components';
  8. import { StoreType, storage } from '../../storage';
  9. import { NAVIGATION_PAGES } from '../../types';
  10. import { useLoginMutation } from '@api/auth';
  11. import { fetchAndSaveStatistics } from 'src/database/statisticsService';
  12. import { useNetInfo } from '@react-native-community/netinfo';
  13. type Props = {
  14. navigation: NavigationProp<any>;
  15. };
  16. const LoginSchema = yup.object({
  17. login: yup.string().required(),
  18. pass: yup.string().required()
  19. });
  20. const LoginScreen: FC<Props> = ({ navigation }) => {
  21. const { dispatch } = useNavigation();
  22. const isFirstLaunch = storage.get('isFirstLaunch', StoreType.BOOLEAN) ?? true;
  23. const { data, mutate: userLogin } = useLoginMutation();
  24. const updateLocalData = async (token: string) => {
  25. await fetchAndSaveStatistics(token);
  26. };
  27. const [isWarningModalVisible, setIsWarningModalVisible] = useState(false);
  28. const netInfo = useNetInfo();
  29. useEffect(() => {
  30. if (data && data.token) {
  31. storage.set('token', data.token);
  32. storage.set('uid', data.uid.toString());
  33. storage.set('isFirstLaunch', false);
  34. updateLocalData(data.token);
  35. isFirstLaunch
  36. ? dispatch(
  37. CommonActions.reset({
  38. index: 1,
  39. routes: [{ name: NAVIGATION_PAGES.INFO }]
  40. })
  41. )
  42. : dispatch(
  43. CommonActions.reset({
  44. index: 1,
  45. routes: [{ name: NAVIGATION_PAGES.IN_APP }]
  46. })
  47. );
  48. }
  49. }, [data]);
  50. return (
  51. <PageWrapper>
  52. <Header label={'Login'} />
  53. <Formik
  54. initialValues={{
  55. login: '',
  56. pass: ''
  57. }}
  58. onSubmit={({ login, pass }) => {
  59. if (netInfo?.isInternetReachable || netInfo?.isConnected) {
  60. userLogin({
  61. login,
  62. pass
  63. });
  64. } else {
  65. setIsWarningModalVisible(true);
  66. }
  67. }}
  68. validationSchema={LoginSchema}
  69. >
  70. {(props) => (
  71. <>
  72. <View style={{ gap: 15 }}>
  73. <BigText>Welcome back</BigText>
  74. <Input
  75. header={'Email address'}
  76. placeholder={'Email or login'}
  77. inputMode={'email'}
  78. onChange={props.handleChange('login')}
  79. value={props.values.login}
  80. onBlur={props.handleBlur('login')}
  81. formikError={
  82. data?.result_description || (props.touched.login && props.errors.login)
  83. }
  84. />
  85. <Input
  86. header={'Password'}
  87. isPrivate={true}
  88. placeholder={'Login'}
  89. onChange={props.handleChange('pass')}
  90. value={props.values.pass}
  91. onBlur={props.handleBlur('pass')}
  92. formikError={data?.result_description || (props.touched.pass && props.errors.pass)}
  93. />
  94. </View>
  95. <View style={{ gap: 30, marginTop: '5%' }}>
  96. <Button
  97. variant={ButtonVariants.TEXT}
  98. onPress={() => navigation.navigate(NAVIGATION_PAGES.RESET_PASSWORD)}
  99. >
  100. Forgot password
  101. </Button>
  102. <Button onPress={props.handleSubmit}>Login</Button>
  103. </View>
  104. </>
  105. )}
  106. </Formik>
  107. <WarningModal
  108. isVisible={isWarningModalVisible}
  109. onClose={() => setIsWarningModalVisible(false)}
  110. type="offline"
  111. />
  112. </PageWrapper>
  113. );
  114. };
  115. export default LoginScreen;