Современная платформа для онлайн-курсов с авторизацией, подписками YouTube и полной системой профилей.
Intensive PRO — это полнофункциональная веб-платформа для создания и управления онлайн-курсами. Поддерживает авторизацию через Supabase, интеграцию с YouTube-подписками, систему профилей с прогрессом обучения, лидерборды и многоязычность (RU/EN/KK).
- Курсы и обучение: Детальные страницы курсов, прогресс обучения, списки участников
- Авторизация: Защищенные роуты, профили пользователей, загрузка аватаров
- YouTube интеграция: Проверка подписок, автоматическое обновление статуса
- Подписки: Платные планы, статус подписки, управление доступом
- Лидерборд: Рейтинг пользователей с фильтрами
- Многоязычность: i18n с поддержкой русского, английского и казахского
- Адаптивный дизайн: Mobile-first с Tailwind CSS
Frontend: React + TypeScript + Vite + Tailwind CSS
Backend: Supabase (Auth, Database, RLS)
YouTube API: OAuth 2.0 + Subscription checks
State: Zustand
i18n: react-i18next
src/
├── components/ # UI-компоненты (Header, Footer, CourseCard, Profile...)
├── hooks/ # Custom hooks (useAuth, useCourseProgress, useYoutubeSubscription...)
├── lib/api/ # API-сервисы (courses, subscriptions, youtube)
├── pages/ # Страницы (HomePage, CourseDetailPage, ProfilePage...)
└── migrations/ # Supabase миграции
# Клонировать репозиторий
git clone <your-repo-url>
cd intensive-pro
# Установить зависимости
npm install
# Настроить .env (Supabase URL, YouTube Client ID)
cp .env.example .env
# Запустить разработку
npm run devMIT License
Разработано для современных онлайн-школ и коучинговых платформ.
Добавьте в избранные ⭐, если проект полезен!
├── public/
│ └── _redirects
├── src/
│ ├── components/
│ │ ├── about/
│ │ │ └── StatisticsSection.tsx
│ │ ├── auth/
│ │ │ ├── index.ts
│ │ │ └── ProtectedRoute.tsx
│ │ ├── course/
│ │ │ ├── CourseCurriculum.tsx
│ │ │ ├── CourseHeader.tsx
│ │ │ └── ParticipantsSidebar.tsx
│ │ ├── Footer/
│ │ │ ├── ContactForm.tsx
│ │ │ ├── Footer.tsx
│ │ │ └── SocialLinks.tsx
│ │ ├── Header/
│ │ │ ├── Header.tsx
│ │ │ ├── Logo.tsx
│ │ │ ├── NavLinks.tsx
│ │ │ └── UserMenu.tsx
│ │ ├── layout/
│ │ │ ├── Footer/
│ │ │ │ ├── ContactForm.tsx
│ │ │ │ ├── Footer.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── SocialLinks.tsx
│ │ │ ├── Header/
│ │ │ │ ├── Header.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── LanguageSwitcher.tsx
│ │ │ │ ├── Logo.tsx
│ │ │ │ ├── NavLinks.tsx
│ │ │ │ └── UserMenu.tsx
│ │ │ ├── MobileMenu/
│ │ │ │ ├── index.ts
│ │ │ │ └── MobileMenu.tsx
│ │ │ ├── index.ts
│ │ │ └── Layout.tsx
│ │ ├── leaderboard/
│ │ │ ├── LeaderboardFilters.tsx
│ │ │ ├── LeaderboardHeader.tsx
│ │ │ └── LeaderboardList.tsx
│ │ ├── profile/
│ │ │ ├── Achievements.tsx
│ │ │ ├── AvatarUpload.tsx
│ │ │ ├── Certificates.tsx
│ │ │ ├── CourseProgress.tsx
│ │ │ ├── CourseProgressList.tsx
│ │ │ ├── ProfileHeader.tsx
│ │ │ ├── ProfileStats.tsx
│ │ │ └── ProgressStats.tsx
│ │ ├── subscription/
│ │ │ ├── PlanCard.tsx
│ │ │ ├── SubscriptionBanner.tsx
│ │ │ ├── SubscriptionStatus.tsx
│ │ │ ├── YoutubeAuthCallback.tsx
│ │ │ ├── YoutubeChecker.tsx
│ │ │ └── YoutubeSubscriptionUpdate.tsx
│ │ ├── ui/
│ │ │ ├── Avatar.tsx
│ │ │ ├── Button.tsx
│ │ │ ├── CourseImage.tsx
│ │ │ └── LoadingSpinner.tsx
│ │ ├── ContactSection.tsx
│ │ ├── CourseCard.tsx
│ │ ├── CourseParticipants.tsx
│ │ ├── Header.tsx
│ │ ├── Hero.tsx
│ │ ├── MobileMenu.tsx
│ │ ├── ParticipantsList.tsx
│ │ ├── ProgrammingTest.tsx
│ │ ├── SearchBar.tsx
│ │ └── TopUsers.tsx
│ ├── data/
│ │ ├── courses.ts
│ │ └── subscriptionPlans.ts
│ ├── hooks/
│ │ ├── useAuth.ts
│ │ ├── useAvatarUpload.ts
│ │ ├── useCourseDetails.ts
│ │ ├── useCourseParticipants.ts
│ │ ├── useCourseProgress.ts
│ │ ├── useCourses.ts
│ │ ├── useEnrollment.ts
│ │ ├── useInitialLoad.ts
│ │ ├── usePopularCourses.ts
│ │ ├── useSubscription.ts
│ │ ├── useSupabase.ts
│ │ ├── useSupabaseAuth.ts
│ │ ├── useSupabaseQuery.ts
│ │ ├── useTopCourses.ts
│ │ ├── useUserCourses.ts
│ │ ├── useUserProfile.ts
│ │ ├── useUserProgress.ts
│ │ ├── useYoutubeAuth.ts
│ │ ├── useYoutubeSubscription.ts
│ │ └── useYoutubeSubscriptionUpdate.ts
│ ├── i18n/
│ │ ├── locales/
│ │ │ ├── en.ts
│ │ │ ├── kk.ts
│ │ │ └── ru.ts
│ │ └── index.ts
│ ├── lib/
│ │ ├── api/
│ │ │ ├── subscription/
│ │ │ │ ├── service.ts
│ │ │ │ └── types.ts
│ │ │ ├── youtube/
│ │ │ │ ├── auth.ts
│ │ │ │ ├── config.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── service.ts
│ │ │ │ └── subscriptions.ts
│ │ │ ├── courses.ts
│ │ │ ├── enrollments.ts
│ │ │ ├── index.ts
│ │ │ ├── participants.ts
│ │ │ ├── profiles.ts
│ │ │ ├── subscriptions.ts
│ │ │ └── youtube.ts
│ │ ├── auth/
│ │ │ ├── profile.ts
│ │ │ ├── session.ts
│ │ │ └── subscription.ts
│ │ ├── api.ts
│ │ └── supabase.ts
│ ├── migrations/
│ │ ├── 001_create_profiles.sql
│ │ ├── 001_create_subscriptions.sql
│ │ ├── 002_create_subscriptions.sql
│ │ ├── 002_subscription_functions.sql
│ │ ├── 003_subscription_functions.sql
│ │ ├── 004_profile_functions.sql
│ │ ├── 005_row_level_security.sql
│ │ ├── 006_fix_subscriptions.sql
│ │ ├── 007_subscription_functions.sql
│ │ ├── 008_fix_subscriptions.sql
│ │ ├── 009_fix_subscriptions.sql
│ │ └── 010_fix_subscription_rls.sql
│ ├── pages/
│ │ ├── AboutPage.tsx
│ │ ├── CourseDetailPage.tsx
│ │ ├── CourseLearnPage.tsx
│ │ ├── CoursesPage.tsx
│ │ ├── HomePage.tsx
│ │ ├── LeaderboardPage.tsx
│ │ ├── LoginPage.tsx
│ │ ├── ProfileEditPage.tsx
│ │ ├── ProfilePage.tsx
│ │ ├── PublicProfilePage.tsx
│ │ ├── RegisterPage.tsx
│ │ ├── ResetPasswordPage.tsx
│ │ └── SubscriptionPage.tsx
│ ├── store/
│ │ ├── authStore.ts
│ │ ├── loadingStore.ts
│ │ ├── progressStore.ts
│ │ └── subscriptionStore.ts
│ ├── types/
│ │ ├── auth.ts
│ │ ├── index.ts
│ │ ├── subscription.ts
│ │ └── supabase.ts
│ ├── utils/
│ │ ├── animations.ts
│ │ ├── error.ts
│ │ └── hooks.ts
│ ├── App.tsx
│ ├── index.css
│ ├── main.tsx
│ ├── routes.tsx
│ └── vite-env.d.ts
├── .env
├── .env.production
├── .gitignore
├── eslint.config.js
├── index.html
├── package-lock.json
├── package.json
├── postcss.config.js
├── tailwind.config.js
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts