├── .eslintrc.json
├── .gitignore
├── README.md
├── jsconfig.json
├── next.config.mjs
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── public
├── assets
│ ├── icons
│ │ ├── Group 38729.svg
│ │ ├── Wrench.svg
│ │ ├── check.svg
│ │ ├── deliveryt.svg
│ │ ├── group.svg
│ │ ├── logo.eps
│ │ ├── person.svg
│ │ └── quote.svg
│ ├── images
│ │ ├── about_us
│ │ │ ├── parts.jpg
│ │ │ └── person.jpg
│ │ ├── banner
│ │ │ ├── 1.jpg
│ │ │ ├── 2.jpg
│ │ │ ├── 3.jpg
│ │ │ ├── 4.jpg
│ │ │ ├── 5.jpg
│ │ │ └── 6.jpg
│ │ ├── checkout
│ │ │ └── checkout.png
│ │ ├── homeCarousel
│ │ │ ├── 1.jpg
│ │ │ ├── 2.jpg
│ │ │ ├── 3.jpg
│ │ │ └── 4.jpg
│ │ ├── login
│ │ │ └── login.svg
│ │ ├── products
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ ├── 5.png
│ │ │ └── 6.png
│ │ ├── services
│ │ │ ├── 1.jpg
│ │ │ ├── 2.jpg
│ │ │ ├── 3.jpg
│ │ │ ├── 4.jpg
│ │ │ ├── 5.jpg
│ │ │ └── 6.jpg
│ │ └── team
│ │ │ ├── 1.jpg
│ │ │ ├── 2.jpg
│ │ │ └── 3.jpg
│ └── logo.svg
└── services.json
├── src
├── app
│ ├── api
│ │ └── auth
│ │ │ └── [...nextauth]
│ │ │ └── route.js
│ ├── checkout
│ │ ├── [id]
│ │ │ └── page.jsx
│ │ └── api
│ │ │ └── new-booking
│ │ │ └── route.js
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.js
│ ├── login
│ │ └── page.jsx
│ ├── my-bookings
│ │ ├── api
│ │ │ ├── [email]
│ │ │ │ └── route.js
│ │ │ └── booking
│ │ │ │ └── [id]
│ │ │ │ └── route.js
│ │ ├── page.jsx
│ │ └── update
│ │ │ └── [id]
│ │ │ └── page.jsx
│ ├── page.js
│ ├── services
│ │ ├── [id]
│ │ │ └── page.jsx
│ │ └── api
│ │ │ ├── [id]
│ │ │ └── route.js
│ │ │ ├── get-all
│ │ │ └── route.js
│ │ │ └── seed
│ │ │ └── route.js
│ └── signup
│ │ ├── api
│ │ └── route.js
│ │ └── page.jsx
├── components
│ ├── Homepage
│ │ ├── About.jsx
│ │ ├── Banner.jsx
│ │ ├── Homepage.jsx
│ │ └── Services.jsx
│ ├── cards
│ │ └── ServiceCard.jsx
│ └── shared
│ │ ├── Footer.jsx
│ │ ├── Navbar.jsx
│ │ └── SocialSignin.jsx
├── lib
│ ├── connectDB.js
│ └── services.js
├── middleware.js
└── services
│ ├── AuthProvider.jsx
│ └── getServices.js
└── tailwind.config.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
37 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./src/*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 |
4 | images: {
5 | remotePatterns: [
6 | {
7 | protocol: "https",
8 | hostname: "*",
9 | port: "",
10 | pathname: "**",
11 | },
12 | ],
13 | },
14 | };
15 |
16 | export default nextConfig;
17 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "car-doctor-pro",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "axios": "^1.7.2",
13 | "bcrypt": "^5.1.1",
14 | "mongodb": "^6.7.0",
15 | "next": "14.2.3",
16 | "next-auth": "^4.24.7",
17 | "react": "^18",
18 | "react-dom": "^18",
19 | "react-icons": "^5.2.1",
20 | "react-toastify": "^10.0.5"
21 | },
22 | "devDependencies": {
23 | "daisyui": "^4.12.2",
24 | "eslint": "^8",
25 | "eslint-config-next": "14.2.3",
26 | "postcss": "^8",
27 | "tailwindcss": "^3.4.1"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/public/assets/icons/Group 38729.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/assets/icons/Wrench.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/public/assets/icons/check.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/assets/icons/deliveryt.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/assets/icons/group.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/public/assets/icons/logo.eps:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/icons/logo.eps
--------------------------------------------------------------------------------
/public/assets/icons/person.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/public/assets/icons/quote.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/assets/images/about_us/parts.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/about_us/parts.jpg
--------------------------------------------------------------------------------
/public/assets/images/about_us/person.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/about_us/person.jpg
--------------------------------------------------------------------------------
/public/assets/images/banner/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/banner/1.jpg
--------------------------------------------------------------------------------
/public/assets/images/banner/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/banner/2.jpg
--------------------------------------------------------------------------------
/public/assets/images/banner/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/banner/3.jpg
--------------------------------------------------------------------------------
/public/assets/images/banner/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/banner/4.jpg
--------------------------------------------------------------------------------
/public/assets/images/banner/5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/banner/5.jpg
--------------------------------------------------------------------------------
/public/assets/images/banner/6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/banner/6.jpg
--------------------------------------------------------------------------------
/public/assets/images/checkout/checkout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/checkout/checkout.png
--------------------------------------------------------------------------------
/public/assets/images/homeCarousel/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/homeCarousel/1.jpg
--------------------------------------------------------------------------------
/public/assets/images/homeCarousel/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/homeCarousel/2.jpg
--------------------------------------------------------------------------------
/public/assets/images/homeCarousel/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/homeCarousel/3.jpg
--------------------------------------------------------------------------------
/public/assets/images/homeCarousel/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/homeCarousel/4.jpg
--------------------------------------------------------------------------------
/public/assets/images/login/login.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/public/assets/images/products/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/products/1.png
--------------------------------------------------------------------------------
/public/assets/images/products/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/products/2.png
--------------------------------------------------------------------------------
/public/assets/images/products/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/products/3.png
--------------------------------------------------------------------------------
/public/assets/images/products/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/products/4.png
--------------------------------------------------------------------------------
/public/assets/images/products/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/products/5.png
--------------------------------------------------------------------------------
/public/assets/images/products/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/products/6.png
--------------------------------------------------------------------------------
/public/assets/images/services/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/services/1.jpg
--------------------------------------------------------------------------------
/public/assets/images/services/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/services/2.jpg
--------------------------------------------------------------------------------
/public/assets/images/services/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/services/3.jpg
--------------------------------------------------------------------------------
/public/assets/images/services/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/services/4.jpg
--------------------------------------------------------------------------------
/public/assets/images/services/5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/services/5.jpg
--------------------------------------------------------------------------------
/public/assets/images/services/6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/services/6.jpg
--------------------------------------------------------------------------------
/public/assets/images/team/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/team/1.jpg
--------------------------------------------------------------------------------
/public/assets/images/team/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/team/2.jpg
--------------------------------------------------------------------------------
/public/assets/images/team/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/public/assets/images/team/3.jpg
--------------------------------------------------------------------------------
/public/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/public/services.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "_id": "635a0c0b64a6d231228942ae",
4 | "service_id": "04",
5 | "title": "Engine Oil Change",
6 | "img": "https://i.ibb.co/T2cpBd5/888.jpg",
7 | "price": "20.00",
8 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
9 | "facility": [
10 | {
11 | "name": "Instant Car Services",
12 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
13 | },
14 | {
15 | "name": "24/7 Quality Service",
16 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
17 | },
18 | {
19 | "name": "Easy Customer Service",
20 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
21 | },
22 | {
23 | "name": "Quality Cost Service",
24 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
25 | }
26 | ]
27 | },
28 | {
29 | "_id": "635a0c0b64a6d231228942af",
30 | "service_id": "05",
31 | "title": "Battery Charge",
32 | "img": "https://i.ibb.co/ydCbDN3/5555.jpg",
33 | "price": "20.00",
34 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
35 | "facility": [
36 | {
37 | "name": "Instant Car Services",
38 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
39 | },
40 | {
41 | "name": "24/7 Quality Service",
42 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
43 | },
44 | {
45 | "name": "Easy Customer Service",
46 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
47 | },
48 | {
49 | "name": "Quality Cost Service",
50 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
51 | }
52 | ]
53 | },
54 | {
55 | "_id": "635b591a1dafe382a9da8c96",
56 | "service_id": "01",
57 | "title": "Full car Repair",
58 | "img": "https://i.ibb.co/R6Z2nFM/55.jpg",
59 | "price": "200.00",
60 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
61 | "facility": [
62 | {
63 | "name": "Instant Car Services",
64 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
65 | },
66 | {
67 | "name": "24/7 Quality Service",
68 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
69 | },
70 | {
71 | "name": "Easy Customer Service",
72 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
73 | },
74 | {
75 | "name": "Quality Cost Service",
76 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
77 | }
78 | ]
79 | },
80 | {
81 | "_id": "635b5afc1dafe382a9da8c98",
82 | "service_id": "02",
83 | "title": "Engine Repair",
84 | "img": "https://i.ibb.co/5MvmD2g/88.jpg",
85 | "price": "150.00",
86 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
87 | "facility": [
88 | {
89 | "name": "Instant Car Services",
90 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
91 | },
92 | {
93 | "name": "24/7 Quality Service",
94 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
95 | },
96 | {
97 | "name": "Easy Customer Service",
98 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
99 | },
100 | {
101 | "name": "Quality Cost Service",
102 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
103 | }
104 | ]
105 | },
106 | {
107 | "_id": "635b5b691dafe382a9da8c99",
108 | "service_id": "03",
109 | "title": "Automatic Services",
110 | "img": "https://i.ibb.co/wh7t3N3/555.jpg",
111 | "price": "30.00",
112 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
113 | "facility": [
114 | {
115 | "name": "Instant Car Services",
116 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
117 | },
118 | {
119 | "name": "24/7 Quality Service",
120 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
121 | },
122 | {
123 | "name": "Easy Customer Service",
124 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
125 | },
126 | {
127 | "name": "Quality Cost Service",
128 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
129 | }
130 | ]
131 | },
132 | {
133 | "_id": "635b5ba51dafe382a9da8c9a",
134 | "service_id": "06",
135 | "title": "Electrical System",
136 | "img": "https://i.ibb.co/KzCG8qr/8888.jpg",
137 | "price": "20.00",
138 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
139 | "facility": [
140 | {
141 | "name": "Instant Car Services",
142 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
143 | },
144 | {
145 | "name": "24/7 Quality Service",
146 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
147 | },
148 | {
149 | "name": "Easy Customer Service",
150 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
151 | },
152 | {
153 | "name": "Quality Cost Service",
154 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
155 | }
156 | ]
157 | }
158 | ]
159 |
--------------------------------------------------------------------------------
/src/app/api/auth/[...nextauth]/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB";
2 | import NextAuth from "next-auth/next";
3 | import CredentialsProvider from "next-auth/providers/credentials";
4 | import GoogleProvider from "next-auth/providers/google";
5 | import GitHubProvider from "next-auth/providers/github";
6 | import bcrypt from "bcrypt";
7 |
8 | const handler = NextAuth({
9 | secret: process.env.NEXT_PUBLIC_AUTH_SECRET,
10 | session: {
11 | strategy: "jwt",
12 | maxAge: 30 * 24 * 60 * 60,
13 | rolling: false,
14 | },
15 | providers: [
16 | CredentialsProvider({
17 | credentials: {
18 | email: {},
19 | password: {},
20 | },
21 | async authorize(credentials) {
22 | const { email, password } = credentials;
23 | if (!email || !password) {
24 | return null;
25 | }
26 | const db = await connectDB();
27 | const currentUser = await db.collection("users").findOne({ email });
28 | if (!currentUser) {
29 | return null;
30 | }
31 | const passwordMatched = bcrypt.compareSync(
32 | password,
33 | currentUser.password
34 | );
35 | if (!passwordMatched) {
36 | return null;
37 | }
38 | return currentUser;
39 | },
40 | }),
41 | GoogleProvider({
42 | clientId: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID,
43 | clientSecret: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_SECRET,
44 | }),
45 | GitHubProvider({
46 | clientId: process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID,
47 | clientSecret: process.env.NEXT_PUBLIC_GITHUB_CLIENT_SECRET,
48 | }),
49 | ],
50 | pages: {
51 | signIn: "/login",
52 |
53 | },
54 | callbacks: {
55 | async signIn({ user, account }) {
56 | if (account.provider === "google" || account.provider === "github" || account.provider === "facebook") {
57 | const { name, email, image } = user;
58 | try {
59 | const db = await connectDB();
60 | const userCollection = db.collection("users");
61 | const userExist = await userCollection.findOne({ email });
62 | if (!userExist) {
63 | const res = await userCollection.insertOne(user);
64 | return user;
65 | } else {
66 | return user;
67 | }
68 | } catch (error) {
69 | console.log(error);
70 | }
71 | } else {
72 | return user;
73 | }
74 | },
75 | },
76 | });
77 |
78 | export { handler as GET, handler as POST };
79 |
--------------------------------------------------------------------------------
/src/app/checkout/[id]/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { getServicesDetails } from "@/services/getServices";
3 | import { useSession } from "next-auth/react";
4 | import Image from "next/image";
5 | import React, { useEffect, useState } from "react";
6 | import { ToastContainer, toast } from "react-toastify";
7 |
8 | const Checkout = ({ params }) => {
9 | const {data} = useSession();
10 | const [ service, setService ] = useState({});
11 | const loadService = async () => {
12 | const details = await getServicesDetails(params.id);
13 | setService(details.service);
14 | };
15 | const { _id, title, description, img, price, facility } = service || {};
16 |
17 | const handleBooking = async (event) => {
18 | event.preventDefault();
19 | const newBooking = {
20 | email : data?.user?.email,
21 | name : data?.user?.name,
22 | address : event.target.address.value,
23 | phone : event.target.phone.value,
24 | date : event.target.date.value,
25 | serviceTitle : title,
26 | serviceID : _id,
27 | price : price,
28 | }
29 |
30 | const resp = await fetch('https://car-doctor-pro-nine.vercel.app/checkout/api/new-booking', {
31 | method: 'POST',
32 | body: JSON.stringify(newBooking),
33 | headers : {
34 | "content-type" : "application/json"
35 | }
36 | })
37 | const response =await resp?.json()
38 | toast.success(response?.message)
39 | event.target.reset()
40 |
41 | };
42 |
43 | useEffect(() => {
44 | loadService()
45 | },[params])
46 |
47 | return (
48 |
49 |
50 |
51 |
59 |
60 |
61 | Checkout {title}
62 |
63 |
64 |
65 |
137 |
138 | );
139 | };
140 |
141 | export default Checkout;
142 |
--------------------------------------------------------------------------------
/src/app/checkout/api/new-booking/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB";
2 |
3 | export const POST = async (request) => {
4 | const newBooking = await request.json();
5 | const db = await connectDB();
6 | const bookingsCollection = db.collection("bookings");
7 |
8 | try {
9 | const res = await bookingsCollection.insertOne(newBooking);
10 | return Response.json({ message: "Booked Successfully" }, { status: 200 });
11 | } catch (error) {
12 | return Response.json({ message: "Something Went Wrong" }, { status: 400 });
13 | }
14 | };
15 |
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProgrammingHero1/B9-Car-Doctor-pro-with-NextJs/de83214f8e16d39a78cd0ea8d99e7730971346fb/src/app/favicon.ico
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 |
6 |
7 | @layer utilities {
8 | .text-balance {
9 | text-wrap: balance;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/app/layout.js:
--------------------------------------------------------------------------------
1 | import { Inter } from "next/font/google";
2 | import "./globals.css";
3 | import Navbar from "@/components/shared/Navbar";
4 | import Footer from "@/components/shared/Footer";
5 | import AuthProvider from "@/services/AuthProvider";
6 |
7 | import 'react-toastify/dist/ReactToastify.css';
8 | import { ToastContainer } from "react-toastify";
9 | import { Suspense } from "react";
10 | const inter = Inter({ subsets: ["latin"] });
11 |
12 | export const metadata = {
13 | title: {
14 | default: "Car Doctor",
15 | template: "%s | Car Doctor",
16 | },
17 | description: "Car Reaper Workshop",
18 | };
19 |
20 | export default function RootLayout({ children }) {
21 | return (
22 |
23 |
24 |
25 |
26 |
27 |
28 | {children}
29 |
30 |
31 |
32 |
33 |
34 | );
35 | }
36 |
--------------------------------------------------------------------------------
/src/app/login/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Image from "next/image";
3 | import Link from "next/link";
4 | import React from "react";
5 | import { signIn, useSession } from "next-auth/react";
6 | import { BsGoogle, BsGithub } from "react-icons/bs";
7 | import { usePathname, useRouter, useSearchParams } from "next/navigation";
8 | import SocialSignin from "@/components/shared/SocialSignin";
9 | const Page = () => {
10 | const router = useRouter();
11 | const session = useSession();
12 | const searchParams = useSearchParams();
13 | const path = searchParams.get("redirect");
14 |
15 | const handleLogin = async (event) => {
16 | event.preventDefault();
17 | const email = event.target.email.value;
18 | const password = event.target.password.value;
19 | const resp = await signIn("credentials", {
20 | email,
21 | password,
22 | redirect: true,
23 | callbackUrl: path ? path : "/",
24 | });
25 | };
26 |
27 | return (
28 |
29 |
30 |
31 |
37 |
38 |
39 |
40 | Sign In
41 |
42 |
66 |
67 |
or sign in with
68 |
69 |
70 | not have account ?{" "}
71 |
72 | Sign Up
73 |
74 |
75 |
76 |
77 |
78 |
79 | );
80 | };
81 |
82 | export default Page;
83 |
--------------------------------------------------------------------------------
/src/app/my-bookings/api/[email]/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB"
2 | import { NextResponse } from "next/server";
3 |
4 | export const GET = async (request, {params}) => {
5 | const db =await connectDB()
6 | const bookingsCollection = db.collection('bookings')
7 | try {
8 | const myBookings = await bookingsCollection.find({email : params.email}).toArray();
9 | return NextResponse.json({myBookings})
10 | } catch (error) {
11 | return NextResponse.json({message : "No Data Found"})
12 | }
13 | }
--------------------------------------------------------------------------------
/src/app/my-bookings/api/booking/[id]/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB";
2 | import { ObjectId } from "mongodb";
3 | import { NextResponse } from "next/server";
4 |
5 | export const DELETE = async (request, { params }) => {
6 | const db = await connectDB();
7 | const bookingsCollection = db.collection("bookings");
8 | try {
9 | const resp = await bookingsCollection.deleteOne({
10 | _id: new ObjectId(params.id),
11 | });
12 | return NextResponse.json({ message: "deleted the booking", response: resp });
13 | } catch (error) {
14 | return NextResponse.json({ message: "Something Went Wrong" });
15 | }
16 | };
17 |
18 | export const PATCH = async (request, { params }) => {
19 | const db = await connectDB();
20 | const bookingsCollection = db.collection("bookings");
21 | const updateDoc = await request.json();
22 | try {
23 | const resp = await bookingsCollection.updateOne(
24 | { _id: new ObjectId(params.id) },
25 | {
26 | $set: {
27 | ...updateDoc
28 | },
29 | },
30 | {
31 | upsert : true
32 | }
33 | );
34 | return NextResponse.json({ message: "updated the booking", response: resp });
35 | } catch (error) {
36 | return NextResponse.json({ message: "Something Went Wrong" });
37 | }
38 | };
39 |
40 | export const GET = async (request, { params }) => {
41 | const db = await connectDB();
42 | const bookingsCollection = db.collection("bookings");
43 | try {
44 | const resp = await bookingsCollection.findOne({
45 | _id: new ObjectId(params.id),
46 | });
47 | return NextResponse.json({ message: "booking found",
48 | data: resp });
49 | } catch (error) {
50 | return NextResponse.json({ message: "Something Went Wrong" });
51 | }
52 | };
53 |
--------------------------------------------------------------------------------
/src/app/my-bookings/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { useSession } from "next-auth/react";
3 | import Image from "next/image";
4 | import Link from "next/link";
5 | import React, { useEffect, useState } from "react";
6 | import { ToastContainer, toast } from "react-toastify";
7 |
8 | const Page = () => {
9 | const session = useSession();
10 | const [bookings, setBooking] = useState([]);
11 | const loadData = async () => {
12 | const resp = await fetch(
13 | `https://car-doctor-pro-nine.vercel.app/my-bookings/api/${session?.data?.user?.email}`
14 | );
15 | const data = await resp.json();
16 | setBooking(data?.myBookings);
17 | };
18 |
19 | const handleDelete = async (id) => {
20 | const deleted = await fetch(
21 | `https://car-doctor-pro-nine.vercel.app/my-bookings/api/booking/${id}`, {
22 | method : "DELETE",
23 | }
24 | );
25 | const resp = await deleted.json();
26 | if(resp?.response?.deletedCount > 0) {
27 | toast.success(resp?.message)
28 | loadData();
29 | }
30 | };
31 |
32 | useEffect(() => {
33 | loadData();
34 | }, [session]);
35 |
36 | return (
37 |
38 |
39 |
40 |
48 |
49 |
50 | My Bookings
51 |
52 |
53 |
54 |
55 |
56 |
57 | {/* head */}
58 |
59 |
60 |
61 | Service Name
62 | Price
63 | Booking Date
64 | Actions
65 |
66 |
67 |
68 | {/* row 1 */}
69 | {bookings?.map(({ serviceTitle, _id, date, price }) => (
70 |
71 | 1
72 | {serviceTitle}
73 | {price}
74 | {date}
75 |
76 |
77 | Edit
78 | handleDelete(_id)}
80 | class="btn btn-error"
81 | >
82 | Delete
83 |
84 |
85 |
86 |
87 | ))}
88 |
89 |
90 |
91 |
92 |
93 | );
94 | };
95 |
96 | export default Page;
97 |
--------------------------------------------------------------------------------
/src/app/my-bookings/update/[id]/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { useSession } from "next-auth/react";
3 | import Image from "next/image";
4 | import React, { useEffect, useState } from "react";
5 | import { toast } from "react-toastify";
6 |
7 | const Page = ({ params }) => {
8 | const { data } = useSession();
9 | const [booking, setBooking] = useState([]);
10 |
11 | const loadBooking = async () => {
12 | const bookingDetail = await fetch(
13 | `https://car-doctor-pro-nine.vercel.app/my-bookings/api/booking/${params.id}`
14 | );
15 | const data = await bookingDetail.json();
16 | setBooking(data.data);
17 | };
18 |
19 | const handleUpdateBooking = async (event) => {
20 | event.preventDefault();
21 | const updatedBooking = {
22 | date: event.target.date.value,
23 | phone: event.target.phone.value,
24 | address: event.target.address.value,
25 | };
26 | const resp = await fetch(
27 | `https://car-doctor-pro-nine.vercel.app/my-bookings/api/booking/${params.id}`,
28 | {
29 | method: "PATCH",
30 | body: JSON.stringify(updatedBooking),
31 | headers: {
32 | "content-type": "application/json",
33 | },
34 | }
35 | );
36 | if(resp.status === 200) {
37 | toast.success("Updated Successfully")
38 | }
39 | };
40 |
41 | useEffect(() => {
42 | loadBooking();
43 | }, [params]);
44 |
45 | return (
46 |
47 |
48 |
56 |
57 |
58 | Update Booking
59 |
60 |
61 |
62 |
146 |
147 | );
148 | };
149 |
150 | export default Page;
151 |
--------------------------------------------------------------------------------
/src/app/page.js:
--------------------------------------------------------------------------------
1 | export const dynamic = "force-dynamic";
2 | import Homepage from "@/components/Homepage/Homepage";
3 | import { ToastContainer } from 'react-toastify';
4 |
5 |
6 | export default function Home() {
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/src/app/services/[id]/page.jsx:
--------------------------------------------------------------------------------
1 | import { getServicesDetails } from '@/services/getServices';
2 | import Image from 'next/image';
3 | import Link from 'next/link';
4 | import React from 'react';
5 |
6 | export const metadata = {
7 | title : "Service Details",
8 | description : "Service Details Page"
9 | }
10 |
11 |
12 | const Page = async ({params}) => {
13 | const details =await getServicesDetails(params.id)
14 | const {_id, title, description, img, price, facility} = details.service;
15 | return (
16 |
17 |
18 |
19 |
27 |
28 |
29 | Details of {title}
30 |
31 |
32 |
33 |
34 |
35 |
{title}
36 |
{description}
37 |
38 |
39 |
40 |
41 |
42 |
43 | {facility.map((item, index) => (
44 |
48 |
{item?.name}
49 |
{item?.details}
50 |
51 | ))}
52 |
53 |
54 |
55 |
56 |
57 |
Price:
58 |
${price}
59 |
60 |
61 | Check out
62 |
63 |
64 |
65 |
66 |
67 | );
68 | }
69 |
70 | export default Page;
71 |
--------------------------------------------------------------------------------
/src/app/services/api/[id]/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB"
2 | import { NextResponse } from "next/server";
3 |
4 | export const GET = async (request, {params}) => {
5 | const db =await connectDB()
6 | const servicesCollection = db.collection('services')
7 | try {
8 | const service = await servicesCollection.findOne({_id : params.id});
9 | return NextResponse.json({service})
10 | } catch (error) {
11 | return NextResponse.json({message : "No Data Found"})
12 | }
13 | }
--------------------------------------------------------------------------------
/src/app/services/api/get-all/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB"
2 | import { NextResponse } from "next/server";
3 |
4 | export const GET = async () => {
5 | const db =await connectDB()
6 | const servicesCollection = db.collection('services')
7 | try {
8 | const services = await servicesCollection.find().toArray();
9 | return NextResponse.json({services})
10 | } catch (error) {
11 | console.log(error);
12 | return NextResponse.json({message : "No Data Found", error})
13 | }
14 | }
--------------------------------------------------------------------------------
/src/app/services/api/seed/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB"
2 | import { services } from "@/lib/services";
3 | import { NextResponse } from "next/server";
4 |
5 | export const GET = async () => {
6 | const db =await connectDB()
7 | const servicesCollection = db.collection('services')
8 | try {
9 | await servicesCollection.deleteMany();
10 | const resp = await servicesCollection.insertMany(services);
11 | return NextResponse.json({message : "Seeded Successfully"})
12 | } catch (error) {
13 | return NextResponse.json({message : "No Data Found"})
14 | }
15 | }
--------------------------------------------------------------------------------
/src/app/signup/api/route.js:
--------------------------------------------------------------------------------
1 | import { connectDB } from "@/lib/connectDB";
2 | import bcrypt from "bcrypt";
3 | import { NextResponse } from "next/server";
4 | export const POST = async (request) => {
5 | const newUser = await request.json();
6 | try {
7 | const db = await connectDB();
8 | const userCollection = db.collection("users");
9 | const exist =await userCollection.findOne({ email: newUser.email });
10 | console.log(exist);
11 | if(exist) {
12 | return NextResponse.json({ message: "User Exists" }, { status: 304 });
13 | }
14 | const hashedPassword = bcrypt.hashSync(newUser.password, 14);
15 | const resp = await userCollection.insertOne({...newUser, password: hashedPassword});
16 |
17 | return NextResponse.json({ message: "User Created" }, { status: 200 });
18 | } catch (error) {
19 | return NextResponse.json(
20 | { message: "Something Went Wrong", error },
21 | { status: 500 }
22 | );
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/src/app/signup/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import SocialSignin from "@/components/shared/SocialSignin";
3 | import Image from "next/image";
4 | import Link from "next/link";
5 | import React, { Suspense } from "react";
6 | import { BsGithub, BsGoogle } from "react-icons/bs";
7 |
8 | const SignUpPage = () => {
9 | const handleSignUp = async (event) => {
10 | event.preventDefault();
11 | const newUser = {
12 | name: event.target.name.value,
13 | email: event.target.email.value,
14 | password: event.target.password.value,
15 | };
16 | const resp = await fetch("https://car-doctor-pro-nine.vercel.app/signup/api", {
17 | method: "POST",
18 | body: JSON.stringify(newUser),
19 | headers: {
20 | "content-type": "application/json",
21 | },
22 | });
23 | if (resp.status === 200) {
24 | event.target.reset();
25 | }
26 | };
27 |
28 | return (
29 |
30 |
31 |
32 |
38 |
39 |
40 |
41 | Sign Up
42 |
43 |
75 |
76 |
or sign in with
77 |
78 |
79 | Already have account ?{" "}
80 |
81 | Sign In
82 |
83 |
84 |
85 |
86 |
87 |
88 | );
89 | };
90 |
91 | export default SignUpPage;
92 |
--------------------------------------------------------------------------------
/src/components/Homepage/About.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Image from "next/image";
3 | const About = () => {
4 | return (
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
About Us
13 |
We are qualified & of experience in this field
14 |
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which do not look even slightly believable.
15 |
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which do not look even slightly believable.
16 |
Get More Info
17 |
18 |
19 |
20 | );
21 | };
22 |
23 | export default About;
24 |
--------------------------------------------------------------------------------
/src/components/Homepage/Banner.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const Banner = () => {
4 | return (
5 |
6 |
7 | {banners.map((banner, index) => (
8 |
16 |
17 |
18 |
{banner.title}
19 |
{banner.description}
20 |
Discover More
21 |
Latest Project
22 |
23 |
24 |
32 |
33 | ))}
34 |
35 |
36 | );
37 | };
38 |
39 | const banners = [
40 | {
41 | title: "Affordable Price For Car Servicing",
42 | description:
43 | "There are many variations of passages of available, but the majority have suffered alteration in some form",
44 | next: "#slide2",
45 | prev: "#slide4",
46 | },
47 | {
48 | title: "Affordable Price For Car Servicing",
49 | description:
50 | "There are many variations of passages of available, but the majority have suffered alteration in some form",
51 | next: "#slide3",
52 | prev: "#slide1",
53 | },
54 | {
55 | title: "Affordable Price For Car Servicing",
56 | description:
57 | "There are many variations of passages of available, but the majority have suffered alteration in some form",
58 | next: "#slide4",
59 | prev: "#slide2",
60 | },
61 | {
62 | title: "Affordable Price For Car Servicing",
63 | description:
64 | "There are many variations of passages of available, but the majority have suffered alteration in some form",
65 | next: "#slide1",
66 | prev: "#slide3",
67 | },
68 | ];
69 |
70 | export default Banner;
71 |
--------------------------------------------------------------------------------
/src/components/Homepage/Homepage.jsx:
--------------------------------------------------------------------------------
1 |
2 | import React from 'react';
3 | import Banner from './Banner';
4 | import About from './About';
5 | import Services from './Services';
6 |
7 | const Homepage = () => {
8 | return (
9 |
14 | );
15 | }
16 |
17 | export default Homepage;
18 |
--------------------------------------------------------------------------------
/src/components/Homepage/Services.jsx:
--------------------------------------------------------------------------------
1 |
2 | import React from "react";
3 | import ServiceCard from "../cards/ServiceCard";
4 | import { getServices } from "@/services/getServices";
5 |
6 | const Services = async () => {
7 | const { services } = await getServices();
8 |
9 | if (services?.length <= 0) {
10 | return null;
11 | }
12 |
13 | return (
14 |
15 |
16 |
Our Services
17 |
Our Service Area
18 |
19 | the majority have suffered alteration in some form, by injected
20 | humour, or randomised words which do not look even slightly
21 | believable.{" "}
22 |
23 |
24 |
25 | {services?.length > 0 &&
26 | services?.map((service) => (
27 |
28 | ))}
29 |
30 |
31 | );
32 | };
33 |
34 | export default Services;
35 |
--------------------------------------------------------------------------------
/src/components/cards/ServiceCard.jsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import Link from "next/link";
3 | import React from "react";
4 |
5 | const ServiceCard = ({service}) => {
6 | const {title, img, price, _id} = service || {};
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
{title}
14 |
15 |
Price : ${price}
16 | View Details
17 |
18 |
19 |
20 | );
21 | };
22 |
23 | export default ServiceCard;
24 |
--------------------------------------------------------------------------------
/src/components/shared/Footer.jsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import Link from "next/link";
3 | import React from "react";
4 |
5 | const Footer = () => {
6 | return (
7 |
36 | );
37 | };
38 |
39 | export default Footer;
40 |
--------------------------------------------------------------------------------
/src/components/shared/Navbar.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import { signOut, useSession } from "next-auth/react";
3 | import Image from "next/image";
4 | import Link from "next/link";
5 | import React from "react";
6 | import { IoCartOutline, IoSearchSharp } from "react-icons/io5";
7 |
8 | const Navbar = () => {
9 | const session = useSession()
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | {navItems.map((item) => (
21 |
26 | {item.title}
27 |
28 | ))}
29 |
30 |
31 |
32 |
33 |
34 |
35 |
Appointment
36 | {/*
37 |
38 |
*/}
39 | { session?.status === 'loading' &&
40 |
Loading....
41 | }
42 | { session?.status === 'unauthenticated' &&
43 |
Login
44 | }
45 | { session?.status === 'authenticated' &&
46 |
signOut()}>Logout
47 | }
48 |
49 |
50 |
51 |
52 | );
53 | };
54 |
55 | const navItems = [
56 | {
57 | title: "Home",
58 | path: "/",
59 | },
60 | {
61 | title: "About",
62 | path: "/about",
63 | },
64 | {
65 | title: "Services",
66 | path: "/services",
67 | },
68 | {
69 | title: "MyBookings",
70 | path: "/my-bookings",
71 | },
72 | {
73 | title: "Blog",
74 | path: "/blog",
75 | },
76 | {
77 | title: "Contacts",
78 | path: "/contacts",
79 | },
80 | ];
81 |
82 | export default Navbar;
83 |
--------------------------------------------------------------------------------
/src/components/shared/SocialSignin.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import { signIn, useSession } from "next-auth/react";
3 | import { useRouter, useSearchParams } from "next/navigation";
4 | import React from "react";
5 | import { BsGithub, BsGoogle } from "react-icons/bs";
6 |
7 | const SocialSignin = () => {
8 | const router = useRouter()
9 | const searchParams = useSearchParams()
10 |
11 | const path = searchParams.get('redirect')
12 | const session = useSession()
13 | const handleSocialLogin = (provider) => {
14 | const resp = signIn(provider, {
15 | redirect : true,
16 | callbackUrl : path ? path : '/'
17 | })
18 | }
19 |
20 | return (
21 |
22 | handleSocialLogin('google')} className="btn flex items-center justify-center text-green-500">
23 |
24 |
25 |
26 | handleSocialLogin('github')} className="btn flex items-center justify-center text-primary">
27 |
28 |
29 |
30 | );
31 | };
32 |
33 | export default SocialSignin;
34 |
--------------------------------------------------------------------------------
/src/lib/connectDB.js:
--------------------------------------------------------------------------------
1 | import { MongoClient, ServerApiVersion } from "mongodb";
2 | let db;
3 | export const connectDB = async () => {
4 | if (db) return db;
5 | try {
6 | const uri = process.env.NEXT_PUBLIC_MONGODB_URI
7 | const client = new MongoClient(uri, {
8 | serverApi: {
9 | version: ServerApiVersion.v1,
10 | strict: true,
11 | deprecationErrors: true,
12 | },
13 | });
14 | db = client.db('car-doctor')
15 | return db;
16 | } catch (error) {
17 | console.log({error});
18 | }
19 | };
20 |
--------------------------------------------------------------------------------
/src/lib/services.js:
--------------------------------------------------------------------------------
1 | export const services = [
2 | {
3 | "_id": "635a0c0b64a6d231228942ae",
4 | "service_id": "04",
5 | "title": "Engine Oil Change",
6 | "img": "https://i.ibb.co/T2cpBd5/888.jpg",
7 | "price": "20.00",
8 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
9 | "facility": [
10 | {
11 | "name": "Instant Car Services",
12 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
13 | },
14 | {
15 | "name": "24/7 Quality Service",
16 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
17 | },
18 | {
19 | "name": "Easy Customer Service",
20 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
21 | },
22 | {
23 | "name": "Quality Cost Service",
24 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
25 | }
26 | ]
27 | },
28 | {
29 | "_id": "635a0c0b64a6d231228942af",
30 | "service_id": "05",
31 | "title": "Battery Charge",
32 | "img": "https://i.ibb.co/ydCbDN3/5555.jpg",
33 | "price": "20.00",
34 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
35 | "facility": [
36 | {
37 | "name": "Instant Car Services",
38 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
39 | },
40 | {
41 | "name": "24/7 Quality Service",
42 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
43 | },
44 | {
45 | "name": "Easy Customer Service",
46 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
47 | },
48 | {
49 | "name": "Quality Cost Service",
50 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
51 | }
52 | ]
53 | },
54 | {
55 | "_id": "635b591a1dafe382a9da8c96",
56 | "service_id": "01",
57 | "title": "Full car Repair",
58 | "img": "https://i.ibb.co/R6Z2nFM/55.jpg",
59 | "price": "200.00",
60 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
61 | "facility": [
62 | {
63 | "name": "Instant Car Services",
64 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
65 | },
66 | {
67 | "name": "24/7 Quality Service",
68 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
69 | },
70 | {
71 | "name": "Easy Customer Service",
72 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
73 | },
74 | {
75 | "name": "Quality Cost Service",
76 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
77 | }
78 | ]
79 | },
80 | {
81 | "_id": "635b5afc1dafe382a9da8c98",
82 | "service_id": "02",
83 | "title": "Engine Repair",
84 | "img": "https://i.ibb.co/5MvmD2g/88.jpg",
85 | "price": "150.00",
86 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
87 | "facility": [
88 | {
89 | "name": "Instant Car Services",
90 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
91 | },
92 | {
93 | "name": "24/7 Quality Service",
94 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
95 | },
96 | {
97 | "name": "Easy Customer Service",
98 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
99 | },
100 | {
101 | "name": "Quality Cost Service",
102 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
103 | }
104 | ]
105 | },
106 | {
107 | "_id": "635b5b691dafe382a9da8c99",
108 | "service_id": "03",
109 | "title": "Automatic Services",
110 | "img": "https://i.ibb.co/wh7t3N3/555.jpg",
111 | "price": "30.00",
112 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
113 | "facility": [
114 | {
115 | "name": "Instant Car Services",
116 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
117 | },
118 | {
119 | "name": "24/7 Quality Service",
120 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
121 | },
122 | {
123 | "name": "Easy Customer Service",
124 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
125 | },
126 | {
127 | "name": "Quality Cost Service",
128 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
129 | }
130 | ]
131 | },
132 | {
133 | "_id": "635b5ba51dafe382a9da8c9a",
134 | "service_id": "06",
135 | "title": "Electrical System",
136 | "img": "https://i.ibb.co/KzCG8qr/8888.jpg",
137 | "price": "20.00",
138 | "description": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Eius veniam nostrum dolores nemo quas. Minima ullam, veniam, nesciunt quae dolore animi blanditiis deserunt, ea esse dolorum ipsum quibusdam ipsa! Corrupti at, excepturi, fugiat aut nihil neque aliquid sapiente dignissimos provident, animi molestiae ipsum. Repudiandae ipsa id nihil reiciendis soluta eos ducimus pariatur, nam architecto tenetur quo quos commodi est libero repellendus vitae. Fuga numquam nulla nam, facere neque expedita voluptatibus pariatur necessitatibus vel, dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum. Aspernatur ex quibusdam at cum nulla!",
139 | "facility": [
140 | {
141 | "name": "Instant Car Services",
142 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
143 | },
144 | {
145 | "name": "24/7 Quality Service",
146 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
147 | },
148 | {
149 | "name": "Easy Customer Service",
150 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
151 | },
152 | {
153 | "name": "Quality Cost Service",
154 | "details": "Fuga numquam nulla nam, facere neque dignissimos ab esse magni accusamus eveniet ad corrupti, architecto nostrum."
155 | }
156 | ]
157 | }
158 | ]
--------------------------------------------------------------------------------
/src/middleware.js:
--------------------------------------------------------------------------------
1 | import { cookies } from "next/headers";
2 | import { NextResponse } from "next/server";
3 |
4 | export const middleware = async (request) => {
5 | const token = cookies(request).get("__Secure-next-auth.session-token");
6 | const pathname = request.nextUrl.pathname
7 | if(pathname.includes('api')) {
8 | return NextResponse.next();
9 | }
10 |
11 | if (!token) {
12 | return NextResponse.redirect(new URL(`/login?redirect=${pathname}`, request.url));
13 | }
14 | return NextResponse.next();
15 | };
16 |
17 | export const config = {
18 | matcher: ["/my-bookings/:path*", "/services/:path*",],
19 | };
20 |
--------------------------------------------------------------------------------
/src/services/AuthProvider.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import { SessionProvider } from 'next-auth/react';
3 | import React from 'react';
4 |
5 | const AuthProvider = ({children}) => {
6 | return (
7 |
8 | {children}
9 |
10 | );
11 | }
12 |
13 | export default AuthProvider;
14 |
--------------------------------------------------------------------------------
/src/services/getServices.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | export const getServices = async () => {
4 | try {
5 | const res = await axios.get(
6 | `${process.env.NEXT_PUBLIC_BASE_URL}/services/api/get-all`
7 | );
8 | return res.data;
9 | } catch (error) {
10 | console.log(error);
11 | return [];
12 | }
13 | };
14 |
15 | export const getServicesDetails = async (id) => {
16 | try {
17 | const res = await axios.get(
18 | `${process.env.NEXT_PUBLIC_BASE_URL}/services/api/${id}`
19 | );
20 | return res.data;
21 | } catch (error) {
22 | return {};
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
5 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
7 | ],
8 | theme: {
9 | extend: {
10 | backgroundImage: {
11 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
12 | "gradient-conic":
13 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
14 | },
15 | },
16 | },
17 | plugins: [
18 | require('daisyui'),
19 | ],
20 | daisyui: {
21 | themes: [
22 | {
23 | carDoctorTheme: {
24 | ...require("daisyui/src/theming/themes")["light"],
25 | primary: "#FF3811",
26 | secondary: "teal",
27 |
28 | ".btn-primary": {
29 | "color" : "#fff"
30 | },
31 |
32 | ".btn-outline.btn-primary:hover": {
33 | "color" : "#fff"
34 | },
35 | },
36 | },
37 | "dark",
38 | ],
39 | },
40 | };
41 |
--------------------------------------------------------------------------------