Skip to content

Commit

Permalink
Merge pull request #2 from fga-eps-mds/feat/esqueci-minha-senha
Browse files Browse the repository at this point in the history
Feat/esqueci minha senha
  • Loading branch information
viniciused26 authored Dec 9, 2024
2 parents ad88089 + 352bfc2 commit 92e7260
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 33 deletions.
55 changes: 26 additions & 29 deletions src/app/components/ForgetButton.tsx
Original file line number Diff line number Diff line change
@@ -1,50 +1,47 @@
import React from "react";
import { ActivityIndicator, Pressable, StyleSheet, Text } from "react-native";
import { ActivityIndicator, StyleSheet, Text } from "react-native";
import { router } from "expo-router";
import { View } from 'react-native';

interface Props {
title: string;
callbackFn: () => unknown;
backgroundColor?: string;
showLoading?: boolean;
}

export default function ForgetButton({
title,
callbackFn,
backgroundColor,
showLoading,
}: Readonly<Props>) {
const background = backgroundColor ?? "#2CCDB5";

const handlePress = () => {
router.push("/private/pages/esqueciSenha");
};

return (
<Pressable
testID="customButtonId"
style={styles(background).button}
onPress={() => callbackFn()}
>
<View>
{showLoading ? (
<ActivityIndicator size="small" color="#fff" />
<ActivityIndicator size="small" color="#0000ff" />
) : (
<Text style={styles(background).buttonText}>{title}</Text>
<Text
style={styles.linkText}
onPress={handlePress}
>
{title}
</Text>
)}
</Pressable>
</View>
);
}

const styles = (backgroundColor: string) =>
StyleSheet.create({
buttonText: {
fontSize: 13,
color: "white",
fontWeight: "300",
},
button: {
width: "30%",
maxWidth: 150,
paddingVertical: 10,
paddingHorizontal: 10,
backgroundColor,
alignItems: "center",
borderRadius: 15,
const styles = StyleSheet.create({
linkText: {
width: "40%",
color: "#2CCDB5",
maxWidth: 300,
textDecorationLine: "underline",
paddingVertical: 12,
paddingHorizontal: 18,
textAlign: "left",
borderRadius: 20,
},
});
103 changes: 103 additions & 0 deletions src/app/private/pages/esqueciSenha.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import React, { useState } from "react";
import { forgotPassword } from "../../services/user.service";
import { Alert, Text, View, TextInput, StyleSheet, TouchableOpacity } from "react-native";
import axios from 'axios';
//import BackButton from "/components/BackButton.tsx"; Não consigo achar esse caminho, preciso fazer rodar... (é o botão q volta pra outra pag)

export default function EsqueciSenha() {
const API_URL = process.env.EXPO_PUBLIC_API_URL;
const API_PORT = process.env.EXPO_PUBLIC_API_USUARIO_PORT;
const BASE_URL = `${API_URL}:${API_PORT}/api/usuario/esqueci-senha`;
const [email, setEmail] = useState("");

const handleRecuperarSenha = async () => {
if (!email) {
Alert.alert("Erro", "Por favor, insira um email válido.");
return;
}
try {
const response = await forgotPassword(email);
console.log("E-mail de recuperação enviado:", response);
} catch (error) {
console.error("Erro ao solicitar recuperação de senha:", error.message);
}
};
return (

<View style={styles.container}>
{/* Logo deveria estar aqui, mas não consegui encaixá-la */}

<Text style={styles.title}>Esqueceu sua senha? </Text>
<Text style={styles.subtitle}>Calma, a GERO te ajuda!! </Text>

<View style={styles.inputContainer}>
<TextInput
style={styles.input}
placeholder="Email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
placeholderTextColor="black"
/>
</View>

<TouchableOpacity style={styles.button} onPress={handleRecuperarSenha}>
<Text style={styles.buttonText}>Recuperar senha</Text>
</TouchableOpacity>
</View>
);
}

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "#FFF",
padding: 16,
},
logo: {
width: 280,
height: 90,
marginBottom: 40,
},
title: {
fontSize: 28,
fontWeight: "300",
textAlign: "center",
marginBottom: 19,
},
subtitle: {
fontSize: 18,
fontWeight: "300",
textAlign: "center",
marginBottom: 10,
},
inputContainer: {
width: "90%",
maxWidth: 400,
borderBottomWidth: 1,
borderBottomColor: "#CCC",
marginBottom: 20,
},
input: {
fontSize: 16,
paddingVertical: 8,
paddingHorizontal: 10,
color: "#333",
width: "100%",
},
button: {
width: "90%",
maxWidth: 200,
backgroundColor: "#2CCDB5",
paddingVertical: 12,
borderRadius: 8,
alignItems: "center",
},
buttonText: {
color: "#FFF",
fontSize: 16,
fontWeight: "600",
},
});
27 changes: 23 additions & 4 deletions src/app/public/login.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import AsyncStorage from "@react-native-async-storage/async-storage";
import { router } from "expo-router";
import React, { useState, useEffect } from "react";
import { Image, StyleSheet, Text, View, TextInput } from "react-native";
import { Image, StyleSheet, Text, View, TextInput, Button } from "react-native";
import Toast from "react-native-toast-message";
import Icon from "react-native-vector-icons/MaterialCommunityIcons";

