Files
falah-mobile/src/app/profile/page.tsx
T
FalahMobile 9f33038c37 feat: implement Phase 5 Nur screen and Phase 6 Profile screen
Nur screen:
- Header with gold-purple avatar, online status, Home button
- Mood check-in with 5 emojis (gold border on selected)
- Chat with gold gradient user bubbles, purple AI bubbles
- Slash commands: /quran, /hadith, /dua, /prayer
- Input bar with gold-purple send button
- Persona switcher: NurBuddy, Ghazali, Ibn Abbas, Rabi'a

Profile screen:
- Avatar with gold border, name, email, Premium + Lvl 7 badges
- FLH Wallet card with balance display
- 2x2 quick action grid (Souq, Waqf, Forum, Halal Monitor)
- Settings list with streak, notifications, appearance, upgrade
- Sign out with red button
2026-07-03 11:44:49 +08:00

209 lines
7.5 KiB
TypeScript

'use client'
import { useState } from 'react'
import { useRouter } from 'next/navigation'
import Link from 'next/link'
import {
Pencil,
ChevronRight,
ShoppingBag,
HandHeart,
MessageSquareText,
MapPin,
Flame,
Bell,
Sun,
Crown,
LogOut,
Wallet,
} from 'lucide-react'
/* ─── Quick Actions ──────────────────────────────────────────── */
const QUICK_ACTIONS = [
{ href: '/souq', icon: ShoppingBag, label: 'Souq' },
{ href: '/waqf', icon: HandHeart, label: 'Waqf' },
{ href: '/forum', icon: MessageSquareText, label: 'Forum' },
{ href: '/halal-monitor', icon: MapPin, label: 'Halal Monitor' },
]
/* ─── Settings Items ─────────────────────────────────────────── */
const SETTINGS = [
{
icon: Flame,
label: 'Spirituality Stats',
value: '124-day streak',
color: 'text-orange-400',
},
{
icon: Bell,
label: 'Notifications',
value: '',
color: 'text-[#999]',
},
{
icon: Sun,
label: 'Appearance',
value: 'Dark Mode',
color: 'text-[#999]',
},
{
icon: Crown,
label: 'Upgrade to Pro',
value: '',
color: 'text-[#D4AF37]',
gold: true,
},
]
/* ─── Component ──────────────────────────────────────────────── */
export default function ProfilePage() {
const router = useRouter()
const handleSignOut = () => {
if (typeof window !== 'undefined') {
localStorage.clear()
}
router.push('/login')
}
return (
<div className="min-h-dvh bg-[#0a0a0f] pb-32 select-none">
{/* Scrollable content */}
<div className="overflow-y-auto">
{/* ═══ Profile Header ═══ */}
<div className="px-5 pt-14 pb-6">
<div className="flex items-center gap-4">
{/* Avatar */}
<div className="w-[60px] h-[60px] rounded-full bg-[#D4AF37]/20 border-2 border-[#D4AF37]/30 flex items-center justify-center shrink-0">
<span className="text-xl font-bold text-[#D4AF37]">A</span>
</div>
{/* Name + badges */}
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<h2 className="text-white font-bold text-lg truncate">Ahmad</h2>
<button className="w-7 h-7 rounded-full bg-[#111118] border border-[#222] flex items-center justify-center active:scale-90 transition-transform shrink-0">
<Pencil size={12} className="text-[#999]" />
</button>
</div>
<p className="text-[#999] text-sm truncate">ahmad@email.com</p>
<div className="flex items-center gap-2 mt-2">
{/* Premium badge */}
<span className="text-[10px] font-bold text-white bg-[#D4AF37] rounded-full px-2.5 py-0.5 uppercase tracking-wider">
Premium
</span>
{/* Level badge */}
<span className="text-[10px] font-bold text-white bg-[#10B981] rounded-full px-2.5 py-0.5 uppercase tracking-wider">
Lvl 7
</span>
</div>
</div>
</div>
</div>
{/* ═══ FLH Wallet Card ═══ */}
<div className="mx-5 mb-5">
<Link
href="/wallet"
className="block bg-gradient-to-br from-[#D4AF37]/10 to-[#B8860B]/5 rounded-2xl border border-[#D4AF37]/20 p-5 active:scale-[0.98] transition-transform"
>
<div className="flex items-center justify-between">
<div className="flex items-center gap-3">
<div className="w-10 h-10 rounded-xl bg-[#D4AF37]/15 flex items-center justify-center">
<Wallet size={20} className="text-[#D4AF37]" />
</div>
<div>
<p className="text-[11px] text-[#666] font-medium uppercase tracking-widest mb-0.5">
FLH Wallet
</p>
<div className="flex items-baseline gap-2">
<span className="text-xl font-bold text-[#D4AF37]">1,250</span>
<span className="text-xs text-[#999]"> .50 USD</span>
</div>
</div>
</div>
<ChevronRight size={18} className="text-[#D4AF37]" />
</div>
</Link>
</div>
{/* ═══ Quick Action Grid (2x2) ═══ */}
<div className="mx-5 mb-5">
<p className="text-[11px] text-[#666] font-medium uppercase tracking-widest mb-3">
Quick Actions
</p>
<div className="grid grid-cols-2 gap-3">
{QUICK_ACTIONS.map((action) => {
const Icon = action.icon
return (
<Link
key={action.href}
href={action.href}
className="bg-[#111118] rounded-2xl border border-[#222] p-4 active:scale-[0.96] transition-transform"
>
<div className="w-10 h-10 rounded-xl bg-[#D4AF37]/10 flex items-center justify-center mb-3">
<Icon size={20} className="text-[#D4AF37]" />
</div>
<p className="text-white text-sm font-semibold">{action.label}</p>
</Link>
)
})}
</div>
</div>
{/* ═══ Settings List ═══ */}
<div className="mx-5 mb-5">
<p className="text-[11px] text-[#666] font-medium uppercase tracking-widest mb-3">
Settings
</p>
<div className="bg-[#111118] rounded-2xl border border-[#222] overflow-hidden divide-y divide-[#222]">
{SETTINGS.map((item, idx) => {
const Icon = item.icon
return (
<button
key={idx}
className="w-full flex items-center gap-3 px-4 py-4 active:bg-[#1a1a24] transition-colors text-left"
>
<div className="w-8 h-8 rounded-lg bg-[#0a0a0f] border border-[#222] flex items-center justify-center shrink-0">
<Icon size={15} className={item.color} />
</div>
<div className="flex-1 min-w-0">
<span
className={`text-sm font-medium ${
item.gold ? 'text-[#D4AF37]' : 'text-white'
}`}
>
{item.label}
</span>
{item.value && (
<span className="text-[11px] text-[#999] ml-2">{item.value}</span>
)}
</div>
<ChevronRight size={15} className="text-[#666] shrink-0" />
</button>
)
})}
</div>
</div>
{/* ═══ Sign Out ═══ */}
<div className="mx-5 mb-6">
<button
onClick={handleSignOut}
className="w-full flex items-center justify-center gap-2 py-4 rounded-2xl border border-red-900/40 bg-red-950/20 active:bg-red-950/40 transition-colors"
>
<LogOut size={16} className="text-red-400" />
<span className="text-sm font-semibold text-red-400">Sign Out</span>
</button>
</div>
{/* Bottom spacer */}
<div className="h-4" />
</div>
</div>
)
}