├── backend ├── .env ├── .env.sample ├── .gitignore ├── Routes │ ├── auth.js │ ├── booking.js │ ├── review.js │ ├── user.js │ └── doctor.js ├── models │ ├── UserSchema.js │ ├── BookingSchema.js │ ├── ReviewSchema.js │ └── DoctorSchema.js ├── package.json ├── utils │ ├── emailService.js │ └── const.js ├── Controllers │ ├── reviewController.js │ ├── bookingController.js │ ├── doctorController.js │ ├── userController.js │ └── authController.js ├── auth │ └── verifyToken.js └── index.js ├── frontend ├── src │ ├── assets │ │ ├── Blur.png │ │ ├── Star.png │ │ ├── about.png │ │ ├── icon01.png │ │ ├── icon02.png │ │ ├── icon03.png │ │ ├── logo.png │ │ ├── mask.png │ │ ├── signup.gif │ │ ├── faq-img.png │ │ ├── hero-bg.png │ │ ├── about-card.png │ │ ├── avatar-icon.png │ │ ├── feature-img.png │ │ ├── header-bg.png │ │ ├── hero-img01.png │ │ ├── hero-img02.png │ │ ├── hero-img03.png │ │ ├── video-icon.png │ │ ├── doctor-img01.png │ │ ├── doctor-img02.png │ │ ├── doctor-img03.png │ │ ├── patient-avatar.png │ │ ├── data │ │ │ ├── doctors.js │ │ │ ├── services.js │ │ │ └── faqs.js │ │ └── plus-svgrepo-com.svg │ ├── App.jsx │ ├── lib │ │ └── utils.ts │ ├── utils │ │ ├── formateDate.js │ │ ├── convertTime.js │ │ └── uploadCloudinary.js │ ├── components │ │ ├── Error │ │ │ └── Error.jsx │ │ ├── Faq │ │ │ ├── FaqList.jsx │ │ │ └── FaqItem.jsx │ │ ├── Loader │ │ │ └── Loading.jsx │ │ ├── Services │ │ │ ├── ServiceList.jsx │ │ │ └── ServiceCard.jsx │ │ ├── Header │ │ │ ├── nav-link.js │ │ │ ├── responsive-navbar.jsx │ │ │ └── Header.jsx │ │ ├── ui │ │ │ ├── label.tsx │ │ │ ├── textarea.tsx │ │ │ ├── input.tsx │ │ │ ├── button.tsx │ │ │ ├── sheet.tsx │ │ │ └── form.tsx │ │ ├── Doctors │ │ │ ├── DoctorList.jsx │ │ │ └── DoctorCard.jsx │ │ ├── About │ │ │ └── About.jsx │ │ ├── Footer │ │ │ └── Footer.jsx │ │ └── Testimonial │ │ │ └── Testimonial.jsx │ ├── config.js │ ├── layout │ │ └── Layout.jsx │ ├── routes │ │ ├── ProtectedRoute.jsx │ │ └── Routers.jsx │ ├── pages │ │ ├── Services.jsx │ │ ├── CheckoutSuccess.jsx │ │ ├── Contact.jsx │ │ ├── Doctors │ │ │ ├── Feedback.jsx │ │ │ ├── SidePanel.jsx │ │ │ ├── DoctorAbout.jsx │ │ │ ├── FeedbackForm.jsx │ │ │ ├── Doctors.jsx │ │ │ └── DoctorDetails.jsx │ │ ├── Login.jsx │ │ ├── get-appointment.jsx │ │ ├── Signup.jsx │ │ └── Home.jsx │ ├── main.jsx │ ├── hooks │ │ └── useFetchData.jsx │ ├── Dashboard │ │ ├── user-account │ │ │ ├── MyBookings.jsx │ │ │ ├── MyAccount.jsx │ │ │ └── Profile.jsx │ │ └── doctor-account │ │ │ ├── Tabs.jsx │ │ │ ├── Appointments.jsx │ │ │ ├── Dashboard.jsx │ │ │ └── Profile.jsx │ ├── context │ │ └── AuthContext.jsx │ ├── App.css │ └── index.css ├── postcss.config.js ├── tsconfig.app.json ├── tsconfig.node.json ├── vite.config.js ├── tsconfig.json ├── .gitignore ├── index.html ├── README.md ├── components.json ├── .eslintrc.cjs ├── public │ └── vite.svg ├── package.json └── tailwind.config.js ├── security.md ├── code_of_conduct.md └── README.md /backend/.env: -------------------------------------------------------------------------------- 1 | MONGO_URL="mongodb://localhost:27017/appointment" -------------------------------------------------------------------------------- /frontend/src/assets/Blur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/Blur.png -------------------------------------------------------------------------------- /frontend/src/assets/Star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/Star.png -------------------------------------------------------------------------------- /frontend/src/assets/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/about.png -------------------------------------------------------------------------------- /frontend/src/assets/icon01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/icon01.png -------------------------------------------------------------------------------- /frontend/src/assets/icon02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/icon02.png -------------------------------------------------------------------------------- /frontend/src/assets/icon03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/icon03.png -------------------------------------------------------------------------------- /frontend/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/logo.png -------------------------------------------------------------------------------- /frontend/src/assets/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/mask.png -------------------------------------------------------------------------------- /frontend/src/assets/signup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/signup.gif -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/assets/faq-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/faq-img.png -------------------------------------------------------------------------------- /frontend/src/assets/hero-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/hero-bg.png -------------------------------------------------------------------------------- /frontend/src/assets/about-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/about-card.png -------------------------------------------------------------------------------- /frontend/src/assets/avatar-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/avatar-icon.png -------------------------------------------------------------------------------- /frontend/src/assets/feature-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/feature-img.png -------------------------------------------------------------------------------- /frontend/src/assets/header-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/header-bg.png -------------------------------------------------------------------------------- /frontend/src/assets/hero-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/hero-img01.png -------------------------------------------------------------------------------- /frontend/src/assets/hero-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/hero-img02.png -------------------------------------------------------------------------------- /frontend/src/assets/hero-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/hero-img03.png -------------------------------------------------------------------------------- /frontend/src/assets/video-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/video-icon.png -------------------------------------------------------------------------------- /frontend/src/assets/doctor-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/doctor-img01.png -------------------------------------------------------------------------------- /frontend/src/assets/doctor-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/doctor-img02.png -------------------------------------------------------------------------------- /frontend/src/assets/doctor-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/doctor-img03.png -------------------------------------------------------------------------------- /frontend/src/assets/patient-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayerhssb/Appointment-booking-app/HEAD/frontend/src/assets/patient-avatar.png -------------------------------------------------------------------------------- /frontend/src/App.jsx: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | import Layout from "./layout/Layout"; 3 | 4 | 5 | 6 | function App() { 7 | return ; 8 | } 9 | 10 | export default App; 11 | -------------------------------------------------------------------------------- /backend/.env.sample: -------------------------------------------------------------------------------- 1 | PORT = 8000 2 | MONGO_URL = YOUR MONGO_URL 3 | JWT_SECRET_KEY = YOUR JWT_SECRET_KEY 4 | 5 | STRIPE_SECRET_KEY = YOUR STRIPE_SECRET_KEY 6 | CLIENT_SITE_URL = YOUR CLIENT_SITE_URL 7 | -------------------------------------------------------------------------------- /frontend/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /frontend/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // ... 4 | "baseUrl": ".", 5 | "paths": { 6 | "@/*": [ 7 | "./src/*" 8 | ] 9 | } 10 | // ... 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /frontend/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react", 4 | // ... 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/*": [ 8 | "./src/*" 9 | ] 10 | } 11 | // ... 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/utils/formateDate.js: -------------------------------------------------------------------------------- 1 | export const formateDate = (date, config) => { 2 | const defaultOptions = {day: "numeric", month: "long", year: "numeric" }; 3 | const options = config ? config : defaultOptions; 4 | 5 | return new Date(date).toLocaleDateString("en-US", options); 6 | } -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import path from "path" 2 | import react from "@vitejs/plugin-react" 3 | import { defineConfig } from "vite" 4 | 5 | export default defineConfig({ 6 | plugins: [react()], 7 | resolve: { 8 | alias: { 9 | "@": path.resolve(__dirname, "./src"), 10 | }, 11 | }, 12 | }) 13 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.app.json" 6 | }, 7 | { 8 | "path": "./tsconfig.node.json" 9 | } 10 | ], 11 | "compilerOptions": { 12 | "baseUrl": ".", 13 | "paths": { 14 | "@/*": ["./src/*"] 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/components/Error/Error.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | const Error = ({errMessage}) => { 4 | return ( 5 |
6 |

