Initial Falah Mobile rebuild — all 7 blocks complete

- Auth system (login/register/profile)
- Nur AI chat with persona system
- Souq marketplace with FLH economy
- Forum community with Shariah moderation
- Wallet & FLH top-up
- Premium/Pro tier upgrade with Polar.sh
- Halal Monitor with map & bookmarks
- Home dashboard with daily verse & streaks
- Health endpoints

Next.js 16.2.7, Prisma v5 SQLite, JWT auth, Tailwind CSS v4
This commit is contained in:
root
2026-06-15 09:28:22 +02:00
parent ab8a2053e1
commit 5483dd291e
56 changed files with 7619 additions and 100 deletions
+78
View File
@@ -0,0 +1,78 @@
"use client";
import { useAuth } from "@/lib/AuthContext";
import Link from "next/link";
import { usePathname } from "next/navigation";
import {
Bot,
ShoppingBag,
MessageCircle,
Wallet,
User,
} from "lucide-react";
const navItems = [
{ href: "/nur", label: "Nur", icon: Bot },
{ href: "/souq", label: "Souq", icon: ShoppingBag },
{ href: "/", label: "Home", icon: null, isHome: true },
{ href: "/forum", label: "Forum", icon: MessageCircle },
{ href: "/wallet", label: "Wallet", icon: Wallet },
{ href: "/profile", label: "Profile", icon: User },
];
export default function BottomNav() {
const pathname = usePathname();
return (
<nav className="fixed bottom-0 left-0 right-0 z-50 bg-[#0a0a0f]/95 backdrop-blur-md border-t border-gray-800/60"
style={{ paddingBottom: "env(safe-area-inset-bottom, 0px)", height: "calc(64px + env(safe-area-inset-bottom, 0px))" }}>
<div className="flex items-stretch h-16 max-w-lg mx-auto">
{navItems.map((item) => {
const isActive = pathname === item.href || pathname.startsWith(item.href + "/");
const Icon = item.icon;
const isHome = item.isHome;
if (isHome) {
return (
<Link
key={item.href}
href="/"
className="flex-1 flex items-center justify-center"
>
<div className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${
pathname === "/"
? "bg-[#D4AF37] text-[#0a0a0f]"
: "bg-gray-800/60 text-gray-500"
}`}>
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
</svg>
</div>
</Link>
);
}
return (
<Link
key={item.href}
href={item.href}
className="flex-1 flex flex-col items-center justify-center gap-0.5 transition-opacity active:opacity-60"
>
{Icon && (
<Icon
size={20}
className={isActive ? "text-[#D4AF37]" : "text-gray-600"}
/>
)}
<span className={`text-[10px] font-medium ${
isActive ? "text-[#D4AF37]" : "text-gray-600"
}`}>
{item.label}
</span>
</Link>
);
})}
</div>
</nav>
);
}