From 8de8b88a3d88a1b10619cb712522db05152a6e15 Mon Sep 17 00:00:00 2001 From: renolation Date: Sun, 12 Apr 2026 22:59:46 +0700 Subject: [PATCH] leader board + setting --- .idea/.gitignore | 10 + .idea/english.iml | 8 + .idea/material_theme_project_new.xml | 10 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + Claude.md | 159 +++++++- src/components/MobileNav.tsx | 3 +- src/components/Sidebar.tsx | 2 + src/pages/Dashboard.tsx | 68 ++++ src/pages/Settings.tsx | 49 +++ src/pages/dashboard/LeaderboardCard.tsx | 103 ++++++ src/pages/dashboard/StatsRow.tsx | 49 +++ src/pages/dashboard/WeeklySection.tsx | 70 ++++ src/pages/dashboard/XpProgressCard.tsx | 53 +++ src/pages/dashboard/XuEconomyCard.tsx | 46 +++ src/pages/dashboard/gamification-store.ts | 64 ++++ src/pages/settings/AccountCard.tsx | 116 ++++++ src/pages/settings/DailyGoalCard.tsx | 56 +++ src/pages/settings/ExamDateCard.tsx | 86 +++++ src/pages/settings/NotificationsCard.tsx | 101 ++++++ src/pages/settings/ProfileCard.tsx | 126 +++++++ src/pages/settings/XuWalletCard.tsx | 47 +++ src/routes/dashboard.tsx | 6 + src/routes/settings.tsx | 6 + src/types/index.ts | 42 +++ stitch-exports/dashboard/DESIGN.md | 68 ++++ stitch-exports/dashboard/design.html | 419 ++++++++++++++++++++++ stitch-exports/dashboard/design.png | Bin 0 -> 72000 bytes stitch-exports/preferences/DESIGN.md | 71 ++++ stitch-exports/preferences/design.html | 346 ++++++++++++++++++ stitch-exports/preferences/design.png | Bin 0 -> 55791 bytes supabase/migrations/002_gamification.sql | 119 ++++++ 32 files changed, 2302 insertions(+), 15 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/english.iml create mode 100644 .idea/material_theme_project_new.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Settings.tsx create mode 100644 src/pages/dashboard/LeaderboardCard.tsx create mode 100644 src/pages/dashboard/StatsRow.tsx create mode 100644 src/pages/dashboard/WeeklySection.tsx create mode 100644 src/pages/dashboard/XpProgressCard.tsx create mode 100644 src/pages/dashboard/XuEconomyCard.tsx create mode 100644 src/pages/dashboard/gamification-store.ts create mode 100644 src/pages/settings/AccountCard.tsx create mode 100644 src/pages/settings/DailyGoalCard.tsx create mode 100644 src/pages/settings/ExamDateCard.tsx create mode 100644 src/pages/settings/NotificationsCard.tsx create mode 100644 src/pages/settings/ProfileCard.tsx create mode 100644 src/pages/settings/XuWalletCard.tsx create mode 100644 src/routes/dashboard.tsx create mode 100644 src/routes/settings.tsx create mode 100644 stitch-exports/dashboard/DESIGN.md create mode 100644 stitch-exports/dashboard/design.html create mode 100644 stitch-exports/dashboard/design.png create mode 100644 stitch-exports/preferences/DESIGN.md create mode 100644 stitch-exports/preferences/design.html create mode 100644 stitch-exports/preferences/design.png create mode 100644 supabase/migrations/002_gamification.sql diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/english.iml b/.idea/english.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/english.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..766912b --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..33f2143 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Claude.md b/Claude.md index 1198153..3d689b9 100644 --- a/Claude.md +++ b/Claude.md @@ -2,7 +2,7 @@ > File này cung cấp context đầy đủ cho Claude khi làm việc với dự án. > Cập nhật file này mỗi khi có quyết định kiến trúc mới. -> **Last updated**: Merged all decisions — Phase 1 scaffold done, Phase 2–4 planned +> **Last updated**: Phase 2 done — thêm Phase 3 Retention & Monetization, đẩy Speaking AI và Full TOEIC sang Phase 4 & 5 --- @@ -12,7 +12,7 @@ **Target users**: Sinh viên, người đi làm tại Việt Nam cần TOEIC, IELTS, hoặc học tiếng Anh tổng quát **Focus chính**: TOEIC (mở rộng market), sau đó IELTS **Giai đoạn hiện tại**: Phase 1 — MVP, validate market -**Roadmap**: 4 phases — MVP → Auth & Progress → Speaking AI → Full TOEIC +**Roadmap**: 5 phases — MVP → Auth & Progress → Retention & Monetization → Speaking AI → Full TOEIC --- @@ -349,11 +349,136 @@ Evaluate the writing and return ONLY valid JSON: --- -### PHASE 3 — Speaking AI +### PHASE 3 — Xu System & Gamification ← Tiếp theo + +**Mục tiêu**: Tạo thói quen học hàng ngày, giữ chân user bằng Xu economy + gamification +**Platform**: Web only (không Flutter ở phase này) +**Trigger**: Phase 2 có user đăng ký, cần convert sang returning users + +--- + +#### Xu Economy — Trung tâm của Phase 3 + +``` +Học hàng ngày / xem ads → kiếm Xu + ↓ + Xu → dùng tính năng premium + ↓ + Hết Xu → xem ads thêm + (nạp tiền thật → Phase 4) +``` + +**Kiếm Xu (miễn phí)**: +| Hành động | Xu nhận | +|---|---| +| Đăng ký lần đầu (welcome bonus) | 50 Xu | +| Hoàn thành daily goal | 10 Xu | +| Streak milestone (7 / 30 / 100 ngày) | 20 / 50 / 100 Xu | +| Xem rewarded ads trên web | 5 Xu / video (tối đa 5 video/ngày) | + +**Dùng Xu**: +| Tính năng | Chi phí | +|---|---| +| Streak freeze (bảo vệ 1 ngày) | 20 Xu | +| Thêm 5 lượt AI Writing (GLM-4.7) | 30 Xu | +| 1 lượt AI Writing cao cấp (GPT-4o) | 15 Xu | +| Mở thêm bài thi khi hết giới hạn free | 10 Xu | + +> ⚠️ Chưa có nạp Xu bằng tiền thật ở Phase 3 — chỉ kiếm qua học + ads. +> Nạp tiền thật (VNPay/MoMo) → Phase 4. + +--- + +#### AI Model Tier +| Tier | Model | Free limit | Dùng Xu | +|---|---|---|---| +| Free | GLM-4 base | 3 lần/ngày | — | +| Standard | GLM-4.7 | — | 30 Xu / 5 lượt | +| Premium | GPT-4o / Claude | — | 15 Xu / lượt | + +--- + +#### Gamification +- **Streak hàng ngày**: học ít nhất 1 bài/ngày giữ chuỗi +- **XP points**: mỗi bài thi / flashcard / writing check → XP +- **Cấp độ**: Beginner → Bronze → Silver → Gold → Master (theo XP tích luỹ) +- **Streak freeze**: dùng Xu bảo vệ streak khi bận — hook mạnh nhất +- **Weekly goal**: đặt mục tiêu tuần, hoàn thành → badge + thưởng Xu + +#### Leaderboard +- Bảng xếp hạng tuần theo XP (reset mỗi tuần, không tích luỹ) +- Hiện top 10 + vị trí của bản thân +- Chia sẻ kết quả lên Facebook/Zalo — viral loop tự nhiên + +#### Nhắc nhở +- Browser push notification (web, không cần app) +- Giờ nhắc do user tự chọn +- Message cá nhân hoá: *"Streak 7 ngày của bạn sắp mất!"* + +#### Lộ trình AI cá nhân hoá +- Phân tích kết quả thi → suggest *"Tuần này tập trung Part 5 và 6"* +- Dashboard: *"Bạn yếu nhất ở Part 5 — luyện ngay"* +- Đặt ngày thi TOEIC → đếm ngược + lịch ôn gợi ý + +#### Web Ads +- Google AdSense: banner dưới trang + interstitial sau kết quả bài thi +- Rewarded video ads: xem để nhận Xu +- Không ads trong lúc đang làm bài +- User có đủ Xu / premium → không hiện ads (Phase 4) + +--- + +#### DB Schema bổ sung +```sql +CREATE TABLE user_gamification ( + user_id UUID REFERENCES users(id) PRIMARY KEY, + xp INT DEFAULT 0, + level TEXT DEFAULT 'beginner', -- beginner | bronze | silver | gold | master + streak INT DEFAULT 0, + longest_streak INT DEFAULT 0, + last_active DATE, + xu INT DEFAULT 50, -- welcome bonus + freeze_count INT DEFAULT 0 +); + +CREATE TABLE xu_transactions ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES users(id), + type TEXT, -- earn_welcome | earn_daily | earn_streak | earn_ads | spend_freeze | spend_writing | spend_test + amount INT, -- dương = nhận, âm = tiêu + balance INT, -- số Xu sau giao dịch (để audit) + description TEXT, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE weekly_leaderboard ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES users(id), + week_start DATE, + xp_earned INT DEFAULT 0, + rank INT +); +``` + +**Tech mới**: +- Google AdSense (banner + rewarded video) +- Browser Push Notification API +- Cron job: reset leaderboard mỗi tuần, check streak hàng ngày + +**Không có ở Phase 3**: +- ❌ Nạp tiền thật (VNPay / MoMo) → Phase 4 +- ❌ Flutter / mobile app → Phase 4 +- ❌ Subscription / Premium plan → Phase 4 + +**Timeline**: 5–6 tuần + +--- + +### PHASE 4 — Speaking AI **Mục tiêu**: Tăng differentiation, cover kỹ năng Speaking cho IELTS/TOEIC -**Trigger**: Phase 2 ổn định, user quay lại đều đặn +**Trigger**: Phase 3 ổn định, có doanh thu đều **Tính năng**: - AI Speaking Coach: record giọng → AI chấm phát âm + so sánh native speaker @@ -364,15 +489,15 @@ Evaluate the writing and return ONLY valid JSON: **Tech mới**: - Speech-to-text: Whisper API hoặc Google Speech-to-Text - Text-to-speech: native audio -- WebRTC / MediaRecorder API (web) +- WebRTC / MediaRecorder API (web) + Flutter audio recording --- -### PHASE 4 — Full TOEIC Mock Test +### PHASE 5 — Full TOEIC Mock Test **Mục tiêu**: Platform luyện TOEIC toàn diện chuẩn ETS -**Trigger**: Phase 3 xong, cần nội dung premium +**Trigger**: Phase 4 xong, cần nội dung premium cao cấp hơn **Tính năng**: - Full TOEIC test chuẩn ETS: 200 câu, 120 phút @@ -389,20 +514,23 @@ Evaluate the writing and return ONLY valid JSON: | Quyết định | Lý do | |---|---| | Không auth Phase 1 | Giảm scope, validate market trước | -| Email only Phase 2, không OAuth | Đơn giản nhất để build, OAuth Phase 3+ | +| Email only Phase 2, không OAuth | Đơn giản nhất để build, OAuth Phase 4+ | | Không xác thực email Phase 2 | MVP — giảm friction đăng ký tối đa | | Chỉ 3 field đăng ký (tên/email/pass) | Friction thấp nhất, đủ để identify user | | Guest chỉ xem preview, không làm được | Buộc đăng ký để dùng, giúp thu thập user data | | Không thanh toán Phase 2 | Hiểu behavior trước khi charge tiền | -| Không Flutter Phase 2 | Web đã responsive, mobile app khi có traction rõ ràng | +| Không Flutter Phase 2 | Web đã responsive, Flutter Phase 3 khi có traction | +| Coins tên "Xu" | Gần gũi user VN hơn "Credits" hay "Points" | +| Pay-as-you-go thay subscription | User VN ít cam kết dài hạn, mua theo nhu cầu dễ convert hơn | +| AI model tier theo Xu | Tạo upsell tự nhiên — user thấy feedback tốt hơn khi dùng model cao hơn | +| Rewarded ads mobile, banner ads web | Phù hợp từng platform — mobile chịu video, web chịu banner | | Supabase tạm Phase 1 | Ra nhanh hơn 2–3 tuần, schema chuẩn để migrate sau | | GLM thay OpenAI/Claude | Rẻ hơn, OpenAI-compatible, swap dễ | -| Desktop-first (không mobile-first) | Target TOEIC learner hay dùng máy tính | +| Desktop-first | Target TOEIC learner hay dùng máy tính | | TanStack Query + Zustand | Server state tách biệt client state rõ ràng | -| localStorage Phase 1 | Đủ cho MVP, không cần backend phức tạp | | NestJS Phase 2 | Supabase đủ để validate, NestJS khi scale | -| Speaking AI Phase 3 | Cần infra ổn định trước khi làm realtime audio | -| Full mock test Phase 4 | Cần content team + audio, không phải tech problem | +| Speaking AI Phase 4 | Cần infra + monetization ổn định trước khi làm realtime audio | +| Full mock test Phase 5 | Cần content team + audio, không phải tech problem | --- @@ -414,6 +542,7 @@ Evaluate the writing and return ONLY valid JSON: - **Desktop-first**: Design và test trên 1280px trước, mobile sau - **YAGNI / KISS**: Không build thứ chưa cần, từng Phase giải quyết từng vấn đề - **Schema chuẩn ngay từ đầu**: Dù dùng Supabase, PostgreSQL schema phải production-ready +- **Coins = "Xu"**: Dùng nhất quán trong code lẫn UI --- @@ -427,4 +556,6 @@ Evaluate the writing and return ONLY valid JSON: | User mất progress (localStorage Phase 1) | 🟡 TB | Chấp nhận Phase 1, auth Phase 2 giải quyết | | Bản quyền đề TOEIC crawl | 🟡 TB | Seed nhanh, thay bằng nội dung tự soạn dần | | Supabase free tier limit | 🟢 Thấp | 500MB đủ Phase 1, migrate trước khi hit limit | -| Audio quality Phase 4 | 🟡 TB | Budget cho studio recording hoặc TTS premium | \ No newline at end of file +| AdSense bị block (adblocker) | 🟡 TB | Rewarded ads mobile bù lại, không phụ thuộc 1 nguồn | +| VNPay/MoMo integration phức tạp | 🟡 TB | Dùng payment gateway trung gian (Stripe VN, PayOS) | +| Audio quality Phase 5 | 🟡 TB | Budget cho studio recording hoặc TTS premium | \ No newline at end of file diff --git a/src/components/MobileNav.tsx b/src/components/MobileNav.tsx index d9d1d2f..0896c05 100644 --- a/src/components/MobileNav.tsx +++ b/src/components/MobileNav.tsx @@ -3,9 +3,10 @@ import { cn } from '@/lib/utils' const NAV_ITEMS = [ { to: '/', label: 'Home', icon: 'home', matchPrefix: '/', exact: true }, + { to: '/dashboard', label: 'Thành tích', icon: 'emoji_events', matchPrefix: '/dashboard', exact: false }, { to: '/toeic', label: 'Luyện đề', icon: 'assignment', matchPrefix: '/toeic', exact: false }, { to: '/writing', label: 'Writing', icon: 'edit_note', matchPrefix: '/writing', exact: false }, - { to: '/vocab', label: 'Từ vựng', icon: 'menu_book', matchPrefix: '/vocab', exact: false }, + { to: '/settings', label: 'Cài đặt', icon: 'settings', matchPrefix: '/settings', exact: false }, ] function isActive(pathname: string, prefix: string, exact: boolean) { diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 19fab5e..c2e83a5 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -5,9 +5,11 @@ import { useAuthModalStore } from '@/store/auth-modal-store' const NAV_ITEMS = [ { to: '/', label: 'Trang chủ', icon: 'home', matchPrefix: '/', exact: true }, + { to: '/dashboard', label: 'Thành tích', icon: 'emoji_events', matchPrefix: '/dashboard', exact: false }, { to: '/toeic', label: 'Luyện đề TOEIC', icon: 'assignment', matchPrefix: '/toeic', exact: false }, { to: '/writing', label: 'AI Writing', icon: 'edit_note', matchPrefix: '/writing', exact: false }, { to: '/vocab', label: 'Từ vựng', icon: 'menu_book', matchPrefix: '/vocab', exact: false }, + { to: '/settings', label: 'Cài đặt', icon: 'settings', matchPrefix: '/settings', exact: false }, ] function isActive(pathname: string, prefix: string, exact: boolean) { diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx new file mode 100644 index 0000000..485ba26 --- /dev/null +++ b/src/pages/Dashboard.tsx @@ -0,0 +1,68 @@ +import { Link } from '@tanstack/react-router' +import { useAuthStore } from '@/store/auth-store' +import { useAuthModalStore } from '@/store/auth-modal-store' +import { loadGamification } from './dashboard/gamification-store' +import { StatsRow } from './dashboard/StatsRow' +import { XpProgressCard } from './dashboard/XpProgressCard' +import { WeeklySection } from './dashboard/WeeklySection' +import { XuEconomyCard } from './dashboard/XuEconomyCard' +import { LeaderboardCard } from './dashboard/LeaderboardCard' + +export function Dashboard() { + const user = useAuthStore((s) => s.user) + const openModal = useAuthModalStore((s) => s.open) + + if (!user) { + return ( +
+ emoji_events +

