Add frontend/modules/loyalty with types, API client, design system, feature pages and thin App Router routes under app/loyalty/. BFF proxy at app/api/loyalty/. Include loyalty frontend docs. Co-authored-by: Cursor <cursoragent@cursor.com>
224 lines
8.2 KiB
TypeScript
224 lines
8.2 KiB
TypeScript
import type { LucideIcon } from "lucide-react";
|
|
import {
|
|
Award,
|
|
BarChart3,
|
|
Building2,
|
|
Coins,
|
|
Gift,
|
|
Handshake,
|
|
LayoutDashboard,
|
|
Megaphone,
|
|
Puzzle,
|
|
Share2,
|
|
Shield,
|
|
SlidersHorizontal,
|
|
Sparkles,
|
|
Users,
|
|
Wallet,
|
|
} from "lucide-react";
|
|
|
|
export type LoyaltyPortalId = "engage";
|
|
|
|
export type PortalNavItem = {
|
|
id: string;
|
|
label: string;
|
|
href: string;
|
|
shortcut?: string;
|
|
};
|
|
|
|
export type PortalNavGroup = {
|
|
id: string;
|
|
label: string;
|
|
icon: LucideIcon;
|
|
href?: string;
|
|
items?: PortalNavItem[];
|
|
};
|
|
|
|
export const LOYALTY_PORTALS: {
|
|
id: LoyaltyPortalId;
|
|
label: string;
|
|
description: string;
|
|
basePath: string;
|
|
icon: LucideIcon;
|
|
}[] = [
|
|
{
|
|
id: "engage",
|
|
label: "تعامل و وفاداری",
|
|
description: "عضویت، امتیاز، پاداش، کمپین، معرفی و کیف پول مشتری",
|
|
basePath: "/loyalty/engage/dashboard/executive",
|
|
icon: Handshake,
|
|
},
|
|
];
|
|
|
|
export const ENGAGE_NAV: PortalNavGroup[] = [
|
|
{
|
|
id: "dashboards",
|
|
label: "داشبوردها",
|
|
icon: LayoutDashboard,
|
|
items: [
|
|
{ id: "executive", label: "مدیریتی", href: "/loyalty/engage/dashboard/executive" },
|
|
{ id: "member-dashboard", label: "عضو", href: "/loyalty/engage/dashboard/member-dashboard" },
|
|
{ id: "gamification", label: "گیمیفیکیشن", href: "/loyalty/engage/dashboard/gamification" },
|
|
{ id: "retention", label: "نگهداشت", href: "/loyalty/engage/dashboard/retention" },
|
|
{ id: "engagement", label: "تعامل", href: "/loyalty/engage/dashboard/engagement" },
|
|
{
|
|
id: "campaign-performance",
|
|
label: "عملکرد کمپین",
|
|
href: "/loyalty/engage/dashboard/campaign-performance",
|
|
},
|
|
{ id: "clv", label: "ارزش طول عمر مشتری", href: "/loyalty/engage/dashboard/clv" },
|
|
],
|
|
},
|
|
{
|
|
id: "membership",
|
|
label: "عضویت",
|
|
icon: Users,
|
|
items: [
|
|
{ id: "programs", label: "برنامهها", href: "/loyalty/engage/programs" },
|
|
{ id: "tiers", label: "سطوح عضویت", href: "/loyalty/engage/tiers" },
|
|
{ id: "members", label: "اعضا", href: "/loyalty/engage/members" },
|
|
{ id: "customer-profile", label: "پروفایل مشتری", href: "/loyalty/engage/customer-profile" },
|
|
{ id: "membership-cards", label: "کارت عضویت", href: "/loyalty/engage/membership-cards" },
|
|
{ id: "digital-cards", label: "کارت دیجیتال", href: "/loyalty/engage/digital-cards" },
|
|
{ id: "qr-cards", label: "کارت QR", href: "/loyalty/engage/qr-cards" },
|
|
],
|
|
},
|
|
{
|
|
id: "points",
|
|
label: "امتیاز",
|
|
icon: Coins,
|
|
items: [
|
|
{ id: "point-accounts", label: "حسابهای امتیاز", href: "/loyalty/engage/point-accounts" },
|
|
{ id: "point-transactions", label: "تراکنش امتیاز", href: "/loyalty/engage/point-transactions" },
|
|
{ id: "point-rules", label: "قوانین امتیاز", href: "/loyalty/engage/point-rules" },
|
|
{ id: "earning-rules", label: "قوانین کسب امتیاز", href: "/loyalty/engage/earning-rules" },
|
|
{
|
|
id: "redemption-rules",
|
|
label: "قوانین استفاده از امتیاز",
|
|
href: "/loyalty/engage/redemption-rules",
|
|
},
|
|
{ id: "expiration-rules", label: "قوانین انقضا", href: "/loyalty/engage/expiration-rules" },
|
|
],
|
|
},
|
|
{
|
|
id: "rewards",
|
|
label: "پاداشها",
|
|
icon: Gift,
|
|
items: [
|
|
{ id: "reward-catalog", label: "کاتالوگ پاداش", href: "/loyalty/engage/reward-catalog" },
|
|
{ id: "rewards", label: "پاداشها", href: "/loyalty/engage/rewards" },
|
|
{ id: "coupons", label: "کوپنها", href: "/loyalty/engage/coupons" },
|
|
{ id: "vouchers", label: "واچرها", href: "/loyalty/engage/vouchers" },
|
|
{ id: "gift-cards", label: "کارت هدیه", href: "/loyalty/engage/gift-cards" },
|
|
],
|
|
},
|
|
{
|
|
id: "campaigns",
|
|
label: "کمپینها",
|
|
icon: Megaphone,
|
|
items: [
|
|
{ id: "campaigns", label: "کمپینها", href: "/loyalty/engage/campaigns" },
|
|
{ id: "promotions", label: "تبلیغات فعال", href: "/loyalty/engage/promotions" },
|
|
{ id: "challenges", label: "چالشها", href: "/loyalty/engage/challenges" },
|
|
{ id: "missions", label: "مأموریتها", href: "/loyalty/engage/missions" },
|
|
{ id: "achievements", label: "دستاوردها", href: "/loyalty/engage/achievements" },
|
|
{ id: "badges", label: "نشانها", href: "/loyalty/engage/badges" },
|
|
],
|
|
},
|
|
{
|
|
id: "referrals",
|
|
label: "معرفی و ارجاع",
|
|
icon: Share2,
|
|
items: [
|
|
{ id: "referral-programs", label: "برنامههای معرفی", href: "/loyalty/engage/referral-programs" },
|
|
{ id: "referral-codes", label: "کدهای معرفی", href: "/loyalty/engage/referral-codes" },
|
|
{ id: "referrals", label: "ارجاعات", href: "/loyalty/engage/referrals" },
|
|
{ id: "referral-rewards", label: "پاداش معرفی", href: "/loyalty/engage/referral-rewards" },
|
|
],
|
|
},
|
|
{
|
|
id: "wallet",
|
|
label: "کیف پول",
|
|
icon: Wallet,
|
|
items: [
|
|
{ id: "wallets", label: "کیف پولها", href: "/loyalty/engage/wallets" },
|
|
{ id: "benefits", label: "مزایا", href: "/loyalty/engage/benefits" },
|
|
],
|
|
},
|
|
{
|
|
id: "audience",
|
|
label: "مخاطبان",
|
|
icon: Puzzle,
|
|
items: [
|
|
{ id: "segments", label: "سگمنتها", href: "/loyalty/engage/segments" },
|
|
{ id: "audience-builder", label: "سازنده مخاطب", href: "/loyalty/engage/audience-builder" },
|
|
],
|
|
},
|
|
{
|
|
id: "rules",
|
|
label: "قوانین",
|
|
icon: SlidersHorizontal,
|
|
items: [
|
|
{ id: "discount-rules", label: "قوانین تخفیف", href: "/loyalty/engage/discount-rules" },
|
|
{ id: "renewal-rules", label: "قوانین تمدید", href: "/loyalty/engage/renewal-rules" },
|
|
],
|
|
},
|
|
{
|
|
id: "partners",
|
|
label: "شرکا",
|
|
icon: Building2,
|
|
items: [
|
|
{ id: "partner-programs", label: "برنامههای شریک", href: "/loyalty/engage/partner-programs" },
|
|
{ id: "branches", label: "شعب", href: "/loyalty/engage/branches" },
|
|
],
|
|
},
|
|
{
|
|
id: "analytics",
|
|
label: "گزارشها",
|
|
icon: BarChart3,
|
|
items: [
|
|
{ id: "reports", label: "گزارشها", href: "/loyalty/engage/reports" },
|
|
{ id: "analytics", label: "تحلیلها", href: "/loyalty/engage/analytics" },
|
|
],
|
|
},
|
|
{
|
|
id: "admin",
|
|
label: "مدیریت",
|
|
icon: Shield,
|
|
items: [
|
|
{ id: "notifications", label: "اعلانها", href: "/loyalty/engage/notifications" },
|
|
{ id: "audit-logs", label: "لاگ ممیزی", href: "/loyalty/engage/audit-logs" },
|
|
{ id: "permissions", label: "دسترسیها", href: "/loyalty/engage/permissions" },
|
|
{ id: "roles", label: "نقشها", href: "/loyalty/engage/roles" },
|
|
{ id: "api-keys", label: "کلید API", href: "/loyalty/engage/api-keys" },
|
|
{ id: "integrations", label: "یکپارچهسازی", href: "/loyalty/engage/integrations" },
|
|
{ id: "health", label: "سلامت سرویس", href: "/loyalty/engage/health" },
|
|
{ id: "capabilities", label: "قابلیتها", href: "/loyalty/engage/capabilities" },
|
|
],
|
|
},
|
|
];
|
|
|
|
export function navForPortal(portalId: LoyaltyPortalId): PortalNavGroup[] {
|
|
if (portalId === "engage") return ENGAGE_NAV;
|
|
return [];
|
|
}
|
|
|
|
export function detectPortal(pathname: string): LoyaltyPortalId | null {
|
|
if (pathname.startsWith("/loyalty/engage")) return "engage";
|
|
return null;
|
|
}
|
|
|
|
/** Keyboard shortcuts map */
|
|
export const LOYALTY_SHORTCUTS: Record<string, string> = {
|
|
"g h": "/loyalty/hub",
|
|
"g m": "/loyalty/engage/members",
|
|
"g p": "/loyalty/engage/programs",
|
|
"g r": "/loyalty/engage/rewards",
|
|
"g c": "/loyalty/engage/campaigns",
|
|
"g w": "/loyalty/engage/wallets",
|
|
};
|
|
|
|
/** Icon export used by hub cards elsewhere. */
|
|
export const LOYALTY_HUB_ICON: LucideIcon = Sparkles;
|
|
export const LOYALTY_AWARD_ICON: LucideIcon = Award;
|