From 3d000ef543d1dffe994d0cf3e78344708c9f221d Mon Sep 17 00:00:00 2001 From: "Cross, Liam (UG - Comp Sci & Elec Eng)" <lc01383@surrey.ac.uk> Date: Tue, 2 Apr 2024 19:44:26 +0000 Subject: [PATCH] Separate client and airline dashboards --- .../BookingList/BookingCard/BookingCard.tsx | 2 +- .../CustomerDashboard/CustomerDashboard.scss | 120 ---------------- .../CustomerDashboard/CustomerDashboard.tsx | 133 ------------------ .../src/components/Dashboard/Dashboard.scss | 8 ++ client/src/components/Dashboard/Dashboard.tsx | 16 +++ .../FlightCard/FlightCard.scss | 2 +- .../FlightCard/FlightCard.tsx | 2 +- .../components/Dashboard/Flights/Flights.scss | 30 ++++ .../components/Dashboard/Flights/Flights.tsx | 54 +++++++ .../components/Dashboard/Profile/Profile.scss | 13 ++ .../components/Dashboard/Profile/Profile.tsx | 114 +++++++++++++++ .../components/Dashboard/Profile/airplane.jpg | Bin 0 -> 10836 bytes .../Profile}/avatar.jpg | Bin client/src/components/Header/Header.tsx | 8 +- client/src/components/Login/Login.tsx | 5 +- client/src/components/Register/Register.tsx | 7 +- client/src/helpers/UserType.ts | 7 + client/src/index.scss | 53 +++++++ client/src/main.tsx | 12 +- .../src/services/BookingList/BookingList.ts | 2 +- .../services/Dashboard/AirlineDashboard.ts | 9 ++ .../CustomerDashboard.ts | 6 +- 22 files changed, 333 insertions(+), 270 deletions(-) delete mode 100644 client/src/components/CustomerDashboard/CustomerDashboard.scss delete mode 100644 client/src/components/CustomerDashboard/CustomerDashboard.tsx create mode 100644 client/src/components/Dashboard/Dashboard.scss create mode 100644 client/src/components/Dashboard/Dashboard.tsx rename client/src/components/{CustomerDashboard => Dashboard}/FlightCard/FlightCard.scss (99%) rename client/src/components/{CustomerDashboard => Dashboard}/FlightCard/FlightCard.tsx (95%) create mode 100644 client/src/components/Dashboard/Flights/Flights.scss create mode 100644 client/src/components/Dashboard/Flights/Flights.tsx create mode 100644 client/src/components/Dashboard/Profile/Profile.scss create mode 100644 client/src/components/Dashboard/Profile/Profile.tsx create mode 100644 client/src/components/Dashboard/Profile/airplane.jpg rename client/src/components/{CustomerDashboard => Dashboard/Profile}/avatar.jpg (100%) create mode 100644 client/src/services/Dashboard/AirlineDashboard.ts rename client/src/services/{CustomerDashboard => Dashboard}/CustomerDashboard.ts (98%) diff --git a/client/src/components/BookingList/BookingCard/BookingCard.tsx b/client/src/components/BookingList/BookingCard/BookingCard.tsx index 900011a..29b598f 100644 --- a/client/src/components/BookingList/BookingCard/BookingCard.tsx +++ b/client/src/components/BookingList/BookingCard/BookingCard.tsx @@ -1,5 +1,5 @@ import { useLocation } from 'react-router-dom'; -import { IFlight } from '../../../services/CustomerDashboard/CustomerDashboard'; +import { IFlight } from '../../../services/Dashboard/CustomerDashboard'; import './BookingCard.scss'; interface IBookingCard { diff --git a/client/src/components/CustomerDashboard/CustomerDashboard.scss b/client/src/components/CustomerDashboard/CustomerDashboard.scss deleted file mode 100644 index def2dfb..0000000 --- a/client/src/components/CustomerDashboard/CustomerDashboard.scss +++ /dev/null @@ -1,120 +0,0 @@ -.customer-dashboard { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - gap: 2rem; -} - -.avatar { - width: 150px; -} - -.customer-profile { - display: flex; - flex-direction: row; - gap: 1.5rem; -} - -.bio-card { - padding: 1.5rem 5rem !important; // Sorry -} - -.form-h { - display: flex; - flex-direction: column; - gap: 1rem; - - .form-group-h { - display: flex; - justify-content: center; - align-items: center; - gap: 1rem; - - label { - font-weight: 700; - width: 180px; - } - - input { - font-size: 1rem; - padding: 6px 12px; - border: 1px solid gray; - border-radius: 5px; - width: 300px; - } - - button { - font-size: 1rem; - padding: 6px 12px; - border: 1px solid gray; - border-radius: 5px; - background-color: var(--main); - color: white; - } - - button:hover { - filter: brightness(50%); - cursor: pointer; - } - - button:disabled { - filter: brightness(40%); - } - - button:disabled:hover { - cursor: auto; - } - - span { - overflow: hidden; - color: red; - } - } -} - -.flights-title { - font-size: 2rem; -} - -.flights { - display: flex; - flex-direction: column; - width: 80vw; - gap: 0.5rem; -} - -.flight-list { - display: flex; - gap: 1rem; -} - -.view-more { - font-size: 1rem; - padding: 6px 12px; - border: 1px solid gray; - border-radius: 5px; - background-color: var(--main); - color: white; -} - -.view-more:hover { - filter: brightness(50%); - cursor: pointer; -} - -.view_more_button { - margin-left: 10px; - font-size: 1rem; - padding: 6px 12px; - border: 1px solid gray; - border-radius: 5px; - background-color: var(--main); - color: white; -} - -.view_more_button:hover { - filter: brightness(50%); - cursor: pointer; -} \ No newline at end of file diff --git a/client/src/components/CustomerDashboard/CustomerDashboard.tsx b/client/src/components/CustomerDashboard/CustomerDashboard.tsx deleted file mode 100644 index 394312d..0000000 --- a/client/src/components/CustomerDashboard/CustomerDashboard.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import { useState } from 'react'; -import { useLoaderData } from 'react-router-dom'; -import { useForm } from 'react-hook-form'; -import { ICustomerDashboardData } from '../../services/CustomerDashboard/CustomerDashboard'; -import { useAuth } from '../../hooks/useAuth'; -import FlightCard from './FlightCard/FlightCard'; -import avatar from './avatar.jpg'; -import './CustomerDashboard.scss'; - -interface ICustomerDashboardForm { - name: string; - email: string; - password: string; - confirmPassword: string; -} - -function CustomerDashboard() { - const [error, setError] = useState(''); - const [disabled, setDisabled] = useState(true); - const { user } = useAuth(); - const data = useLoaderData() as ICustomerDashboardData; - const formValues: ICustomerDashboardForm = { - name: user?.username ?? '', - email: user?.email ?? '', - password: '', - confirmPassword: '' - }; - const { register, handleSubmit } = useForm<ICustomerDashboardForm>({mode: 'onChange', defaultValues: formValues}); - - const toggleEdit = () => { - setDisabled(!disabled); - }; - - const onSubmit = (formValue: ICustomerDashboardForm) => { - if (formValue.password.length < 7) { - setError('password length must be greater than 7 characters'); - return; - } - - if (formValue.password !== formValue.confirmPassword) { - setError('password and confirm password must match'); - return; - } - - setError(''); - console.log('ready to make update details api call'); - }; - - return ( - <> - <div className='customer-dashboard'> - <div className='customer-profile'> - <div className='customer-profile-bio'> - <div className='card bio-card'> - <div className='flex'> - <img src={avatar} alt='avatar' className='avatar'></img> - <span>{user?.username ?? ''}</span> - <span>Loyal Customer</span> - </div> - </div> - </div> - - <div className='customer-profile-fields'> - <div className='card'> - <form onSubmit={handleSubmit(onSubmit)}> - <div className='form-h'> - <div className='form-group-h'> - <label>Full Name</label> - <input type='text' {...register('name', { required: true, disabled })} /> - </div> - - <div className='form-group-h'> - <label>Email</label> - <input type='email' {...register('email', { required: true, disabled })} /> - </div> - - <div className='form-group-h'> - <label>Password</label> - <input type='password' placeholder='Enter new password' {...register('password', { required: true, disabled })} /> - </div> - - <div className='form-group-h'> - <label>Confirm Password</label> - <input type='password' placeholder='Confirm new password' {...register('confirmPassword', { required: true, disabled })} /> - </div> - - <div className='form-group-h'> - <button type='button' onClick={toggleEdit}>Toggle Edit</button> - <button type='submit' disabled={disabled}>Submit</button> - </div> - - <div className='form-group-h'> - {error && <span>{error}</span>} - </div> - </div> - </form> - </div> - </div> - </div> - - <div className='flights'> - <div className='flex-row'> - <span className='flights-title'>Upcoming Flights</span> - <button type='submit' className='view_more_button'>View more</button> - </div> - <div className='flight-list'> - {data.upcomingFlights.length > 0 - ? data.upcomingFlights.map((flight) => { - return <FlightCard key={flight.id} flight={flight}></FlightCard> - }) - : <div>No Upcoming Flights</div>} - </div> - </div> - - <div className='flights'> - <div className='flex-row'> - <span className='flights-title'>Flights History</span> - <button type='submit' className='view_more_button'>View more</button> - </div> - <div className='flight-list'> - {data.upcomingFlights.length > 0 - ? data.flightsHistory.map((flight) => { - return <FlightCard key={flight.id} flight={flight}></FlightCard> - }) - : <div>No Flights History</div>} - </div> - </div> - </div> - </> - ); -} - -export default CustomerDashboard; \ No newline at end of file diff --git a/client/src/components/Dashboard/Dashboard.scss b/client/src/components/Dashboard/Dashboard.scss new file mode 100644 index 0000000..a825b41 --- /dev/null +++ b/client/src/components/Dashboard/Dashboard.scss @@ -0,0 +1,8 @@ +.dashboard { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + gap: 2rem; +} diff --git a/client/src/components/Dashboard/Dashboard.tsx b/client/src/components/Dashboard/Dashboard.tsx new file mode 100644 index 0000000..7521039 --- /dev/null +++ b/client/src/components/Dashboard/Dashboard.tsx @@ -0,0 +1,16 @@ +import Profile from './Profile/Profile'; +import Flights from './Flights/Flights'; +import './Dashboard.scss'; + +function Dashboard() { + return ( + <> + <div className='dashboard'> + <Profile></Profile> + <Flights></Flights> + </div> + </> + ); +} + +export default Dashboard; diff --git a/client/src/components/CustomerDashboard/FlightCard/FlightCard.scss b/client/src/components/Dashboard/FlightCard/FlightCard.scss similarity index 99% rename from client/src/components/CustomerDashboard/FlightCard/FlightCard.scss rename to client/src/components/Dashboard/FlightCard/FlightCard.scss index 639c3a9..8163853 100644 --- a/client/src/components/CustomerDashboard/FlightCard/FlightCard.scss +++ b/client/src/components/Dashboard/FlightCard/FlightCard.scss @@ -13,4 +13,4 @@ .flight-path { color: #777; font-size: 0.8rem; -} \ No newline at end of file +} diff --git a/client/src/components/CustomerDashboard/FlightCard/FlightCard.tsx b/client/src/components/Dashboard/FlightCard/FlightCard.tsx similarity index 95% rename from client/src/components/CustomerDashboard/FlightCard/FlightCard.tsx rename to client/src/components/Dashboard/FlightCard/FlightCard.tsx index 9e20e2b..32125e5 100644 --- a/client/src/components/CustomerDashboard/FlightCard/FlightCard.tsx +++ b/client/src/components/Dashboard/FlightCard/FlightCard.tsx @@ -25,4 +25,4 @@ function FlightCard({ flight }: IFlightCard) { ); } -export default FlightCard; \ No newline at end of file +export default FlightCard; diff --git a/client/src/components/Dashboard/Flights/Flights.scss b/client/src/components/Dashboard/Flights/Flights.scss new file mode 100644 index 0000000..9cabf46 --- /dev/null +++ b/client/src/components/Dashboard/Flights/Flights.scss @@ -0,0 +1,30 @@ +.flights-title { + font-size: 2rem; +} + +.flights { + display: flex; + flex-direction: column; + width: 80vw; + gap: 0.5rem; +} + +.flight-list { + display: flex; + gap: 1rem; +} + +.view-more { + margin-left: 10px; + font-size: 1rem; + padding: 6px 12px; + border: 1px solid gray; + border-radius: 5px; + background-color: var(--main); + color: white; +} + +.view-more:hover { + filter: brightness(50%); + cursor: pointer; +} diff --git a/client/src/components/Dashboard/Flights/Flights.tsx b/client/src/components/Dashboard/Flights/Flights.tsx new file mode 100644 index 0000000..96ff319 --- /dev/null +++ b/client/src/components/Dashboard/Flights/Flights.tsx @@ -0,0 +1,54 @@ +import { useLoaderData } from 'react-router'; +import { ICustomerDashboardData } from '../../../services/Dashboard/CustomerDashboard'; +import { IAirlineDashboardData } from '../../../services/Dashboard/AirlineDashboard'; +import FlightCard from '../FlightCard/FlightCard'; +import './Flights.scss'; + +function Flights() { + const data = useLoaderData() as ICustomerDashboardData | IAirlineDashboardData; + + if (data.type === 'customer') { + return ( + <> + <div className='flights'> + <div className='flex-row'> + <span className='flights-title'>Upcoming Flights</span> + <button type='submit' className='view-more'>View more</button> + </div> + <div className='flight-list'> + {data.upcomingFlights.length > 0 + ? data.upcomingFlights.map((flight) => { + return <FlightCard key={flight.id} flight={flight}></FlightCard> + }) + : <div>No Upcoming Flights</div>} + </div> + </div> + + <div className='flights'> + <div className='flex-row'> + <span className='flights-title'>Flights History</span> + <button type='submit' className='view-more'>View more</button> + </div> + <div className='flight-list'> + {data.upcomingFlights.length > 0 + ? data.flightsHistory.map((flight) => { + return <FlightCard key={flight.id} flight={flight}></FlightCard> + }) + : <div>No Flights History</div>} + </div> + </div> + </> + ); + } else { + return ( + <> + <div> + todo airline dashboard + </div> + </> + ); + } + +} + +export default Flights; diff --git a/client/src/components/Dashboard/Profile/Profile.scss b/client/src/components/Dashboard/Profile/Profile.scss new file mode 100644 index 0000000..6db01b1 --- /dev/null +++ b/client/src/components/Dashboard/Profile/Profile.scss @@ -0,0 +1,13 @@ +.profile { + display: flex; + flex-direction: row; + gap: 1.5rem; +} + +.bio-card { + padding: 1.5rem 5rem !important; // Sorry +} + +.avatar { + width: 150px; +} diff --git a/client/src/components/Dashboard/Profile/Profile.tsx b/client/src/components/Dashboard/Profile/Profile.tsx new file mode 100644 index 0000000..f289594 --- /dev/null +++ b/client/src/components/Dashboard/Profile/Profile.tsx @@ -0,0 +1,114 @@ +import { useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { useAuth } from '../../../hooks/useAuth'; +import avatar from './avatar.jpg'; +import plane from './airplane.jpg'; +import './Profile.scss'; + +interface IProfileForm { + name: string; + email: string; + password: string; + confirmPassword: string; +} + +function Profile() { + const { user } = useAuth(); + const [disabled, setDisabled] = useState(true); + const [error, setError] = useState(''); + const isAirline = user?.type === 1; + const defaultValues: IProfileForm = { + email: user?.email ?? '', + name: user?.username ?? '', + password: '', + confirmPassword: '' + }; + const { register, handleSubmit, getValues, setValue } = useForm<IProfileForm>({ mode: 'onChange', defaultValues }); + + const resetFormValues = () => { + if (!getValues().name) + setValue('name', user?.username ?? ''); + + if (!getValues().email) + setValue('email', user?.email ?? ''); + + if (!getValues().password) + setValue('password', ''); + + if (!getValues().confirmPassword) + setValue('confirmPassword', ''); + }; + + resetFormValues(); + + const toggleEdit = () => { + setDisabled(!disabled); + resetFormValues(); + }; + + const onSubmit = (formValue: IProfileForm) => { + if (formValue.password.length < 7) { + setError('password length must be greater than 7 characters'); + return; + } + + if (formValue.password !== formValue.confirmPassword) { + setError('password and confirm password must match'); + return; + } + + setError(''); + console.log('ready to make update details api call'); + }; + + return ( + <> + <div className='profile'> + <div className='card bio-card'> + <div className='flex'> + <img src={isAirline ? plane : avatar} alt='avatar' className='avatar'></img> + <span>{user?.username ?? ''}</span> + <span>Loyal {isAirline ? 'Airline' : 'Customer'}</span> + </div> + </div> + + <div className='card'> + <form onSubmit={handleSubmit(onSubmit)}> + <div className='form-h'> + <div className='form-group-h'> + <label>Full Name</label> + <input type='text' {...register('name', { required: true, disabled })} /> + </div> + + <div className='form-group-h'> + <label>Email</label> + <input type='email' {...register('email', { required: true, disabled })} /> + </div> + + <div className='form-group-h'> + <label>Password</label> + <input type='password' placeholder='Enter new password' {...register('password', { required: true, disabled })} /> + </div> + + <div className='form-group-h'> + <label>Confirm Password</label> + <input type='password' placeholder='Confirm new password' {...register('confirmPassword', { required: true, disabled })} /> + </div> + + <div className='form-group-h'> + <button type='button' onClick={toggleEdit}>Toggle Edit</button> + <button type='submit' disabled={disabled}>Submit</button> + </div> + + <div className='form-group-h'> + {error && <span>{error}</span>} + </div> + </div> + </form> + </div> + </div> + </> + ); +} + +export default Profile; diff --git a/client/src/components/Dashboard/Profile/airplane.jpg b/client/src/components/Dashboard/Profile/airplane.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20b46345cfaf2caf79d4999c0d0641f9a40053df GIT binary patch literal 10836 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 literal 0 HcmV?d00001 diff --git a/client/src/components/CustomerDashboard/avatar.jpg b/client/src/components/Dashboard/Profile/avatar.jpg similarity index 100% rename from client/src/components/CustomerDashboard/avatar.jpg rename to client/src/components/Dashboard/Profile/avatar.jpg diff --git a/client/src/components/Header/Header.tsx b/client/src/components/Header/Header.tsx index cd7ac92..4128437 100644 --- a/client/src/components/Header/Header.tsx +++ b/client/src/components/Header/Header.tsx @@ -1,10 +1,11 @@ import { Link } from 'react-router-dom'; import { useAuth } from '../../hooks/useAuth'; import './Header.scss'; +import { userToDashboard } from '../../helpers/UserType'; function Header() { - const { isAuth } = useAuth(); - + const { isAuth, user } = useAuth(); + return ( <> <div className='header'> @@ -16,6 +17,7 @@ function Header() { {isAuth ? <div> + <Link to={userToDashboard(user)} className='nav-item'>Dashboard</Link> <Link to={'booking/query'} className='nav-item'>Book a Flight</Link> <Link to={'logout'} className='nav-item'>Logout</Link> </div> : @@ -30,4 +32,4 @@ function Header() { ); } -export default Header; \ No newline at end of file +export default Header; diff --git a/client/src/components/Login/Login.tsx b/client/src/components/Login/Login.tsx index 271ba52..0eeeacb 100644 --- a/client/src/components/Login/Login.tsx +++ b/client/src/components/Login/Login.tsx @@ -4,6 +4,7 @@ import { useForm } from 'react-hook-form'; import { AxiosError } from 'axios'; import { useAuth } from '../../hooks/useAuth'; import { loginUser } from '../../services/Login/Login'; +import { userToDashboard } from '../../helpers/UserType'; import './Login.scss'; export interface ILoginForm { @@ -12,7 +13,7 @@ export interface ILoginForm { } export function Login() { - const { giveAuth, updateUser } = useAuth(); + const { giveAuth, updateUser, user } = useAuth(); const navigate = useNavigate(); const [error, setError] = useState(''); const { register, handleSubmit } = useForm<ILoginForm>({mode: 'onChange'}); @@ -24,7 +25,7 @@ export function Login() { const result = await loginUser(formValue); giveAuth(); updateUser(result.data); - navigate('/customer-dashboard'); + navigate(`/${userToDashboard(user)}`); } catch (error) { const errorMessage = (error as AxiosError).response?.data; diff --git a/client/src/components/Register/Register.tsx b/client/src/components/Register/Register.tsx index 7a431c6..ea69c77 100644 --- a/client/src/components/Register/Register.tsx +++ b/client/src/components/Register/Register.tsx @@ -5,6 +5,7 @@ import { AxiosError } from 'axios'; import { registerUser } from '../../services/Register/Register'; import { useAuth } from '../../hooks/useAuth'; import './Register.scss'; +import { userToDashboard } from '../../helpers/UserType'; export interface IRegisterForm { name: string; @@ -15,7 +16,7 @@ export interface IRegisterForm { } export function Register() { - const { giveAuth, updateUser } = useAuth(); + const { giveAuth, updateUser, user } = useAuth(); const navigate = useNavigate(); const [error, setError] = useState(''); const { register, handleSubmit } = useForm<IRegisterForm>({mode: 'onChange'}); @@ -37,7 +38,7 @@ export function Register() { const result = await registerUser(formValue); giveAuth(); updateUser(result.data); - navigate('/customer-dashboard'); + navigate(`/${userToDashboard(user)}`); } catch (error) { const errorMessage = (error as AxiosError).response?.data; @@ -96,4 +97,4 @@ export function Register() { ); } -export default Register; \ No newline at end of file +export default Register; diff --git a/client/src/helpers/UserType.ts b/client/src/helpers/UserType.ts index 46ca75a..463e644 100644 --- a/client/src/helpers/UserType.ts +++ b/client/src/helpers/UserType.ts @@ -1,3 +1,10 @@ +import { IUser } from '../providers/AuthProvider'; + export function userStringToType(user: string) { return user.toLowerCase() === 'customer' ? 0 : 1; } + +export function userToDashboard(user?: IUser) { + const isAirline = user?.type === 1; + return isAirline ? 'airline-dashboard' : 'customer-dashboard'; +} diff --git a/client/src/index.scss b/client/src/index.scss index 0f7974e..9579f87 100644 --- a/client/src/index.scss +++ b/client/src/index.scss @@ -76,6 +76,59 @@ body { } } +.form-h { + display: flex; + flex-direction: column; + gap: 1rem; + + .form-group-h { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + + label { + font-weight: 700; + width: 180px; + } + + input { + font-size: 1rem; + padding: 6px 12px; + border: 1px solid gray; + border-radius: 5px; + width: 300px; + } + + button { + font-size: 1rem; + padding: 6px 12px; + border: 1px solid gray; + border-radius: 5px; + background-color: var(--main); + color: white; + } + + button:hover { + filter: brightness(50%); + cursor: pointer; + } + + button:disabled { + filter: brightness(40%); + } + + button:disabled:hover { + cursor: auto; + } + + span { + overflow: hidden; + color: red; + } + } +} + .flex { display: flex; flex-direction: column; diff --git a/client/src/main.tsx b/client/src/main.tsx index 54cf148..6e9c4d9 100644 --- a/client/src/main.tsx +++ b/client/src/main.tsx @@ -6,12 +6,13 @@ import Login from './components/Login/Login.tsx'; import Register from './components/Register/Register.tsx'; import Logout from './components/Logout/Logout.tsx'; import ProtectedRoute from './components/ProtectedRoute/ProtectedRoute.tsx'; -import CustomerDashboard from './components/CustomerDashboard/CustomerDashboard.tsx'; +import Dashboard from './components/Dashboard/Dashboard.tsx'; import BookingQuery from './components/BookingQuery/BookingQuery.tsx'; import BookingList from './components/BookingList/BookingList.tsx'; import { AuthoriseUser } from './services/Authorise/Authorise.ts'; import { LogoutUser } from './services/Logout/Logout.ts'; -import { GetCustomerDashboardData } from './services/CustomerDashboard/CustomerDashboard.ts'; +import { GetCustomerDashboardData } from './services/Dashboard/CustomerDashboard.ts'; +import { GetAirlineDashboardData } from './services/Dashboard/AirlineDashboard.ts'; import { GetBookingList } from './services/BookingList/BookingList.ts'; import './index.scss'; @@ -40,7 +41,12 @@ const router = createBrowserRouter([ { path: 'customer-dashboard', loader: GetCustomerDashboardData, - element: <CustomerDashboard></CustomerDashboard> + element: <Dashboard></Dashboard> + }, + { + path: 'airline-dashboard', + loader: GetAirlineDashboardData, + element: <Dashboard></Dashboard> }, { path: 'booking/query', diff --git a/client/src/services/BookingList/BookingList.ts b/client/src/services/BookingList/BookingList.ts index 985a359..84487d8 100644 --- a/client/src/services/BookingList/BookingList.ts +++ b/client/src/services/BookingList/BookingList.ts @@ -1,5 +1,5 @@ import { getSearchParam } from '../../helpers/SearchParams'; -import { IFlight } from '../CustomerDashboard/CustomerDashboard'; +import { IFlight } from '../Dashboard/CustomerDashboard'; export interface IBookingList { diff --git a/client/src/services/Dashboard/AirlineDashboard.ts b/client/src/services/Dashboard/AirlineDashboard.ts new file mode 100644 index 0000000..3600759 --- /dev/null +++ b/client/src/services/Dashboard/AirlineDashboard.ts @@ -0,0 +1,9 @@ +export interface IAirlineDashboardData { + type: 'airline' +} + +export async function GetAirlineDashboardData(): Promise<IAirlineDashboardData> { + return { + type: 'airline' + }; +} diff --git a/client/src/services/CustomerDashboard/CustomerDashboard.ts b/client/src/services/Dashboard/CustomerDashboard.ts similarity index 98% rename from client/src/services/CustomerDashboard/CustomerDashboard.ts rename to client/src/services/Dashboard/CustomerDashboard.ts index e8c7984..a9338d5 100644 --- a/client/src/services/CustomerDashboard/CustomerDashboard.ts +++ b/client/src/services/Dashboard/CustomerDashboard.ts @@ -1,4 +1,3 @@ - export interface IFlight { id: number; flightNumber: string; @@ -11,12 +10,15 @@ export interface IFlight { } export interface ICustomerDashboardData { + type: 'customer' upcomingFlights: IFlight[]; flightsHistory: IFlight[]; } export async function GetCustomerDashboardData(): Promise<ICustomerDashboardData> { + return { + type: 'customer', upcomingFlights: [ { id: 4, @@ -82,4 +84,4 @@ export async function GetCustomerDashboardData(): Promise<ICustomerDashboardData } ] } -} \ No newline at end of file +} -- GitLab