{errMessage}

7 |
8 | ) 9 | } 10 | 11 | export default Error -------------------------------------------------------------------------------- /frontend/src/components/Faq/FaqList.jsx: -------------------------------------------------------------------------------- 1 | import {faqs} from './../../assets/data/faqs'; 2 | import FaqItem from './FaqItem'; 3 | 4 | const FaqList = () => { 5 | return ( 6 | 9 | ) 10 | } 11 | 12 | export default FaqList -------------------------------------------------------------------------------- /frontend/src/components/Loader/Loading.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import HashLoader from "react-spinners/HashLoader"; 3 | 4 | const Loading = () => { 5 | return ( 6 |
7 | 8 |
9 | ) 10 | } 11 | 12 | export default Loading; -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/src/config.js: -------------------------------------------------------------------------------- 1 | export const BASE_URL = "http://localhost:8000/api/v1"; 2 | export const token = localStorage.getItem("token"); 3 | 4 | export const imgURL = 5 | "https://media.istockphoto.com/id/1785918657/photo/portrait-of-doctor-with-smile-confidence-and-hospital-employee-with-care-support-and-trust.jpg?s=2048x2048&w=is&k=20&c=ez_9KDW6JfJIimxorJt98Y_Ez9QGakDowTDs9JHcHJw=" 6 | -------------------------------------------------------------------------------- /frontend/src/layout/Layout.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Header from '../components/Header/Header' 3 | import Footer from '../components/Footer/Footer' 4 | import Routers from '../routes/Routers' 5 | 6 | const Layout = () => { 7 | return ( 8 | <> 9 |
10 |
11 | 12 |
13 |