From 0f2c4f5ae88d2e39ce0e08b4e129c6d64f018e1f Mon Sep 17 00:00:00 2001 From: Dimas Atmodjo Date: Mon, 16 Dec 2024 02:19:48 +0700 Subject: [PATCH] fixing user forgot pass and reset pass --- src/assets/images/illustration/mail.png | Bin 0 -> 17059 bytes src/roles/guest/PublicRoutes.jsx | 2 + src/roles/guest/auth/hooks/useAuth.jsx | 14 --- src/roles/guest/auth/hooks/useForgot.jsx | 86 +++++++++++++++++ src/roles/guest/auth/services/authService.jsx | 16 ++- src/roles/guest/auth/views/ForgotPass.jsx | 71 ++++++++++---- src/roles/guest/auth/views/ResetPass.jsx | 91 ++++++++++++++++++ 7 files changed, 246 insertions(+), 34 deletions(-) create mode 100644 src/assets/images/illustration/mail.png create mode 100644 src/roles/guest/auth/hooks/useForgot.jsx create mode 100644 src/roles/guest/auth/views/ResetPass.jsx diff --git a/src/assets/images/illustration/mail.png b/src/assets/images/illustration/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..4d073e82e111218e39e4e9c4c8c7110f8732b160 GIT binary patch literal 17059 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 So$%WL0000} /> } /> } /> + } /> ) diff --git a/src/roles/guest/auth/hooks/useAuth.jsx b/src/roles/guest/auth/hooks/useAuth.jsx index 930d266..53d9b2e 100644 --- a/src/roles/guest/auth/hooks/useAuth.jsx +++ b/src/roles/guest/auth/hooks/useAuth.jsx @@ -48,19 +48,6 @@ const useAuth = () => { } }; - const forgotPassword = async (email) => { - setLoading(true); - setError(null); - try { - await authService.forgotPassword(email); - // Handle success response (e.g. navigate to success page) - } catch (err) { - setError(err.message); - } finally { - setLoading(false); - } - }; - const logout = () => { authService.logout(); setUser(null); @@ -85,7 +72,6 @@ const useAuth = () => { error, login, register, - forgotPassword, logout, getUserFromToken, }; diff --git a/src/roles/guest/auth/hooks/useForgot.jsx b/src/roles/guest/auth/hooks/useForgot.jsx new file mode 100644 index 0000000..8614609 --- /dev/null +++ b/src/roles/guest/auth/hooks/useForgot.jsx @@ -0,0 +1,86 @@ +import { useState } from 'react'; +import authService from '../services/authService'; +import { useNavigate } from 'react-router-dom'; + +const useForgot = () => { + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const [pass, setPass] = useState(''); + const [confirmPass, setConfirmPass] = useState(''); + + + const navigate = useNavigate(); + + const [showLoader, setShowLoader] = useState(false); + const [modalMessage, setModalMessage] = useState(''); + const [modalType, setModalType] = useState(''); + + const forgotPassword = async () => { + setLoading(true); + setError(null); + const dataForgot = { + EMAIL : user + } + try { + await authService.forgotPassword(dataForgot); + setLoading(false); + setUser(''); + setModalType("SUCCESS"); + handleShowLoader("We've sent a link to your email to help you reset your password. Please check your inbox to continue."); + } catch (err) { + setLoading(false); + setModalType("ERROR") + handleShowLoader(err.message); + } + }; + + const updatePassword = async (token) => { + setLoading(true); + setError(null); + const dataReset = { + TOKEN : token, + NEW_PASSWORD: pass, + CONFIRM_NEW_PASSWORD: confirmPass + } + try { + await authService.resetPass(dataReset); + setLoading(false); + setUser(''); + setModalType("SUCCESS"); + handleShowLoader("Your password has been successfully reset. Please login with your new password."); + } catch (err) { + setLoading(false); + setModalType("ERROR") + handleShowLoader(err.message); + } + }; + + const handleCloseLoader = () => setShowLoader(false); + const handleShowLoader = (message) => { + setShowLoader(true); + setModalMessage(message); + }; + + return { + user, + setUser, + forgotPassword, + loading, + error, + showLoader, + handleShowLoader, + handleCloseLoader, + modalMessage, + modalType, + + pass, + setPass, + confirmPass, + setConfirmPass, + updatePassword + }; +}; + +export default useForgot; diff --git a/src/roles/guest/auth/services/authService.jsx b/src/roles/guest/auth/services/authService.jsx index 3307f0f..26297f9 100644 --- a/src/roles/guest/auth/services/authService.jsx +++ b/src/roles/guest/auth/services/authService.jsx @@ -44,9 +44,18 @@ const register = async (endpoint, data) => { } }; -const forgotPassword = async (email) => { +const forgotPassword = async (EMAIL) => { try { - const response = await axios.post(`${API_URL}/forgot-password`, { email }); + const response = await axios.post(`${API_URL}/forgotPassword`, EMAIL); + return response.data; + } catch (error) { + throw new Error(error.response?.data?.message || 'Password reset failed'); + } +}; + +const resetPass = async (data) => { + try { + const response = await axios.post(`${API_URL}/resetPassword`, data); return response.data; } catch (error) { throw new Error(error.response?.data?.message || 'Password reset failed'); @@ -72,5 +81,6 @@ export default { register, forgotPassword, logout, - validateEmail + validateEmail, + resetPass }; diff --git a/src/roles/guest/auth/views/ForgotPass.jsx b/src/roles/guest/auth/views/ForgotPass.jsx index 873f3f7..507d19e 100644 --- a/src/roles/guest/auth/views/ForgotPass.jsx +++ b/src/roles/guest/auth/views/ForgotPass.jsx @@ -1,10 +1,28 @@ -import React from 'react'; -import useAuth from '../hooks/useAuth'; -import { Container, Row, Col, Form, Button } from 'react-bootstrap'; +import React, { useState }from 'react'; +import useAuth from '../hooks/useForgot'; +import { Container, Row, Col, Form, Button, Modal } from 'react-bootstrap'; + import illustration from '../../../../assets/images/illustration/IllustrationForgot.png'; +import successIllustration from '../../../../assets/images/illustration/mail.png'; const ForgotPage = () => { - const { username, setUsername, password, setPassword, handleLogin, error } = useLogin(); + const { + user, + setUser, + forgotPassword, + loading, + error, + showLoader, + handleShowLoader, + handleCloseLoader, + modalMessage, + modalType + } = useAuth(); + + const onSubmit = async (e) => { + e.preventDefault(); + await forgotPassword(); + }; return ( @@ -22,24 +40,43 @@ const ForgotPage = () => { Enter your email and wait for a link to reset the password.

-
- - Email Address * - setUsername(e.target.value)} - /> - - - {error &&

{error}

} -

Remember the password? Just Log In

+ + + Email Address * + setUser(e.target.value)} + /> + + + + {error &&

{error}

} + +

