# ✅ Frontend Profile Page Implementation Checklist ## ⚙️ Tooling & Fixes - [ ] Install and configure `react-hook-form` ``` npm install react-hook-form ``` ## 🔐 Account & Authentication - [ ] Use Axios request interceptor to attach token to requests and handle logout logic ```ts // add a request interceptor to include JWT token if available agent.interceptors.request.use((config) => { const token = useAuthStore.getState().token; if (token) { config.headers = config.headers || {}; config.headers["Authorization"] = `Bearer ${token}`; } return config; }); // add a response interceptor to handle 401 Unauthorized agent.interceptors.response.use( (res) => res, (error) => { if (error.response?.status === 401) { useAuthStore.getState().logout(); window.location.href = "/login"; // redirect to login } return Promise.reject(error); } ); ``` ## API - [ ] Provide a method for each new endpoint implemented in backend ```ts const Profile = { getProfile: () => request.get('/account/profile'), editEmail: (data: EditEmailDto) => request.put('/account/email', data), editPassword: (data: EditPasswordDto) => request.put('/account/password', data), upsertAccountPerson: (data: PersonDto) => request.post('/account/account-person', data), upsertPerson: (data: PersonDto) => request.post('/account/person', data), upsertBankDetail: (data: UpsertBankAccountDetailDto) => request.post('/account/bank-detail', data), getMyPeople: () => request.get('/account/my-people'), getMyTravels: () => request.get('/account/my-travels'), getMyTransactions: () => request.get('/account/my-transactions'), topUp: (data : topUpDto) => request.post('/account/top-up', data) }; ``` ## 🗂️ Additional Profile Tabs (initial setup) - [ ] Add empty pages/tabs for: - [ ] `ProfileSummary` - [ ] - [ ] `MyTravels` - [ ] `MyTransactions` - [ ] Implement `ProfilePage` using the components created. This is an example of how it can be done: ```ts import InfoAccount from "./InfoAccount"; import InfoPeople from "./InfoPeople"; import InfoTransactions from "./InfoTransactions"; import InfoTravels from "./InfoTravels"; import { useState } from "react"; const tabs = [ { label: "Account", component: }, { label: "Transactions", component: }, { label: "Travels", component: }, { label: "People", component: } ]; const Profile = () => { const [selected, setSelected] = useState(0); return (
{tabs[selected].component}
); }; export default Profile; ``` - [ ] Create prototype of `ProfilePage` and integrate with navbar. (Create a button or link to access `ProfilePage`, only when user is logged in) - [ ] Define and adjust routes for profile and its tabs ```ts const AppRoutes = () => { return ( } /> } /> } /> } /> } /> ); }; export default AppRoutes; ``` - [ ] Implement tab handling inside `ProfilePage`. You can also do it **route-based**. ## Profile Summary ### 📦 DTOs / Models - Add models for: - [ ] `EditEmailDto` ```ts export interface EditEmailDto { newEmail: string; } ``` - [ ] `EditPasswordDto` ```ts export interface EditPasswordDto { oldPassword: string; newPassword: string; confirmNewPassword: string; } ``` - [ ] `PersonDto` ```ts export interface PersonDto { id?: number; creatorAccountId?: number; firstName: string; lastName: string; idNumber: string; genderId: number; phoneNumber: string; birthDate: string; } ``` - [ ] `ProfileDto` ```ts export interface ProfileDto { accountPhoneNumber: string; email: string; balance: number; firstName: string; lastName: string; idNumber: string; personPhoneNumber: string; birthDate: Date | string | null; iban: string; bankAccountNumber: string; cardNumber: string; } ``` - [ ] `UpsertBankAccountDetailDto` ```ts export interface UpsertBankAccountDto { iban?: string; bankAccountNumber?: string; cardNumber?: string; } ``` - [ ] Implement the process of showing and editing the data. To do so, you can use modal components and set their functionality in the pages. ## 🧍 List of Travelers - [ ] Implement `ListOfTravelers` page for showing, editing, and adding new people ## 💳 Transactions Module - [ ] Add `TransactionDto` model - [ ] Implement `MyTransactions` page ## 🚆 Travel Module - [ ] Add `TicketOrderSummaryDto`, `TravelerTicketDto` models - [ ] Implement `MyTravels` page - [ ] Implement `TravelOrderDetailsPage`