You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* feat(quiz): add guest warning before start and bot protection
Guest warning: show login/signup/continue buttons for unauthenticated
users on quiz rules screen before starting.
Bot protection: multi-attempt verification via Redis - each question
can only be verified once per user per attempt. Keys use dynamic TTL
matching quiz time limit and are cleared on retake.
Additional fixes:
- Footer flash on quiz navigation (added loading.tsx, eliminated redirect)
- Renamed QaLoader to Loader for reuse across pages
- React compiler purity errors (crypto.getRandomValues in handlers)
- Start button disabled after retake (isStarting not reset)
* refactor(quiz): PR review feedback
- Extract shared resolveRequestIdentifier() helper to eliminate
duplicated auth/IP resolution logic in route.ts and actions/quiz.ts
- Return null instead of 'unknown' when identifier unresolvable,
skip verification tracking for unidentifiable users
- Cap Redis TTL with MAX_TTL (3600s) to prevent client-supplied
timeLimitSeconds from persisting keys indefinitely
- Add locale prefix to returnTo paths in guest warning links
- Replace nested Button inside Link with styled Link to fix
invalid HTML (interactive element nesting)
* fix(quiz): fall through to IP when auth cookie is expired/invalid
* feat(quiz): add quiz results dashboard and review page
- Add quiz history section to dashboard with last attempt per quiz
- Add review page showing incorrect questions with explanations
- Add collapsible cards with expand/collapse all toggle
- Add "Review Mistakes" button on quiz result screen
- Add category icons to quiz page and review page headers
- Add BookOpen icon to explanation block in QuizQuestion
- Update guest message to mention error review benefit
- Add i18n translations (en/uk/pl) for all new features
* fix(quiz): scroll to next button on answer reveal, scope review cache by userId
* fix(quiz): restore type imports and userId cache key after merge conflict
* fix: restore type imports, sync @swc/helpers, fix indentation after merge
* feat(quiz): add violations counter UI, fix disqualification threshold
- Add ViolationsCounter component with color escalation (green/yellow/red)
- Sticky top bar keeps counter visible on scroll (mobile/tablet)
- Add i18n counter keys for en/uk/pl with ICU plural forms
- Fix threshold bug: violations warning now triggers at 4+ (was 3+)
to match actual integrity score calculation (100 - violations * 10 < 70)
* fix(quiz): fix points mismatch between leaderboard and dashboard
Dashboard showed raw pointsEarned from last quiz_attempt, while
leaderboard summed improvement deltas from point_transactions.
Additionally, orphaned transactions from re-seeded quizzes inflated
leaderboard totals (12 rows, 83 ghost points cleaned up in DB).
- Dashboard query now joins point_transactions to show actual awarded
points per quiz instead of raw attempt score
- Leaderboard query filters out orphaned transactions where the
source attempt no longer exists in quiz_attempts
* OBfix(quiz): fix points mismatch, consistent status badges, mobile UX
Dashboard showed raw pointsEarned from last attempt while leaderboard
summed improvement deltas from point_transactions. Orphaned transactions
from re-seeded quizzes inflated leaderboard totals (cleaned up in DB).
- Dashboard query joins point_transactions for actual awarded points
- Leaderboard query filters orphaned transactions (source_id not in quiz_attempts)
- Quiz cards use 3-level badges (Mastered/Review/Study) matching dashboard
- Mobile quiz results show dash for zero points, added chevron indicator
* fix(quiz): add breadcrumbs to review page, fix recommendation tautology
0 commit comments