Skip to content

Commit

Permalink
Merge pull request #100 from bambu-group-03/recover_password
Browse files Browse the repository at this point in the history
Recover password
  • Loading branch information
LuisCusihuaman committed Dec 1, 2023
2 parents 7384442 + ebfa029 commit b9d7405
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/navigation/auth-navigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as React from 'react';
import { useAuth } from '@/core';
import { Login } from '@/screens';
import { Pressable, View } from '@/ui';
import { RecoverPasswordScreen } from '@/screens/login/recover-password-screen';

export const GoToLogout = () => {
const status = useAuth.use.status();
Expand All @@ -24,6 +25,7 @@ export const GoToLogout = () => {

export type AuthStackParamList = {
Login: undefined;
RecoverPasswordScreen: { email: string };
};
const Stack = createNativeStackNavigator<AuthStackParamList>();

Expand All @@ -37,6 +39,10 @@ export const AuthNavigator = () => {
headerShown: false,
}}
/>
<Stack.Screen
name="RecoverPasswordScreen"
component={RecoverPasswordScreen}
/>
</Stack.Navigator>
);
};
2 changes: 2 additions & 0 deletions src/navigation/types.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import type { ProfileStackParamList } from '../screens/profile/profile-navigator
import type { AuthStackParamList } from './auth-navigator';
import type { FeedStackParamList } from './feed-navigator';
import type { NotificationReceivedStackParamList } from './notification-handlers';
import { LoginStackParamList } from '@/screens/login/login-navigator';

Check failure on line 12 in src/navigation/types.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

All imports in the declaration are only used as types. Use `import type`

// TODO: change, this must be dynamic
export type RootStackParamList = AuthStackParamList &
Expand All @@ -18,6 +19,7 @@ export type RootStackParamList = AuthStackParamList &
UserStackParamList &
NotificationStackParamList &
NotificationReceivedStackParamList &
LoginStackParamList &
SearchStackParamList;

