├── Server ├── .gitignore ├── vercel.json ├── config │ ├── razorpay.js │ ├── cloudinary.js │ └── database.js ├── models │ ├── Section.js │ ├── Category.js │ ├── SubSection.js │ ├── Profile.js │ ├── CourseProgress.js │ ├── RatingAndReview.js │ ├── OTP.js │ ├── Course.js │ └── User.js ├── utils │ ├── imageUploader.js │ ├── secToDuration.js │ └── mailSender.js ├── routes │ ├── Payments.js │ ├── Profile.js │ ├── User.js │ └── Course.js ├── package.json ├── index.js ├── controllers │ ├── courseProgress.js │ ├── ResetPassword.js │ └── SubSection.js ├── mail │ └── templates │ │ ├── emailVerificationTemplate.js │ │ ├── passwordUpdate.js │ │ ├── paymentSuccessEmail.js │ │ ├── courseEnrollmentEmail.js │ │ └── contactFormRes.js └── middlewares │ └── auth.js ├── src ├── index.css ├── assets │ ├── Images │ │ ├── Photo.jpg │ │ ├── frame.png │ │ ├── banner.mp4 │ │ ├── login.webp │ │ ├── signup.webp │ │ ├── Instructor.png │ │ ├── aboutus1.webp │ │ ├── aboutus2.webp │ │ ├── aboutus3.webp │ │ ├── boxoffice.png │ │ ├── FoundingStory.png │ │ ├── TimelineImage.png │ │ ├── Know_your_progress.png │ │ ├── Plan_your_lessons.png │ │ └── Compare_with_others.png │ ├── Logo │ │ ├── rzp_logo.png │ │ ├── Logo-Full-Dark.png │ │ ├── Logo-Full-Light.png │ │ ├── Logo-Small-Dark.png │ │ └── Logo-Small-Light.png │ └── TimeLineLogo │ │ ├── Logo4.svg │ │ ├── Logo3.svg │ │ ├── Logo1.svg │ │ └── Logo2.svg ├── utils │ ├── dateFormatter.js │ ├── constants.js │ ├── avgRating.js │ └── secToDurationFrontend.js ├── pages │ ├── Error.jsx │ ├── Login.jsx │ ├── Signup.jsx │ ├── Dashboard.js │ ├── ViewCourse.js │ ├── ForgotPassword.js │ ├── ContactPage.js │ └── VerifyEmail.js ├── data │ ├── navbar-links.js │ ├── dashboard-links.js │ └── footer-links.js ├── components │ ├── core │ │ ├── HomePage │ │ │ ├── HiglightText2.js │ │ │ ├── HighlightText3.js │ │ │ ├── HighlightText.js │ │ │ ├── Border.css │ │ │ ├── Button.js │ │ │ ├── CourseCard.js │ │ │ ├── InstructorSection.jsx │ │ │ ├── LearningLanguageSection.jsx │ │ │ ├── CodeBlocks.js │ │ │ ├── ExploreMore.js │ │ │ └── TimelineSection.jsx │ │ ├── Auth │ │ │ ├── PrivateRoute.jsx │ │ │ ├── OpenRoute.jsx │ │ │ ├── Template.jsx │ │ │ ├── ProfileDropDown.js │ │ │ └── LoginForm.jsx │ │ ├── AboutPage │ │ │ ├── ContactFormSection.jsx │ │ │ ├── Quote.jsx │ │ │ ├── Stats.jsx │ │ │ └── LearningGrid.jsx │ │ ├── Dashboard │ │ │ ├── Settings │ │ │ │ ├── index.js │ │ │ │ ├── DeleteAccount.js │ │ │ │ ├── ChangeProfilePicture.js │ │ │ │ └── UpdatePassword.js │ │ │ ├── Cart │ │ │ │ ├── index.jsx │ │ │ │ ├── RenderTotalAmount.jsx │ │ │ │ └── RenderCartCourses.jsx │ │ │ ├── MyCourses.jsx │ │ │ ├── SidebarLink.js │ │ │ ├── Add Course │ │ │ │ ├── index.js │ │ │ │ ├── CourseInformation │ │ │ │ │ ├── RequirementField.js │ │ │ │ │ └── ChipInput.js │ │ │ │ ├── RenderSteps.js │ │ │ │ ├── PublishCourse │ │ │ │ │ └── index.js │ │ │ │ └── Upload.js │ │ │ ├── EditCourse │ │ │ │ └── index.js │ │ │ ├── Sidebar.js │ │ │ ├── InstructorDashboard │ │ │ │ └── InstructorChart.jsx │ │ │ └── EnrolledCourses.js │ │ ├── Catalog │ │ │ ├── CourseSlider.jsx │ │ │ └── Course_Card.jsx │ │ ├── ViewCourse │ │ │ └── CourseReviewModal.js │ │ └── Course │ │ │ └── CourseDetailsCard.js │ ├── ContactPage │ │ └── ContactForm.css │ └── common │ │ ├── loader.css │ │ ├── IconBtn.jsx │ │ ├── Tab.jsx │ │ ├── ConfirmationModal.js │ │ ├── RatingStars.jsx │ │ └── ReviewSlider.js ├── services │ ├── apiconnector.js │ ├── formatDate.js │ ├── operations │ │ ├── pageAndComponentData.js │ │ ├── profileAPI.js │ │ └── SettingsAPI.js │ └── apis.js ├── reducer │ └── index.js ├── slices │ ├── profileSlice.js │ ├── authSlice.js │ ├── courseSlice.js │ ├── viewCourseSlice.js │ └── cartSlice.js ├── index.js ├── hooks │ └── useOnClickOutside.js └── App.css ├── public ├── robots.txt ├── favicon.ico ├── manifest.json └── index.html ├── .gitignore ├── package.json └── tailwind.config.js /Server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/Images/Photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/Photo.jpg -------------------------------------------------------------------------------- /src/assets/Images/frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/frame.png -------------------------------------------------------------------------------- /src/assets/Images/banner.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/banner.mp4 -------------------------------------------------------------------------------- /src/assets/Images/login.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/login.webp -------------------------------------------------------------------------------- /src/assets/Images/signup.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/signup.webp -------------------------------------------------------------------------------- /src/assets/Logo/rzp_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Logo/rzp_logo.png -------------------------------------------------------------------------------- /src/assets/Images/Instructor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/Instructor.png -------------------------------------------------------------------------------- /src/assets/Images/aboutus1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/aboutus1.webp -------------------------------------------------------------------------------- /src/assets/Images/aboutus2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/aboutus2.webp -------------------------------------------------------------------------------- /src/assets/Images/aboutus3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/aboutus3.webp -------------------------------------------------------------------------------- /src/assets/Images/boxoffice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/boxoffice.png -------------------------------------------------------------------------------- /src/assets/Images/FoundingStory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/FoundingStory.png -------------------------------------------------------------------------------- /src/assets/Images/TimelineImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/TimelineImage.png -------------------------------------------------------------------------------- /src/assets/Logo/Logo-Full-Dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Logo/Logo-Full-Dark.png -------------------------------------------------------------------------------- /src/assets/Logo/Logo-Full-Light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Logo/Logo-Full-Light.png -------------------------------------------------------------------------------- /src/assets/Logo/Logo-Small-Dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Logo/Logo-Small-Dark.png -------------------------------------------------------------------------------- /src/assets/Logo/Logo-Small-Light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Logo/Logo-Small-Light.png -------------------------------------------------------------------------------- /src/assets/Images/Know_your_progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/Know_your_progress.png -------------------------------------------------------------------------------- /src/assets/Images/Plan_your_lessons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/Plan_your_lessons.png -------------------------------------------------------------------------------- /src/assets/Images/Compare_with_others.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yashsarode45/StudyNotion-Mega-Project/HEAD/src/assets/Images/Compare_with_others.png -------------------------------------------------------------------------------- /Server/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [{"src": "./index.js", "use": 4 | "@vercel/node" }], 5 | "routes": [{ "src": "/(.*)", "dest": "/" }] 6 | 7 | } -------------------------------------------------------------------------------- /Server/config/razorpay.js: -------------------------------------------------------------------------------- 1 | const Razorpay = require ('razorpay') 2 | 3 | exports.instance = new Razorpay({ 4 | key_id: process.env.RAZORPAY_KEY, 5 | key_secret: process.env.RAZORPAY_SECRET, 6 | }) -------------------------------------------------------------------------------- /src/utils/dateFormatter.js: -------------------------------------------------------------------------------- 1 | export const formattedDate = (date) => { 2 | return new Date(date).toLocaleDateString("en-US", { 3 | month: "long", 4 | day: "numeric", 5 | year: "numeric", 6 | }) 7 | } -------------------------------------------------------------------------------- /src/utils/constants.js: -------------------------------------------------------------------------------- 1 | export const ACCOUNT_TYPE = { 2 | STUDENT: "Student", 3 | INSTRUCTOR: "Instructor", 4 | ADMIN: "Admin", 5 | } 6 | 7 | export const COURSE_STATUS = { 8 | DRAFT: "Draft", 9 | PUBLISHED: "Published", 10 | } -------------------------------------------------------------------------------- /src/pages/Error.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Error = () => { 4 | return ( 5 |
6 | Error - 404 Not found 7 |
8 | ) 9 | } 10 | 11 | export default Error 12 | -------------------------------------------------------------------------------- /src/data/navbar-links.js: -------------------------------------------------------------------------------- 1 | export const NavbarLinks = [ 2 | { 3 | title: "Home", 4 | path: "/", 5 | }, 6 | { 7 | title: "Catalog", 8 | // path: '/catalog', 9 | }, 10 | { 11 | title: "About Us", 12 | path: "/about", 13 | }, 14 | { 15 | title: "Contact Us", 16 | path: "/contact", 17 | }, 18 | ]; 19 | -------------------------------------------------------------------------------- /src/components/core/HomePage/HiglightText2.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const HiglightText2 = ({text}) => { 4 | return ( 5 | 7 | {" "} 8 | {text} 9 | 10 | 11 | ) 12 | } 13 | 14 | export default HiglightText2 -------------------------------------------------------------------------------- /src/components/core/HomePage/HighlightText3.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const HighlightText3 = ({text}) => { 4 | return ( 5 | 7 | {" "} 8 | {text} 9 | 10 | 11 | ) 12 | } 13 | 14 | export default HighlightText3 15 | -------------------------------------------------------------------------------- /src/components/core/HomePage/HighlightText.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const HighlightText = ({text}) => { 4 | return ( 5 | 7 | {" "} 8 | {text} 9 | 10 | 11 | ) 12 | } 13 | 14 | export default HighlightText 15 | -------------------------------------------------------------------------------- /src/components/core/HomePage/Border.css: -------------------------------------------------------------------------------- 1 | .code-border { 2 | background: linear-gradient(111.93deg,rgba(14,26,45,.24) -1.4%,rgba(17,30,50,.38) 104.96%); 3 | border: 2px solid; 4 | border-image-slice: 1; 5 | border-image-source: linear-gradient(to right bottom,#ffffff38,#ffffff00); 6 | } 7 | 8 | .homepage_bg { 9 | background: url("../../../assets/Images/bghome.svg"); 10 | } 11 | -------------------------------------------------------------------------------- /Server/models/Section.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const sectionSchema = new mongoose.Schema({ 4 | 5 | sectionName: { 6 | type:String, 7 | }, 8 | subSection: [ 9 | { 10 | type:mongoose.Schema.Types.ObjectId, 11 | ref:"SubSection", 12 | } 13 | ], 14 | 15 | 16 | }); 17 | 18 | module.exports = mongoose.model("Section", sectionSchema); -------------------------------------------------------------------------------- /Server/utils/imageUploader.js: -------------------------------------------------------------------------------- 1 | const cloudinary = require('cloudinary').v2; 2 | 3 | exports.uploadImageToCloudinary = async (file,folder,height,quality) =>{ 4 | const options = {folder}; 5 | if(height) options.height = height; 6 | if (quality) { 7 | options.quality=quality; 8 | } 9 | 10 | options.resource_type ="auto"; 11 | 12 | return await cloudinary.uploader.upload(file.tempFilePath, options) 13 | } -------------------------------------------------------------------------------- /src/services/apiconnector.js: -------------------------------------------------------------------------------- 1 | import axios from "axios" 2 | 3 | export const axiosInstance = axios.create({}); 4 | 5 | export const apiConnector = (method, url, bodyData, headers, params) => { 6 | return axiosInstance({ 7 | method:`${method}`, 8 | url:`${url}`, 9 | data: bodyData ? bodyData : null, 10 | headers: headers ? headers: null, 11 | params: params ? params : null, 12 | }); 13 | } -------------------------------------------------------------------------------- /Server/models/Category.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const categorySchema = new mongoose.Schema({ 4 | name:{ 5 | type:String, 6 | required: true, 7 | }, 8 | description: { 9 | type:String, 10 | }, 11 | course: [{ 12 | type:mongoose.Schema.Types.ObjectId, 13 | ref:"Course", 14 | }], 15 | }); 16 | 17 | module.exports = mongoose.model("Category", categorySchema); -------------------------------------------------------------------------------- /Server/models/SubSection.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const subSectionSchema = new mongoose.Schema({ 4 | title:{ 5 | type:String, 6 | }, 7 | timeDuration: { 8 | type: String, 9 | }, 10 | description: { 11 | type:String, 12 | }, 13 | videoUrl:{ 14 | type:String, 15 | }, 16 | 17 | 18 | }) 19 | 20 | module.exports = mongoose.model("SubSection", subSectionSchema); -------------------------------------------------------------------------------- /src/components/core/Auth/PrivateRoute.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { useSelector } from 'react-redux' 3 | import { Navigate } from 'react-router-dom'; 4 | 5 | const PrivateRoute = ({children}) => { 6 | 7 | const {token} = useSelector((state) => state.auth); 8 | 9 | if(token !== null) 10 | return children 11 | else 12 | return 13 | 14 | } 15 | 16 | export default PrivateRoute 17 | -------------------------------------------------------------------------------- /Server/config/cloudinary.js: -------------------------------------------------------------------------------- 1 | const cloudinary = require("cloudinary").v2; //! Cloudinary is being required 2 | 3 | exports.cloudinaryConnect = () => { 4 | try { 5 | cloudinary.config({ 6 | //! ######## Configuring the Cloudinary to Upload MEDIA ######## 7 | cloud_name: process.env.CLOUD_NAME, 8 | api_key: process.env.API_KEY, 9 | api_secret: process.env.API_SECRET, 10 | }); 11 | } catch (error) { 12 | console.log(error); 13 | } 14 | }; -------------------------------------------------------------------------------- /src/utils/avgRating.js: -------------------------------------------------------------------------------- 1 | export default function GetAvgRating(ratingArr) { 2 | if (ratingArr?.length === 0) return 0 3 | const totalReviewCount = ratingArr?.reduce((acc, curr) => { 4 | acc += curr.rating 5 | return acc 6 | }, 0) 7 | 8 | const multiplier = Math.pow(10, 1) 9 | const avgReviewCount = 10 | Math.round((totalReviewCount / ratingArr?.length) * multiplier) / multiplier 11 | 12 | return avgReviewCount 13 | } -------------------------------------------------------------------------------- /.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 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | .env 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | package-lock.json 26 | pnpm-lock.yaml -------------------------------------------------------------------------------- /src/pages/Login.jsx: -------------------------------------------------------------------------------- 1 | import loginImg from "../assets/Images/login.webp" 2 | import Template from "../components/core/Auth/Template" 3 | 4 | function Login() { 5 | return ( 6 |