Fix auth login flow, Iran Yekan/Doran fonts, and account tiles.

Prevent stale /auth/me from wiping a fresh session, unblock login submit, allow localhost HMR, and drop the tile "مشاهده" CTA.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-09-26 11:10:37 +03:30
co-authored by Cursor
parent 27d5cd0186
commit 68365457a1
24 changed files with 1294 additions and 203 deletions
+145
View File
@@ -0,0 +1,145 @@
"use client";
import DashboardBanner from "@/components/dashboard/DashboardBanner";
import DashboardHeader from "@/components/dashboard/DashboardHeader";
import DashTileGrid, {
DashTileItem,
} from "@/components/dashboard/DashTileGrid";
import { useAuth } from "@/lib/auth";
function canAccessAdmin(role: string | undefined) {
return role === "STORE_ADMIN" || role === "SUPER_ADMIN";
}
export default function CustomerHomePage() {
const { user } = useAuth();
const showAdmin = canAccessAdmin(user?.role);
const tiles: DashTileItem[] = [
{
href: "/account/orders",
title: "سفارش‌های من",
titleEn: "My Orders",
description: "پیگیری وضعیت و جزئیات خرید",
icon: <OrdersIcon />,
},
{
href: "/account/profile",
title: "پروفایل من",
titleEn: "My Profile",
description: "اطلاعات حساب و آدرس‌ها",
icon: <ProfileIcon />,
},
...(showAdmin
? [
{
href: "/",
title: "پنل مدیریت",
titleEn: "Admin",
description: "مدیریت فروشگاه و محصولات",
icon: <AdminIcon />,
} satisfies DashTileItem,
]
: []),
];
const bannerDelay = 80 + tiles.length * 70;
return (
<div className="mana-canvas relative flex min-h-dvh flex-col">
<DashboardHeader />
<main className="relative z-10 mx-auto flex w-full max-w-6xl flex-1 flex-col px-3 pt-10 pb-6 sm:px-5 sm:pt-12 sm:pb-8 lg:px-6">
<div className="mb-3 dash-enter" style={{ animationDelay: "0ms" }}>
<h1
dir="ltr"
className="flex flex-wrap items-baseline justify-end gap-x-2.5 gap-y-1 text-2xl font-medium text-ink sm:text-4xl"
>
<span className="font-display text-base tracking-[0.06em] text-muted sm:text-xl">
Account
</span>
<span aria-hidden className="text-sm text-muted/60 sm:text-base">
•
</span>
<span dir="rtl" className="font-doran">
حساب کاربری
</span>
</h1>
<p className="mt-3 max-w-xl text-sm leading-7 text-muted sm:text-base">
سفارش‌ها و اطلاعات حساب خود را از اینجا مدیریت کنید
{showAdmin ? "؛ در صورت دسترسی می‌توانید به پنل مدیریت بروید" : ""}
.
</p>
</div>
<DashTileGrid tiles={tiles} />
<DashboardBanner
src="/images/image4.jpg"
alt="نمای کالکشن مانا"
caption="Quiet elegance."
hoverTitle="خریدهای من"
hoverSubtitle="My Orders"
priority
style={{ animationDelay: `${bannerDelay}ms` }}
/>
</main>
</div>
);
}
function iconProps() {
return {
width: 56,
height: 56,
viewBox: "0 0 24 24",
fill: "none",
"aria-hidden": true as const,
};
}
function OrdersIcon() {
return (
<svg {...iconProps()}>
<path
d="M6 7h12l-.8 11.2a1 1 0 0 1-1 .8H7.8a1 1 0 0 1-1-.8L6 7Z"
stroke="currentColor"
strokeWidth="1.15"
strokeLinejoin="round"
/>
<path
d="M9 7a3 3 0 0 1 6 0"
stroke="currentColor"
strokeWidth="1.15"
strokeLinecap="round"
/>
</svg>
);
}
function ProfileIcon() {
return (
<svg {...iconProps()}>
<circle cx="12" cy="8" r="3" stroke="currentColor" strokeWidth="1.15" />
<path
d="M5 19c1.5-3.2 3.8-4.8 7-4.8s5.5 1.6 7 4.8"
stroke="currentColor"
strokeWidth="1.15"
strokeLinecap="round"
/>
</svg>
);
}
function AdminIcon() {
return (
<svg {...iconProps()}>
<path
d="M4.5 10.5 12 4.5l7.5 6V19a1 1 0 0 1-1 1h-4.5v-5h-5v5H5.5a1 1 0 0 1-1-1v-8.5Z"
stroke="currentColor"
strokeWidth="1.15"
strokeLinejoin="round"
/>
</svg>
);
}