feat: micro-learning module with seed data

- Add Course and Module models to Prisma schema
- Create seed-learn.json with Daily Fiqh for Beginners (5 modules)
- Create seed-learn.js with Hermes patch (strip id/courseId from create)
- Add /learn page with course listing
- Add /learn/[courseSlug]/[moduleId] page with content + quiz
- Quiz data stored as JSON string per module
- Content rendered as markdown with Key Concept, Details, Reflection, Action Step sections

TODO:
- Add audio player component for listen toggle
- Add progress tracking per user
- Add actual quiz scoring/validation
- Connect to TTS pipeline for audio generation
This commit is contained in:
wmj2024
2026-06-28 04:27:21 +08:00
commit 1f60f1c908
66 changed files with 4713 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
'use client'
import Link from 'next/link'
import { ShoppingCart, Bot, MessageCircle, Wallet, Crown, LogIn, User } from 'lucide-react'
import { useAuth } from '@/lib/AuthContext'
export default function Navbar() {
const { user, token } = useAuth()
const linkClass = (path: string) => {
return `flex items-center gap-1 text-sm transition ${typeof window !== 'undefined' && window.location.pathname === path ? 'text-[#D4AF37]' : 'text-gray-400 hover:text-white'}`
}
return (
<nav className="sticky top-0 z-50 bg-[#0a0a0f]/80 backdrop-blur border-b border-gray-800">
<div className="max-w-6xl mx-auto px-4 h-14 flex items-center justify-between">
<Link href="/" className="text-lg font-bold text-[#D4AF37]">FLH</Link>
<div className="flex items-center gap-4">
<Link href="/souq" className={linkClass('/souq')}>
<ShoppingCart size={16} />
<span className="hidden sm:inline">Souq</span>
</Link>
<Link href="/nur" className={linkClass('/nur')}>
<Bot size={16} />
<span className="hidden sm:inline">Nur</span>
</Link>
<Link href="/forum" className={linkClass('/forum')}>
<MessageCircle size={16} />
<span className="hidden sm:inline">Forum</span>
</Link>
<Link href="/wallet" className={linkClass('/wallet')}>
<Wallet size={16} />
<span className="hidden sm:inline">Wallet</span>
</Link>
<div className="w-px h-5 bg-gray-700" />
{token && user?.isPremium ? (
<Link href="/halal-monitor" className={linkClass('/halal-monitor')}>
<Crown size={16} />
<span className="hidden sm:inline">Monitor</span>
</Link>
) : token ? (
<Link href="/halal-monitor" className="flex items-center gap-1 text-sm transition text-gray-500 hover:text-[#D4AF37]">
<Crown size={14} />
</Link>
) : null}
{token ? (
<Link href="/profile" className="text-gray-400 hover:text-white transition">
<User size={16} />
</Link>
) : (
<Link href="/login" className="text-gray-400 hover:text-white transition">
<LogIn size={16} />
</Link>
)}
</div>
</div>
</nav>
)
}