Bảng thành tích

+

+ Đăng nhập để xem streak, XP, Xu và bảng xếp hạng của bạn. +

+ +
+ ) + } + + const state = loadGamification() + + return ( +
+ {/* Page header */} +
+

Bảng thành tích

+

Xin chào, {user.name} — tiếp tục chuỗi học tập nhé!

+
+ + {/* Hero stats */} + + + {/* Progress section */} +
+ + +
+ + {/* Xu economy + leaderboard */} +
+ + +
+ + {/* FAB */} + + play_arrow + +
+ ) +} diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx new file mode 100644 index 0000000..4efc8ad --- /dev/null +++ b/src/pages/Settings.tsx @@ -0,0 +1,49 @@ +import { useAuthStore } from '@/store/auth-store' +import { useAuthModalStore } from '@/store/auth-modal-store' +import { ProfileCard } from './settings/ProfileCard' +import { XuWalletCard } from './settings/XuWalletCard' +import { DailyGoalCard } from './settings/DailyGoalCard' +import { ExamDateCard } from './settings/ExamDateCard' +import { NotificationsCard } from './settings/NotificationsCard' +import { AccountCard } from './settings/AccountCard' + +export function Settings() { + const user = useAuthStore((s) => s.user) + const openModal = useAuthModalStore((s) => s.open) + + if (!user) { + return ( +
+ settings +

Cài đặt

+

+ Đăng nhập để cá nhân hoá mục tiêu học tập, cài đặt thông báo và quản lý tài khoản. +

+ +
+ ) + } + + return ( +
+
+

Cài đặt

+

Quản lý hồ sơ, mục tiêu học tập và thông báo.

+
+ +
+ + + + + + +
+
+ ) +} diff --git a/src/pages/dashboard/LeaderboardCard.tsx b/src/pages/dashboard/LeaderboardCard.tsx new file mode 100644 index 0000000..b308bb7 --- /dev/null +++ b/src/pages/dashboard/LeaderboardCard.tsx @@ -0,0 +1,103 @@ +import { cn } from '@/lib/utils' +import { useAuthStore } from '@/store/auth-store' + +// Phase 3: mock data until leaderboard DB table is live +const MOCK_LEADERS = [ + { rank: 1, name: 'Minh Anh', xp: 12450 }, + { rank: 2, name: 'Hoàng Nam', xp: 11200 }, + { rank: 3, name: 'Quỳnh Trang', xp: 10800 }, + { rank: 4, name: 'Đức Huy', xp: 9900 }, + { rank: 5, name: 'Phương Linh', xp: 9400 }, + { rank: 6, name: 'Trọng Khải', xp: 9100 }, +] + +const USER_RANK = { rank: 7, xp: 8950 } + +function RankBadge({ rank }: { rank: number }) { + const gold = rank === 1 + const silver = rank === 2 + const bronze = rank === 3 + return ( +
+ {rank} +
+ ) +} + +function initials(name: string) { + return name.split(' ').map((w) => w[0]).slice(-2).join('').toUpperCase() +} + +export function LeaderboardCard() { + const user = useAuthStore((s) => s.user) + const userName = user?.name ?? 'Bạn' + + const allRows = [ + ...MOCK_LEADERS, + { rank: USER_RANK.rank, name: userName, xp: USER_RANK.xp, isMe: true }, + ].sort((a, b) => a.rank - b.rank) + + return ( +
+
+

Bảng xếp hạng tuần

+
+ Top 100 + Bạn bè +
+
+ + + + + + + + + + + {allRows.map((row) => { + const isMe = 'isMe' in row && row.isMe + return ( + + + + + + ) + })} + +
HạngNgười họcXP Tổng
+ + +
+
+ {initials(row.name)} +
+ + {isMe ? `${row.name} (Bạn)` : row.name} + +
+
+ + {row.xp.toLocaleString('vi-VN')} XP + +
+
+ ) +} diff --git a/src/pages/dashboard/StatsRow.tsx b/src/pages/dashboard/StatsRow.tsx new file mode 100644 index 0000000..b29a8a3 --- /dev/null +++ b/src/pages/dashboard/StatsRow.tsx @@ -0,0 +1,49 @@ +import type { GamificationState } from './gamification-store' + +interface Props { state: GamificationState } + +export function StatsRow({ state }: Props) { + return ( +
+ {/* Xu Balance */} +
+
+ Số dư Xu +
+ {state.xu.toLocaleString('vi-VN')} + monetization_on +
+

Dùng để mở tính năng premium

+
+ + {/* Streak */} +
+
+
+ Chuỗi học tập +
+ {state.streak} Ngày + local_fire_department +
+

Bạn thuộc top 5% người học!

+
+
+ + {/* Level */} +
+
+ Cấp độ +
+ Level {state.level} +
+ + Hạng {state.levelName} + +
+
+ military_tech +
+
+
+ ) +} diff --git a/src/pages/dashboard/WeeklySection.tsx b/src/pages/dashboard/WeeklySection.tsx new file mode 100644 index 0000000..a395fce --- /dev/null +++ b/src/pages/dashboard/WeeklySection.tsx @@ -0,0 +1,70 @@ +import { cn } from '@/lib/utils' +import type { GamificationState } from './gamification-store' + +interface Props { state: GamificationState } + +const DAY_LABELS = ['Th 2', 'Th 3', 'Th 4', 'Th 5', 'Th 6', 'Th 7', 'CN'] + +function getTodayIdx() { + const d = new Date().getDay() // 0=Sun + return d === 0 ? 6 : d - 1 // Mon=0 … Sun=6 +} + +export function WeeklySection({ state }: Props) { + const todayIdx = getTodayIdx() + const progressPct = Math.round((state.weeklyCompleted / state.weeklyGoal) * 100) + + return ( +
+ {/* Weekly goal */} +
+
+
+

Mục tiêu tuần

+

Hoàn thành {state.weeklyGoal} bài học mỗi tuần

+
+ + {state.weeklyCompleted}/{state.weeklyGoal} + +
+
+
+
+
+ + {/* Weekly heatmap */} +
+

Lịch sử rèn luyện

+
+ {DAY_LABELS.map((label, i) => { + const isToday = i === todayIdx + const done = state.weekActivity[i] + const future = i > todayIdx + + return ( +
+ + {isToday ? 'H.Nay' : label} + + {isToday ? ( +
+ play_arrow +
+ ) : done ? ( +
+ check +
+ ) : ( +
+ )} +
+ ) + })} +
+
+
+ ) +} diff --git a/src/pages/dashboard/XpProgressCard.tsx b/src/pages/dashboard/XpProgressCard.tsx new file mode 100644 index 0000000..54c8992 --- /dev/null +++ b/src/pages/dashboard/XpProgressCard.tsx @@ -0,0 +1,53 @@ +import type { GamificationState } from './gamification-store' + +interface Props { state: GamificationState } + +function ProgressRing({ percent, xp, xpNext }: { percent: number; xp: number; xpNext: number }) { + const r = 72 + const circ = 2 * Math.PI * r + const offset = circ - (percent / 100) * circ + + return ( +
+ + + + +
+ {percent}% + + {xp.toLocaleString()} / {xpNext.toLocaleString()} XP + +
+
+ ) +} + +export function XpProgressCard({ state }: Props) { + const percent = Math.round((state.xp / state.xpNextLevel) * 100) + + return ( +
+

Tiến độ Cấp độ

+ + + +

+ Chỉ còn {(state.xpNextLevel - state.xp).toLocaleString()} XP nữa để đạt Level {state.level + 1}! +

+ + +
+ ) +} diff --git a/src/pages/dashboard/XuEconomyCard.tsx b/src/pages/dashboard/XuEconomyCard.tsx new file mode 100644 index 0000000..ff333b3 --- /dev/null +++ b/src/pages/dashboard/XuEconomyCard.tsx @@ -0,0 +1,46 @@ +const EARN_ITEMS = [ + { label: 'Mục tiêu ngày', reward: '+10 xu' }, + { label: 'Mốc chuỗi (Streak)', reward: '+20 xu' }, + { label: 'Xem quảng cáo', reward: '+5 xu' }, +] + +const SPEND_ITEMS = [ + { label: 'Streak Freeze', cost: '20 xu' }, + { label: 'AI Writing Feedback', cost: '30 xu' }, +] + +export function XuEconomyCard() { + return ( +
+

Cửa hàng Xu

+ +
+ {/* Earn */} +
+ Kiếm Xu +
+ {EARN_ITEMS.map((item) => ( +
+ {item.label} + {item.reward} +
+ ))} +
+
+ + {/* Spend */} +
+ Tiêu Xu +
+ {SPEND_ITEMS.map((item) => ( +
+ {item.label} + {item.cost} +
+ ))} +
+
+
+
+ ) +} diff --git a/src/pages/dashboard/gamification-store.ts b/src/pages/dashboard/gamification-store.ts new file mode 100644 index 0000000..56b3d06 --- /dev/null +++ b/src/pages/dashboard/gamification-store.ts @@ -0,0 +1,64 @@ +// Phase 3 bridge: gamification state from localStorage until DB is live + +export interface GamificationState { + xu: number + streak: number + xp: number + xpNextLevel: number + level: number + levelName: string + weeklyCompleted: number + weeklyGoal: number + weekActivity: boolean[] // Mon–Sun, true = completed +} + +const KEYS = { + xu: 'xu_balance', + streak: 'gamification_streak', + xp: 'gamification_xp', + level: 'gamification_level', + weeklyCompleted: 'gamification_weekly_completed', +} + +function getNum(key: string, fallback: number) { + const v = localStorage.getItem(key) + return v ? parseInt(v, 10) : fallback +} + +function getLevelName(level: number): string { + if (level >= 40) return 'Master' + if (level >= 20) return 'Gold' + if (level >= 10) return 'Silver' + if (level >= 5) return 'Bronze' + return 'Beginner' +} + +function getWeekActivity(): boolean[] { + // Days Mon–Sun — mark days up to (but not including) today as done if streak is active + const today = new Date().getDay() // 0=Sun, 1=Mon ... 6=Sat + const streak = getNum(KEYS.streak, 14) + // Convert to Mon=0 index + const todayIdx = today === 0 ? 6 : today - 1 + const activity = Array(7).fill(false) + for (let i = 0; i < Math.min(todayIdx, streak, 7); i++) { + activity[i] = true + } + return activity +} + +export function loadGamification(): GamificationState { + const level = getNum(KEYS.level, 14) + const xp = getNum(KEYS.xp, 1200) + + return { + xu: getNum(KEYS.xu, 50), + streak: getNum(KEYS.streak, 14), + xp, + xpNextLevel: 1600, // hardcoded for Phase 3 demo + level, + levelName: getLevelName(level), + weeklyCompleted: getNum(KEYS.weeklyCompleted, 3), + weeklyGoal: 5, + weekActivity: getWeekActivity(), + } +} diff --git a/src/pages/settings/AccountCard.tsx b/src/pages/settings/AccountCard.tsx new file mode 100644 index 0000000..68db127 --- /dev/null +++ b/src/pages/settings/AccountCard.tsx @@ -0,0 +1,116 @@ +import { useState } from 'react' +import { useAuthStore } from '@/store/auth-store' +import { supabase } from '@/lib/supabase' +import { cn } from '@/lib/utils' + +export function AccountCard() { + const logout = useAuthStore((s) => s.logout) + const [changingPw, setChangingPw] = useState(false) + const [pw, setPw] = useState({ current: '', next: '', confirm: '' }) + const [saving, setSaving] = useState(false) + const [msg, setMsg] = useState('') + const [confirmDelete, setConfirmDelete] = useState(false) + + async function changePassword() { + if (pw.next !== pw.confirm) { setMsg('Mật khẩu xác nhận không khớp.'); return } + if (pw.next.length < 6) { setMsg('Mật khẩu phải có ít nhất 6 ký tự.'); return } + setSaving(true) + setMsg('') + try { + const { error } = await supabase.auth.updateUser({ password: pw.next }) + if (error) throw error + setMsg('Đổi mật khẩu thành công!') + setChangingPw(false) + setPw({ current: '', next: '', confirm: '' }) + } catch { + setMsg('Không thể đổi mật khẩu. Thử lại sau.') + } finally { + setSaving(false) + } + } + + async function deleteAccount() { + // Supabase doesn't support self-delete via client SDK — log out and show message + await logout() + alert('Vui lòng liên hệ hỗ trợ để xóa tài khoản.') + } + + return ( +
+

