# Authentication ## Function 1: Basic Layout (Header, Footer, Navbar, SidebarAdmin) ### Objective Create a foundational layout for the entire system and structure content rendering by route. #### Detailed Tasks - Create directory: ``` src/components/layouts/ ``` - Include: + Header.jsx + Footer.jsx + Navbar.jsx + SidebarAdmin.jsx + LayoutMain.jsx - Use in LayoutMain to render dynamic content. - Navbar changes based on login status: + If not logged in → display "Login / Register" button. + If logged in → display avatar, user name and "Logout" button. - SidebarAdmin only displays with role = admin. ### Expected Results 1. Overall layout displays stably. 2. Navbar displays dynamic content based on user status. 3. Responsive interface, compatible with desktop/mobile. --- ## Function 2: Routing Configuration (react-router-dom) ### Objective Set up a standard routing system with role-based route protection. #### Detailed Tasks - Main route structure: ``` }> } /> } /> } /> } /> } /> } /> } /> } /> } /> ``` - Use ProtectedRoute and AdminRoute to check: + isAuthenticated + role === "admin" ### Expected Results 1. Unauthenticated users are redirected to /login. 2. AdminRoute only allows admin access. 3. All routes work smoothly, no redirect loop errors. --- ## Function 3: useAuthStore (Zustand Store) ### Objective Manage global authentication state (token, userInfo, role). #### Detailed Tasks - Create src/stores/useAuthStore.js - Structure: ``` const useAuthStore = create((set) => ({ token: localStorage.getItem("token") || null, userInfo: JSON.parse(localStorage.getItem("userInfo")) || null, isAuthenticated: !!localStorage.getItem("token"), login: async (credentials) => { ... }, logout: () => { ... }, setUser: (user) => { ... }, resetPassword: async (payload) => { ... }, })); ``` - When login succeeds: + Save token + userInfo to localStorage. - When logout: + Clear localStorage and reset state. ### Expected Results 1. All user information is managed centrally. 2. Maintain login after page reload. 3. Easy access to userInfo in any component. --- ## Function 4: Login Form ### Objective Allow users to log into the system. #### Detailed Tasks - Create LoginPage.jsx - Use React Hook Form + Yup validation: + Valid email + Password ≥ 8 characters - API: ``` POST /api/auth/login ``` - After successful login: + Save token to localStorage. + Call setUser() to update Zustand. + Redirect to /dashboard. + Send email POST /api/notify/login-success. - Enhanced UX: + Loading button when submitting form. + "Show/Hide password". + "Remember me" → save for 7 days. ### Expected Results 1. Login works smoothly, displays clear error messages. 2. Email is sent when login succeeds. 3. Redirect correctly based on user role. --- ## Function 5: Register Form ### Objective Allow users to register a new account. #### Detailed Tasks - Create RegisterPage.jsx - Use React Hook Form + Yup validation: + Full name not empty + Valid email + Password ≥ 8 characters, contains special characters - API: ``` POST /api/auth/register ``` - After successful registration: + Display toast "Registration successful, please login". + Redirect to /login. ### Expected Results 1. Users can create new accounts successfully. 2. Strict validation, smooth UX. 3. Interface consistent with login form. --- ## Function 6: Forgot Password ### Objective Provide functionality to send password reset email. #### Detailed Tasks - Create ForgotPasswordPage.jsx - API: ``` POST /api/auth/forgot-password ``` - After successful send: + Display message "Please check your email to reset password." + Backend sends reset link with token: ``` https://domain.com/reset-password/:token ``` ### Expected Results 1. Email sent successfully. 2. Clear UX, with loading and error messages. 3. User-friendly interface. --- ## Function 7: Reset Password ### Objective Allow users to change password through email link. #### Detailed Tasks - Create ResetPasswordPage.jsx - Validation: + New password ≥ 8 characters, contains special characters + Confirm password matches - API: ``` POST /api/auth/reset-password ``` - After successful password change: + Send confirmation email POST /api/notify/reset-success. + Redirect to /login. ### Expected Results 1. Password updated successfully. 2. Success notification email sent. 3. Protect expired token (invalid token → redirect to forgot-password). --- ## Function 8: Permissions & Route Protection (ProtectedRoute / AdminRoute) ### Objective Block unauthorized access and protect important routes. #### Detailed Tasks - Create ProtectedRoute.jsx component: ``` const ProtectedRoute = ({ children }) => { const { isAuthenticated } = useAuthStore(); const location = useLocation(); return isAuthenticated ? children : ; }; ``` - Create AdminRoute.jsx: ``` const AdminRoute = ({ children }) => { const { userInfo } = useAuthStore(); return userInfo?.role === "admin" ? children : ; }; ``` ### Expected Results 1. Only valid users can access important routes. 2. AdminRoute ensures security for admin module.