declare global {
Expand Down
14 changes: 13 additions & 1 deletion src/screens/login/firebase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@ auth.onIdTokenChanged(async (user) => {
});
const db = getFirestore(app);

// Send password reset email
const resetPasswordEmail = async (email: string) => {
try {
await sendPasswordResetEmail(auth, email);
console.log('Password reset email sent successfully.');
} catch (error) {
console.error('Error sending password reset email:', error);
}

return;
};

const logInWithEmailAndPassword = async (email: string, password: string) => {
let userCred: UserCredential | null = null;

Expand Down Expand Up @@ -117,7 +129,6 @@ const registerWithEmailAndPassword = async (
const sendPasswordReset = async (email: string) => {
try {
await sendPasswordResetEmail(auth, email);
console.error('Password reset link sent!');
} catch (err) {
console.error(err);
}
Expand Down Expand Up @@ -150,4 +161,5 @@ export {
registerIntoDb,
registerWithEmailAndPassword,
sendPasswordReset,
resetPasswordEmail,
};
22 changes: 21 additions & 1 deletion src/screens/login/login-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import type { SubmitHandler } from 'react-hook-form';
import { useForm } from 'react-hook-form';
import * as z from 'zod';

import { Image } from '@/ui';
import { Image, TouchableOpacity } from '@/ui';
import { Button, ControlledInput, Text, View } from '@/ui';
import { useNavigation } from '@react-navigation/native';
import { ResetFormProps } from './recover-password-screen';

Check failure on line 10 in src/screens/login/login-form.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'ResetFormProps' is defined but never used

const schema = z.object({
name: z.string().optional(),
Expand Down Expand Up @@ -37,6 +39,9 @@ export const LoginForm = ({
const { handleSubmit, control } = useForm<FormType>({
resolver: zodResolver(schema),
});

let navigate = useNavigation();

return (
<View className="flex-1 justify-center p-4 ">
<Image
Expand Down Expand Up @@ -64,6 +69,21 @@ export const LoginForm = ({
secureTextEntry={true}
/>

<TouchableOpacity
onPress={() =>
navigate.navigate('RecoverPasswordScreen', {
email: '',
})
}
>
<Text
testID="forgot-password"
className="text-right py-2 text-blue-600"

Check warning on line 81 in src/screens/login/login-form.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

Invalid Tailwind CSS classnames order
>
Forgot Password?
</Text>
</TouchableOpacity>

<Button
testID="login-button"
label="Login with Google"
Expand Down
22 changes: 22 additions & 0 deletions src/screens/login/login-navigator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { createNativeStackNavigator } from '@react-navigation/native-stack';

Check failure on line 1 in src/screens/login/login-navigator.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

Run autofix to sort these imports!
import * as React from 'react';
import { FormType, RecoverPasswordScreen } from './recover-password-screen';

Check failure on line 3 in src/screens/login/login-navigator.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'FormType' is defined but never used

Check failure on line 3 in src/screens/login/login-navigator.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'RecoverPasswordScreen' is defined but never used
import Login from '.';
import { SubmitHandler } from 'react-hook-form';

Check failure on line 5 in src/screens/login/login-navigator.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'SubmitHandler' is defined but never used

export type LoginStackParamList = {
Login: undefined;
RecoverPasswordScreen: {
email: string;
};
};

const Stack = createNativeStackNavigator<LoginStackParamList>();

export const LoginNavigator = () => {
return (
<Stack.Navigator>
<Stack.Screen name="Login" component={Login} />
</Stack.Navigator>
);
};
75 changes: 75 additions & 0 deletions src/screens/login/recover-password-screen.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { View, Text, ControlledInput, Button } from '@/ui';
import { LoginStackParamList } from './login-navigator';
import { RouteProp, useNavigation, useRoute } from '@react-navigation/native';
import { useState } from 'react';
import * as z from 'zod';
import { SubmitHandler, useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { sendPasswordReset } from './firebase';

const onResetSubmit: ResetFormProps['onResetSubmit'] = (data) => {
try {
sendPasswordReset(data.email).then(() => {});
} catch (err) {
console.error(err);
}
};

const schema = z.object({
email: z
.string({
required_error: 'Email is required',
})
.email('Invalid email format'),
});

export type FormType = z.infer<typeof schema>;

export type ResetFormProps = {
onResetSubmit?: SubmitHandler<FormType>;
};

export const RecoverPasswordScreen = () => {
const route =
useRoute<RouteProp<LoginStackParamList, 'RecoverPasswordScreen'>>();
const { email } = route.params;

const [emailRecover, setEmailRecover] = useState(email);

const { handleSubmit, control } = useForm<FormType>({
resolver: zodResolver(schema),
});

let navigate = useNavigation();

return (
<View className="flex-1 justify-center p-4 ">

Check warning on line 46 in src/screens/login/recover-password-screen.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'React' must be in scope when using JSX
<Text testID="form-title" variant="h1" className="pb-6 text-center">

Check warning on line 47 in src/screens/login/recover-password-screen.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'React' must be in scope when using JSX
Reset Password
</Text>

<ControlledInput

Check warning on line 51 in src/screens/login/recover-password-screen.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'React' must be in scope when using JSX
testID="email-input"
placeholder={emailRecover}
control={control}
name="email"
label="Email"
/>
<Button

Check warning on line 58 in src/screens/login/recover-password-screen.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'React' must be in scope when using JSX
testID="login-button"
label="Reset Password"
onPress={handleSubmit(onResetSubmit)}
variant="primary"
/>

<Button

Check warning on line 65 in src/screens/login/recover-password-screen.tsx

View workflow job for this annotation

GitHub Actions / Lint TS (eslint, prettier)

'React' must be in scope when using JSX
testID="go-back-button"
label="Volver atras"
onPress={() => {
navigate.navigate('Login');
}}
variant="primary"
/>
</View>
);
};

0 comments on commit b9d7405

Please sign in to comment.