+ security + Tài khoản & Bảo mật +

+ + {/* Change password */} +
+
+

Mật khẩu

+

Cập nhật mật khẩu để bảo mật tài khoản

+
+ +
+ + {changingPw && ( +
+ {(['next', 'confirm'] as const).map((field) => ( + setPw((p) => ({ ...p, [field]: e.target.value }))} + className="w-full max-w-sm border border-slate-200 rounded-lg px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-200" + /> + ))} +
+ + +
+ {msg &&

{msg}

} +
+ )} + + {/* Danger zone */} +
+

Khu vực nguy hiểm

+
+
+

Xóa tài khoản

+

Hành động này không thể hoàn tác. Toàn bộ dữ liệu học tập sẽ bị mất.

+
+ {confirmDelete ? ( +
+ + +
+ ) : ( + + )} +
+
+
+ ) +} diff --git a/src/pages/settings/DailyGoalCard.tsx b/src/pages/settings/DailyGoalCard.tsx new file mode 100644 index 0000000..ccf88e9 --- /dev/null +++ b/src/pages/settings/DailyGoalCard.tsx @@ -0,0 +1,56 @@ +import { useState } from 'react' +import { cn } from '@/lib/utils' + +const GOAL_OPTIONS = [ + { value: '10', label: '10p', sublabel: 'Dễ dàng' }, + { value: '20', label: '20p', sublabel: 'Tiêu chuẩn' }, + { value: '30', label: '30p', sublabel: 'Thử thách' }, + { value: '60', label: '1h', sublabel: 'Chuyên sâu' }, +] + +const XP_MAP: Record = { '10': 20, '20': 50, '30': 80, '60': 120 } +const STORAGE_KEY = 'settings_daily_goal' + +export function DailyGoalCard() { + const [goal, setGoal] = useState(() => localStorage.getItem(STORAGE_KEY) ?? '20') + + function handleSelect(value: string) { + setGoal(value) + localStorage.setItem(STORAGE_KEY, value) + } + + return ( +
+

+ target + Mục tiêu hàng ngày +

+ +
+ {GOAL_OPTIONS.map((opt) => { + const active = goal === opt.value + return ( + + ) + })} +
+ +
+ stars + +{XP_MAP[goal]} XP mỗi ngày +
+
+ ) +} diff --git a/src/pages/settings/ExamDateCard.tsx b/src/pages/settings/ExamDateCard.tsx new file mode 100644 index 0000000..d725714 --- /dev/null +++ b/src/pages/settings/ExamDateCard.tsx @@ -0,0 +1,86 @@ +import { useState } from 'react' + +const STORAGE_KEY = 'settings_exam_date' + +function getDaysUntil(dateStr: string): number { + const today = new Date() + today.setHours(0, 0, 0, 0) + const target = new Date(dateStr) + target.setHours(0, 0, 0, 0) + return Math.ceil((target.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)) +} + +function formatVi(dateStr: string): string { + const d = new Date(dateStr) + return d.toLocaleDateString('vi-VN', { day: 'numeric', month: 'long', year: 'numeric' }) +} + +export function ExamDateCard() { + const [examDate, setExamDate] = useState(() => localStorage.getItem(STORAGE_KEY) ?? '') + const [editing, setEditing] = useState(false) + const [input, setInput] = useState(examDate) + + function save() { + if (!input) return + setExamDate(input) + localStorage.setItem(STORAGE_KEY, input) + setEditing(false) + } + + const days = examDate ? getDaysUntil(examDate) : null + + return ( +
+

+ calendar_month + Ngày thi TOEIC +

+ +
+ {examDate && days !== null ? ( + <> +
+

Đếm ngược kỳ thi

+

+ {days > 0 ? `Còn ${days} ngày` : days === 0 ? 'Hôm nay!' : 'Đã qua'} +

+
+ event + {formatVi(examDate)} +
+
+ + + ) : ( +
+ event_upcoming +

Chưa đặt ngày thi

+
+ )} + + {editing || !examDate ? ( +
+ setInput(e.target.value)} + min={new Date().toISOString().split('T')[0]} + className="flex-1 border border-slate-200 rounded-lg px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-200" + /> + + {editing && ( + + )} +
+ ) : null} +
+
+ ) +} diff --git a/src/pages/settings/NotificationsCard.tsx b/src/pages/settings/NotificationsCard.tsx new file mode 100644 index 0000000..9d1ffd2 --- /dev/null +++ b/src/pages/settings/NotificationsCard.tsx @@ -0,0 +1,101 @@ +import { useState } from 'react' +import { cn } from '@/lib/utils' + +interface NotifPrefs { + daily: boolean + streak: boolean + weekly: boolean + leaderboard: boolean +} + +const STORAGE_KEY = 'settings_notifications' +const TIME_KEY = 'settings_notif_time' + +const DEFAULT_PREFS: NotifPrefs = { daily: true, streak: true, weekly: false, leaderboard: true } + +function loadPrefs(): NotifPrefs { + try { + return { ...DEFAULT_PREFS, ...JSON.parse(localStorage.getItem(STORAGE_KEY) ?? '{}') } + } catch { + return DEFAULT_PREFS + } +} + +interface ToggleProps { + checked: boolean + onChange: (v: boolean) => void +} + +function Toggle({ checked, onChange }: ToggleProps) { + return ( + + ) +} + +export function NotificationsCard() { + const [prefs, setPrefs] = useState(loadPrefs) + const [time, setTime] = useState(() => localStorage.getItem(TIME_KEY) ?? '20:00') + + function toggle(key: keyof NotifPrefs) { + const next = { ...prefs, [key]: !prefs[key] } + setPrefs(next) + localStorage.setItem(STORAGE_KEY, JSON.stringify(next)) + } + + function saveTime(v: string) { + setTime(v) + localStorage.setItem(TIME_KEY, v) + } + + const items: { key: keyof NotifPrefs; label: string; desc: string }[] = [ + { key: 'daily', label: 'Nhắc nhở hàng ngày', desc: 'Tùy chỉnh thời gian học mỗi ngày' }, + { key: 'streak', label: 'Cảnh báo chuỗi học tập', desc: 'Không bao giờ bỏ lỡ Streak của bạn' }, + { key: 'weekly', label: 'Nhắc nhở mục tiêu tuần', desc: 'Theo dõi tiến độ học tập hàng tuần' }, + { key: 'leaderboard', label: 'Cập nhật bảng xếp hạng', desc: 'Biết ngay khi ai đó vượt qua bạn' }, + ] + + return ( +
+

+ notifications_active + Cài đặt thông báo +

+ +
+ {items.map((item) => ( +
+
+

{item.label}

+

{item.desc}

+ {item.key === 'daily' && prefs.daily && ( +
+ schedule + saveTime(e.target.value)} + className="bg-transparent outline-none text-xs font-semibold w-16" + /> +
+ )} +
+ toggle(item.key)} /> +
+ ))} +
+
+ ) +} diff --git a/src/pages/settings/ProfileCard.tsx b/src/pages/settings/ProfileCard.tsx new file mode 100644 index 0000000..824c28d --- /dev/null +++ b/src/pages/settings/ProfileCard.tsx @@ -0,0 +1,126 @@ +import { useState } from 'react' +import { useAuthStore } from '@/store/auth-store' +import { supabase } from '@/lib/supabase' +import { cn } from '@/lib/utils' + +export function ProfileCard() { + const user = useAuthStore((s) => s.user) + const [editingName, setEditingName] = useState(false) + const [editingEmail, setEditingEmail] = useState(false) + const [nameInput, setNameInput] = useState(user?.name ?? '') + const [emailInput, setEmailInput] = useState(user?.email ?? '') + const [saving, setSaving] = useState(false) + const [error, setError] = useState('') + + async function saveName() { + if (!nameInput.trim()) return + setSaving(true) + setError('') + try { + const { error: err } = await supabase.auth.updateUser({ data: { name: nameInput.trim() } }) + if (err) throw err + setEditingName(false) + } catch { + setError('Không thể lưu tên. Thử lại sau.') + } finally { + setSaving(false) + } + } + + async function saveEmail() { + if (!emailInput.trim()) return + setSaving(true) + setError('') + try { + const { error: err } = await supabase.auth.updateUser({ email: emailInput.trim() }) + if (err) throw err + setEditingEmail(false) + } catch { + setError('Không thể lưu email. Thử lại sau.') + } finally { + setSaving(false) + } + } + + const initials = (user?.name ?? 'U').charAt(0).toUpperCase() + + return ( +
+

+ person + Hồ sơ cá nhân +

+ +
+ {/* Avatar */} +
+
+ {initials} +
+
+ + {/* Fields */} +
+ {/* Name */} +
+
+

Họ và tên

+ {editingName ? ( + setNameInput(e.target.value)} + onKeyDown={(e) => { if (e.key === 'Enter') saveName(); if (e.key === 'Escape') setEditingName(false) }} + className="mt-0.5 text-base font-semibold w-full border border-blue-300 rounded-lg px-2 py-0.5 outline-none focus:ring-2 focus:ring-blue-200" + /> + ) : ( +

{user?.name ?? '—'}

+ )} +
+ {editingName ? ( +
+ + +
+ ) : ( + + )} +
+ + {/* Email */} +
+
+

Email

+ {editingEmail ? ( + setEmailInput(e.target.value)} + onKeyDown={(e) => { if (e.key === 'Enter') saveEmail(); if (e.key === 'Escape') setEditingEmail(false) }} + className="mt-0.5 text-base font-semibold w-full border border-blue-300 rounded-lg px-2 py-0.5 outline-none focus:ring-2 focus:ring-blue-200" + /> + ) : ( +

{user?.email ?? '—'}

+ )} +
+ {editingEmail ? ( +
+ + +
+ ) : ( + + )} +
+
+
+ + {error &&

{error}

} +
+ ) +} diff --git a/src/pages/settings/XuWalletCard.tsx b/src/pages/settings/XuWalletCard.tsx new file mode 100644 index 0000000..32b51f0 --- /dev/null +++ b/src/pages/settings/XuWalletCard.tsx @@ -0,0 +1,47 @@ +// Phase 3: Xu balance reads from localStorage until gamification DB is live +const XU_STORAGE_KEY = 'xu_balance' +const DEFAULT_XU = 50 // welcome bonus + +function getXuBalance(): number { + const stored = localStorage.getItem(XU_STORAGE_KEY) + return stored ? parseInt(stored, 10) : DEFAULT_XU +} + +const RECENT_TRANSACTIONS = [ + { label: 'Hoàn thành bài tập', amount: '+10 Xu', icon: 'add_circle' }, + { label: 'Đổi Streak Freeze', amount: '-20 Xu', icon: 'ac_unit' }, +] + +export function XuWalletCard() { + const balance = getXuBalance() + + return ( +
+ {/* Decorative blobs */} +
+
+ +
+

