- {isOk ? (
-
- กำหนดโมเดลสำหรับระบบภายใน + กรอกชื่อโมเดล Gemini โดยตรง — ตั้ง API key ที่{" "} + + ตั้งค่า AI +
diff --git a/.env.setup.example b/.env.setup.example new file mode 100644 index 0000000..f817838 --- /dev/null +++ b/.env.setup.example @@ -0,0 +1,11 @@ +# Setup wizard sandbox — copy to .env.setup.local (gitignored) +# Use a SEPARATE Supabase project from your main .env.local dev/deploy DB. + +NEXT_PUBLIC_SUPABASE_URL=https://YOUR_SANDBOX_PROJECT.supabase.co +NEXT_PUBLIC_SUPABASE_ANON_KEY=your_sandbox_anon_key +SUPABASE_SERVICE_ROLE_KEY=your_sandbox_service_role_key +POSTGRES_URL_NON_POOLING=postgresql://postgres.YOUR_SANDBOX_REF:YOUR_PASSWORD@aws-0-ap-southeast-1.pooler.supabase.com:5432/postgres + +# Optional for local setup testing +NEXT_PUBLIC_APP_URL=http://localhost:3000 +SCHOOL_AUTH_DOMAIN=localhost diff --git a/.gitignore b/.gitignore index 7f39dcb..44cc803 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env.local .env +.env.setup.local # Firebase Service Account Keys (NEVER commit these!) *-firebase-adminsdk-*.json diff --git a/README.md b/README.md index a8c0e89..9ad9759 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,30 @@ bun dev # http://localhost:3000 | `bun run gen:students` / `import:students` | สร้าง/นำเข้ารายชื่อนักเรียนจาก CSV | | `bun run test:login` | ทดสอบ flow ล็อกอินนักเรียน | +### ทดสอบ Setup Wizard แบบ Sandbox (ไม่กระทบ `.env.local`) + +ใช้ **Supabase project แยก** สำหรับลอง wizard ซ้ำๆ โดยไม่ต้อง redeploy และไม่ต้องเปลี่ยน env หลักที่เชื่อม deploy อยู่แล้ว + +```bash +# 1) สร้างโปรเจกต์ Supabase ฟรีอีกตัว (เช่น found-u-setup-sandbox) +cp .env.setup.example .env.setup.local +# แก้ .env.setup.local ใส่ URL / keys / POSTGRES ของ sandbox + +# 2) รีเซ็ตสถานะ wizard (ทำซ้ำได้ทุกครั้งหลังทดสอบ) +bun run setup:reset + +# 3) รัน dev ด้วย sandbox env (override .env.local ชั่วคราว) +bun run dev:setup +# เปิด http://localhost:3000/setup +``` + +| คำสั่ง | ใช้ทำอะไร | +|--------|-----------| +| `bun run dev:setup` | `next dev` โดยโหลด `.env.setup.local` | +| `bun run setup:reset` | รีเซ็ต `setup_status`, branding, AI config, แอดมินที่สร้างจาก wizard | + +DB ว่างครั้งแรก: เปิด `/setup` แล้ว hydrator จะรัน migration อัตโนมัติ (เหมือน production) — ไม่ต้อง `db:push` ถ้าใช้ sandbox ใหม่เปล่าๆ + ## Deploy ให้โรงเรียนใหม่ แนวทางที่แนะนำ: **Clone + Deploy ก่อน** ให้ใช้งานได้จริง แล้วค่อย **Fork** ทีหลังถ้าต้องการ sync อัปเดตจากโค้ดหลัก diff --git a/app/(app)/home/page.tsx b/app/(app)/home/page.tsx index bd49873..d578fef 100644 --- a/app/(app)/home/page.tsx +++ b/app/(app)/home/page.tsx @@ -49,8 +49,10 @@ function UserNameSlot({ } function HomeQuickMenu({ className }: { className?: string }) { + // Always single column — this menu is mobile-only; a 2-col grid on + // misreported viewports (≥640px CSS) is what makes phones look "squeezed". return ( -
{item.subtitle}
@@ -136,7 +138,7 @@ export default function Home() { return (
- {isOk ? (
-
- กำหนดโมเดลสำหรับระบบภายใน + กรอกชื่อโมเดล Gemini โดยตรง — ตั้ง API key ที่{" "} + + ตั้งค่า AI +