- Add parse-api-error.js utility that handles all backend error formats:
{error:{details:{field:[msg]}}} → "Field: msg" per line
{error:{message:"field: text"}} → strips "field: " prefix
{message/detail: "text"} → direct fallback
- Apply parseApiError() on all 4 auth pages (sign-in, sign-up, forgot/reset password)
- Add whiteSpace: pre-line to Alert so multi-field errors render on separate lines
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Logo component now renders logo.svg (full) or favicon.png (icon) from /logo/
- nav-vertical: mini mode passes mini prop → favicon.png
- animate-logo (splash screen): uses favicon.png icon with animation ring
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Role-based nav: hide payment/referrals for students, board/progress-children for parents
- Add "Мои группы" to student nav; groups detail page read-only for non-mentors
- Logout button in sidebar nav (signOut + redirect to login)
- Parent: auto-select first child, ChildSelector in nav above profile
- Children fetched from /parent/dashboard/ (not the broken /users/parents/children/)
- Add child by 8-char universal code with role validation (client only)
- Removed "Прогресс" button from child cards in children-view
- Fix redirect on child switch — stay on current page (no router.push)
- Parent child notification settings in profile (per-child + per-type toggles)
- Fix scroll on all pages: Main overflow auto, hasSidebar Box overflow auto
- Fix 403: isMentor guard before getStudents() calls in groups pages
- Fix timezone: FullCalendar timeZone prop + fTime() use user.timezone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- remove greeting header (mentor & client dashboards)
- remove CourseMyAccount user info block from right panel (mentor)
- lessons_this_week: compute client-side from upcoming_lessons filtered
to remaining lessons in current Mon–Sun range (was using backend value)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Show real avatar, full name, email from useAuthContext
- Fetch GET /subscriptions/subscriptions/active/ on mount
- Display subscription plan name (label: success=active, warning=trial, default=none)
- Show end date + days left text
- LinearProgress bar showing days remaining (red <20%, yellow <50%, green otherwise)
- Trial subscription displayed as 'Пробный: <plan>'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- vite.config.js: allowedHosts: true (accept all hosts behind nginx proxy)
- Dockerfile: switch from next to vite entrypoint, VITE_* build args
- docker-compose: VITE_* build args replacing NEXT_PUBLIC_* for front_minimal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- package.json: replace next scripts with vite dev/build/preview,
add react-router-dom + vite/plugin-react/svgr devDeps, remove next + @mui/material-nextjs
- vite.config.js: add NEXT_PUBLIC_* → process.env define map for backward compat,
add rollup manual chunks (mui, fullcalendar), loadEnv support
- front_minimal/.env: add VITE_* prefix vars alongside legacy NEXT_PUBLIC_*
- routes/sections.jsx: replace 691-line template routes with 160-line platform-only router
- routes/paths.js: trim to platform paths only (no mock IDs, no template pages)
- app.jsx: remove CheckoutProvider (not needed)
- theme-provider.jsx: remove AppRouterCacheProvider from @mui/material-nextjs
- routes/hooks: replace next/navigation re-exports with react-router-dom wrappers
(useRouter → useNavigate adapter, useSearchParams, usePathname, useParams)
- routes/components/router-link.jsx: Link from react-router-dom
- sections: replace all next/navigation imports with react-router-dom
- analytics-view, my-progress-view: replace next/dynamic with direct import (no SSR)
- Remove all 'use client' directives (231 files) — not needed in Vite SPA
- Build: vite build ✓ in ~8s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Board: replace blank iframe with board list (my_boards + shared_with_me),
mentor gets per-student buttons to open/create boards,
iframe fills full available height via CSS vars (dvh)
- Excalidraw: build with NEXT_PUBLIC_BASE_PATH=/devboard so _next/ assets
served under /devboard/_next/ and nginx path proxy works correctly
- Nginx: preserve /devboard/ path in proxy_pass (no trailing slash),
add /yjs WebSocket proxy to devapi.uchill.online for dev YJS on port 1235
- Analytics: real API charts (income/lessons/students) with DateRangePicker
- Feedback: mentor kanban view of completed lessons, grade + notes drawer
- Nav: dynamic role-based menu (getNavData(role)), mentor-only analytics/feedback
- New API utils: analytics-api.js, board-api.js (full), dashboard-api getLessons()
- Routes: paths.dashboard.analytics, feedback, board added
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Homework: kanban view with columns (pending/submitted/returned/reviewed/fill_later/ai_draft), details drawer with submission list for mentor, submit drawer for client, edit draft drawer; full AI-grade support
- Materials: grid view with image preview, upload and delete dialogs
- Students: mentor view with student list + pending requests + invite by email/code; client view with mentors list + incoming invitations + send request by mentor code
- Notifications: full page + NotificationsDrawer in header connected to real API (mark read, delete, mark all)
- New API utils: homework-api.js, materials-api.js, students-api.js, notifications-api.js
- Added routes: /dashboard/homework, /dashboard/materials, /dashboard/students, /dashboard/notifications
- Updated navigation config with new items
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>