Ví Xu của bạn

+
+ {balance.toLocaleString('vi-VN')} Xu +
+
+ +
+ {RECENT_TRANSACTIONS.map((t) => ( +
+
+ {t.icon} + {t.label} +
+ {t.amount} +
+ ))} +
+
+ ) +} diff --git a/src/routes/dashboard.tsx b/src/routes/dashboard.tsx new file mode 100644 index 0000000..caad190 --- /dev/null +++ b/src/routes/dashboard.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router' +import { Dashboard } from '@/pages/Dashboard' + +export const Route = createFileRoute('/dashboard')({ + component: Dashboard, +}) diff --git a/src/routes/settings.tsx b/src/routes/settings.tsx new file mode 100644 index 0000000..3ee527c --- /dev/null +++ b/src/routes/settings.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router' +import { Settings } from '@/pages/Settings' + +export const Route = createFileRoute('/settings')({ + component: Settings, +}) diff --git a/src/types/index.ts b/src/types/index.ts index 7c57de5..9f66455 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -58,3 +58,45 @@ export interface User { email: string name: string } + +// Phase 3 — Gamification +export type UserLevel = 'beginner' | 'bronze' | 'silver' | 'gold' | 'master' + +export type XuTransactionType = + | 'earn_welcome' + | 'earn_daily' + | 'earn_streak' + | 'earn_ads' + | 'spend_freeze' + | 'spend_writing' + | 'spend_test' + +export interface UserGamification { + userId: string + xp: number + level: UserLevel + streak: number + longestStreak: number + lastActive: string | null // DATE as ISO string + xu: number + freezeCount: number + createdAt: string +} + +export interface XuTransaction { + id: string + userId: string + type: XuTransactionType + amount: number + balance: number + description: string | null + createdAt: string +} + +export interface WeeklyLeaderboardEntry { + id: string + userId: string + weekStart: string + xpEarned: number + rank: number | null +} diff --git a/stitch-exports/dashboard/DESIGN.md b/stitch-exports/dashboard/DESIGN.md new file mode 100644 index 0000000..9985e5d --- /dev/null +++ b/stitch-exports/dashboard/DESIGN.md @@ -0,0 +1,68 @@ +# Design System + +Auto-generated from Google Stitch export. + +## Colors + +- `border-r-0` +- `bg-slate-50` +- `bg-slate-900` +- `text-blue-600` +- `text-blue-400` +- `bg-slate-100` +- `bg-slate-800` +- `text-slate-500` +- `text-blue-700` +- `text-blue-300` +- `bg-blue-50` +- `bg-blue-900` +- `text-slate-400` +- `text-slate-600` +- `bg-slate-300` + +## Typography + +- `text-xl` +- `font-bold` +- `font-medium` +- `text-sm` +- `text-xs` +- `font-semibold` +- `text-base` +- `text-4xl` +- `font-extrabold` +- `text-3xl` +- `text-lg` +- `text-2xl` + +## Spacing + +- `p-0` +- `p-6` +- `gap-3` +- `p-3` +- `gap-2` +- `gap-6` +- `gap-4` +- `p-2` +- `gap-1` +- `p-8` +- `p-4` +- `gap-8` +- `space-y-6` +- `space-y-3` +- `m-8` + +## Components + +- `
+
+
+ + + + \ No newline at end of file diff --git a/stitch-exports/dashboard/design.png b/stitch-exports/dashboard/design.png new file mode 100644 index 0000000000000000000000000000000000000000..0f03dbd3cc969b197d763aeff014de3dd1bbe6ca GIT binary patch literal 72000 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 RB@F=|gz+^al7UOq{{Sh6BM1Nh literal 0 HcmV?d00001 diff --git a/stitch-exports/preferences/DESIGN.md b/stitch-exports/preferences/DESIGN.md new file mode 100644 index 0000000..1e8dd0f --- /dev/null +++ b/stitch-exports/preferences/DESIGN.md @@ -0,0 +1,71 @@ +# Design System + +Auto-generated from Google Stitch export. + +## Colors + +- `border-r-0` +- `bg-slate-50` +- `bg-slate-900` +- `text-blue-700` +- `text-blue-500` +- `text-slate-500` +- `text-slate-400` +- `text-blue-600` +- `text-blue-300` +- `bg-slate-100` +- `bg-slate-800` +- `text-blue-400` +- `border-r-4` +- `border-blue-700` +- `border-blue-400` +- `bg-blue-50` +- `bg-blue-900` +- `bg-blue-100` +- `bg-slate-950` + +## Typography + +- `text-sm` +- `font-medium` +- `text-xl` +- `font-bold` +- `text-xs` +- `text-lg` +- `font-semibold` +- `font-extrabold` +- `text-4xl` + +## Spacing + +- `p-0` +- `gap-3` +- `space-y-1` +- `p-4` +- `gap-6` +- `gap-2` +- `gap-8` +- `p-8` +- `m-0` +- `p-1` +- `space-y-4` +- `space-y-3` +- `p-3` +- `m-8` +- `gap-4` + +## Components + +- `
+
+
+
+

Họ và tên

+

Minh Anh

+
+ +
+
+
+

Email

+

minhanh@example.com

+
+ +
+
+ + + +
+
+

Ví Xu của bạn

+
2,450 Xu
+
+
+
+
+add_circle +Hoàn thành bài tập +
++50 Xu +
+
+
+redeem +Đổi quà +
+-100 Xu +
+
+
+
+
+ +
+

+target + Mục tiêu hàng ngày +

+
+ + + + +
+
+stars ++50 XP mỗi ngày +
+
+ +
+

+calendar_month + Ngày thi TOEIC +

+
+
+

Đếm ngược kỳ thi

+

Còn 45 ngày

+
+event +25 Tháng 12, 2024 +
+
+ +
+
+ +
+

+notifications_active + Cài đặt thông báo +

+
+
+
+

Nhắc nhở hàng ngày

+

Tùy chỉnh thời gian học mỗi ngày

+
+schedule + 20:00 +
+
+ +
+
+
+

Cảnh báo chuỗi học tập

+

Không bao giờ bỏ lỡ Streak của bạn

+
+ +
+
+
+

Nhắc nhở mục tiêu tuần

+

Theo dõi tiến độ học tập hàng tuần

+
+ +
+
+
+

Cập nhật bảng xếp hạng

+

Biết ngay khi ai đó vượt qua bạn

+
+ +
+
+
+ +
+

+security + Tài khoản & Bảo mật +

+
+
+
+

Mật khẩu

+

Cập nhật mật khẩu để bảo mật tài khoản

+
+ +
+
+

Khu vực nguy hiểm

+
+
+

Xóa tài khoản

+

Hành động này không thể hoàn tác. Toàn bộ dữ liệu học tập sẽ bị mất.

+
+ +
+
+
+
+ + + \ No newline at end of file diff --git a/stitch-exports/preferences/design.png b/stitch-exports/preferences/design.png new file mode 100644 index 0000000000000000000000000000000000000000..1263f4ca2ed597120c193891866c7c3446e9e904 GIT binary patch literal 55791 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 Qe+2<*RrdY) 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 UWp@2hwIsj+SJP3gQ?ZHqANKb<#{d8T literal 0 HcmV?d00001 diff --git a/supabase/migrations/002_gamification.sql b/supabase/migrations/002_gamification.sql new file mode 100644 index 0000000..4e95984 --- /dev/null +++ b/supabase/migrations/002_gamification.sql @@ -0,0 +1,119 @@ +-- Migration 002: Gamification — Xu system, XP, streak, leaderboard +-- Run in Supabase Dashboard → SQL Editor (after 001_user_progress.sql) + +-- ============================================================ +-- User gamification state (one row per user) +-- ============================================================ +CREATE TABLE IF NOT EXISTS user_gamification ( + user_id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, + xp INT NOT NULL DEFAULT 0, + level TEXT NOT NULL DEFAULT 'beginner' + CHECK (level IN ('beginner', 'bronze', 'silver', 'gold', 'master')), + streak INT NOT NULL DEFAULT 0, + longest_streak INT NOT NULL DEFAULT 0, + last_active DATE, + xu INT NOT NULL DEFAULT 50, -- welcome bonus + freeze_count INT NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ DEFAULT now() +); + +-- ============================================================ +-- Xu transaction log (immutable audit trail) +-- ============================================================ +CREATE TABLE IF NOT EXISTS xu_transactions ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + type TEXT NOT NULL + CHECK (type IN ( + 'earn_welcome', 'earn_daily', 'earn_streak', 'earn_ads', + 'spend_freeze', 'spend_writing', 'spend_test' + )), + amount INT NOT NULL, -- positive = earn, negative = spend + balance INT NOT NULL, -- xu balance after this transaction + description TEXT, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_xu_transactions_user_date + ON xu_transactions(user_id, created_at DESC); + +-- ============================================================ +-- Weekly leaderboard (reset every week) +-- ============================================================ +CREATE TABLE IF NOT EXISTS weekly_leaderboard ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + week_start DATE NOT NULL, + xp_earned INT NOT NULL DEFAULT 0, + rank INT, + UNIQUE (user_id, week_start) +); + +CREATE INDEX IF NOT EXISTS idx_leaderboard_week_xp + ON weekly_leaderboard(week_start, xp_earned DESC); + +-- ============================================================ +-- Row Level Security +-- ============================================================ + +-- user_gamification +ALTER TABLE user_gamification ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "Users can read own gamification" + ON user_gamification FOR SELECT + USING (auth.uid() = user_id); + +CREATE POLICY "Users can insert own gamification" + ON user_gamification FOR INSERT + WITH CHECK (auth.uid() = user_id); + +CREATE POLICY "Users can update own gamification" + ON user_gamification FOR UPDATE + USING (auth.uid() = user_id); + +-- xu_transactions (immutable — no UPDATE/DELETE) +ALTER TABLE xu_transactions ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "Users can read own xu transactions" + ON xu_transactions FOR SELECT + USING (auth.uid() = user_id); + +CREATE POLICY "Users can insert own xu transactions" + ON xu_transactions FOR INSERT + WITH CHECK (auth.uid() = user_id); + +-- weekly_leaderboard (public read, own write) +ALTER TABLE weekly_leaderboard ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "Anyone can read leaderboard" + ON weekly_leaderboard FOR SELECT + USING (true); + +CREATE POLICY "Users can insert own leaderboard" + ON weekly_leaderboard FOR INSERT + WITH CHECK (auth.uid() = user_id); + +CREATE POLICY "Users can update own leaderboard" + ON weekly_leaderboard FOR UPDATE + USING (auth.uid() = user_id); + +-- ============================================================ +-- Trigger: auto-create gamification row on new user signup +-- ============================================================ +CREATE OR REPLACE FUNCTION handle_new_user_gamification() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO user_gamification (user_id, xu) + VALUES (NEW.id, 50); + + INSERT INTO xu_transactions (user_id, type, amount, balance, description) + VALUES (NEW.id, 'earn_welcome', 50, 50, 'Welcome bonus'); + + RETURN NEW; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER; + +CREATE TRIGGER on_auth_user_created_gamification + AFTER INSERT ON auth.users + FOR EACH ROW + EXECUTE FUNCTION handle_new_user_gamification();