Expand All @@ -16,20 +16,24 @@ import database from "../db";
import { Collection, Q } from "@nozbe/watermelondb";
import { syncDatabaseWithServer } from "../services/watermelon.service";
import Usuario from "../model/Usuario";
import ForgetButton from "../components/ForgetButton";

interface IErrors {
email?: string;
senha?: string;
}

export default function Login() {
const API_URL = process.env.EXPO_PUBLIC_API_URL;
const API_PORT = process.env.EXPO_PUBLIC_API_USUARIO_PORT;
const BASE_URL = `${API_URL}:${API_PORT}/api/usuario`;
const [email, setEmail] = useState("");
const [senha, setSenha] = useState("");
const [escondeSenha, setEscondeSenha] = useState(true);
const [erros, setErros] = useState<IErrors>({});
const [showErrors, setShowErrors] = useState(false);
const [showLoading, setShowLoading] = useState(false);

const login = async () => {
if (Object.keys(erros).length > 0) {
setShowErrors(true);
Expand All @@ -41,7 +45,7 @@ export default function Login() {
try {
setShowLoading(true);
console.log("Iniciando o login...");

console.log(BASE_URL);
const response = await loginUser(body);
console.log("Resposta do login:", response);

Expand Down Expand Up @@ -242,6 +246,7 @@ export default function Login() {
name={escondeSenha ? "eye-outline" : "eye-off-outline"}
size={20}
/>

</View>
<ErrorMessage show={showErrors} text={erros.senha} />
</View>
Expand All @@ -253,9 +258,16 @@ export default function Login() {
showLoading={showLoading}
/>
</View>

<View style={styles.EsqueciButton}>
<ForgetButton
title="Esqueci minha senha"
showLoading={showLoading}
/>
</View>
</ScrollView>
</View>
);
);
}

const styles = StyleSheet.create({
Expand Down Expand Up @@ -347,4 +359,11 @@ const styles = StyleSheet.create({
eye: {
marginLeft: 100,
},
EsqueciButton: {
marginTop: 35,
alignItems: "center",
justifyContent: "center", // Adicionado para centralizar verticalmente
width: "100%",
flex: 1,
}
});
22 changes: 22 additions & 0 deletions src/app/services/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,28 @@ export const postUser = async (
return json;
};

export const forgotPassword = async (
email: string,
): Promise<IResponse<null>> => {
const response = await fetch(`${BASE_URL}/esqueci-senha`, {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({ email }),
});

const json = await response.json();

if (response.status !== 200) {
throw new Error(json.message as string);
}

return json;
};


export const updateUser = async (
id: number,
body: Partial<IUser>,
Expand Down

0 comments on commit 92e7260

Please sign in to comment.