Remember the password? Just Log In

+ + {modalType === "ERROR"?( + +

ERROR!

+ +

{modalMessage}

+ +
+ ):( + +

Check Email!

+ +

{modalMessage}

+ Check Email +
+ )} +
); }; diff --git a/src/roles/guest/auth/views/ResetPass.jsx b/src/roles/guest/auth/views/ResetPass.jsx new file mode 100644 index 0000000..dc21d88 --- /dev/null +++ b/src/roles/guest/auth/views/ResetPass.jsx @@ -0,0 +1,91 @@ +import React, { useEffect }from 'react'; +import useAuth from '../hooks/useForgot'; +import { Container, Row, Col, Form, Button, Modal } from 'react-bootstrap'; +import { Link, useParams } from 'react-router-dom'; + +import illustration from '../../../../assets/images/illustration/changePass.png'; +import successIllustration from '../../../../assets/images/illustration/successModal.png'; +import ask from '../../../../assets/images/illustration/IllustrationForgot.png'; + +const ResetPass = () => { + const { token } = useParams(); + const { + pass, + setPass, + confirmPass, + setConfirmPass, + + updatePassword, + loading, + showLoader, + handleCloseLoader, + modalMessage, + modalType + } = useAuth(); + + const onSubmit = async (e) => { + e.preventDefault(); + await updatePassword(token); + }; + + return ( + + + +
+ +
+ + +
+

Forgot Password?

+

+ Don’t worry, we will help you...
+ Enter your email and wait for a link to reset the password. +

+
+
+ + New Password * + setPass(e.target.value)} + /> + + + Confirm New Password * + setConfirmPass(e.target.value)} + /> + + +
+
+
+ +
+ + {modalType === "ERROR"?( + +

ERROR!

+ +

{modalMessage}

+ +
+ ):( + +

All Set!

+ +

{modalMessage}

+ Login +
+ )} +
+
+ ); +}; + +export default ResetPass;