Introduced a new public documentation site for client integration at `/docs` and `/docs/integration`, removing the need for admin login. Updated the integration guide to redirect from the old admin path to the new documentation site. Added localization support for the integration documentation in English, Nepali, and Chinese. Enhanced the layout structure and improved the handling of currency display in settlement bills.
91 lines
2.9 KiB
TypeScript
91 lines
2.9 KiB
TypeScript
"use client";
|
|
|
|
import Link from "next/link";
|
|
import { useTranslation } from "react-i18next";
|
|
import { ChevronRight } from "lucide-react";
|
|
|
|
import { ModuleScaffold } from "@/components/admin/module-scaffold";
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { PRD_INTEGRATION_ACCESS_ANY } from "@/lib/admin-prd";
|
|
import { useAdminProfile } from "@/stores/admin-session";
|
|
import { adminHasAnyPermission } from "@/lib/admin-permissions";
|
|
|
|
type HubCard = {
|
|
href: string;
|
|
titleKey: string;
|
|
descKey: string;
|
|
requiredAny: readonly string[];
|
|
};
|
|
|
|
const HUB_CARDS: HubCard[] = [
|
|
{
|
|
href: "/admin/rules/plays",
|
|
titleKey: "hub.playsTitle",
|
|
descKey: "hub.playsDesc",
|
|
requiredAny: ["prd.play_switch.manage", "prd.odds.manage"],
|
|
},
|
|
{
|
|
href: "/admin/rules/odds",
|
|
titleKey: "hub.oddsTitle",
|
|
descKey: "hub.oddsDesc",
|
|
requiredAny: ["prd.odds.manage", "prd.rebate.manage", "prd.rebate.view"],
|
|
},
|
|
{
|
|
href: "/admin/jackpot",
|
|
titleKey: "hub.jackpotTitle",
|
|
descKey: "hub.jackpotDesc",
|
|
requiredAny: ["prd.jackpot.manage", "prd.jackpot.view"],
|
|
},
|
|
{
|
|
href: "/admin/risk/cap",
|
|
titleKey: "hub.riskCapTitle",
|
|
descKey: "hub.riskCapDesc",
|
|
requiredAny: ["prd.risk_cap.manage", "prd.risk_cap.view"],
|
|
},
|
|
{
|
|
href: "/admin/config/integration-sites",
|
|
titleKey: "hub.integrationTitle",
|
|
descKey: "hub.integrationDesc",
|
|
requiredAny: PRD_INTEGRATION_ACCESS_ANY,
|
|
},
|
|
{
|
|
href: "/docs/integration",
|
|
titleKey: "hub.integrationGuideTitle",
|
|
descKey: "hub.integrationGuideDesc",
|
|
requiredAny: PRD_INTEGRATION_ACCESS_ANY,
|
|
},
|
|
];
|
|
|
|
export function ConfigHubScreen() {
|
|
const { t } = useTranslation("config");
|
|
const profile = useAdminProfile();
|
|
const visible = HUB_CARDS.filter((card) =>
|
|
adminHasAnyPermission(profile?.permissions, card.requiredAny),
|
|
);
|
|
|
|
return (
|
|
<ModuleScaffold>
|
|
<div className="mb-6 max-w-2xl">
|
|
<h1 className="text-lg font-semibold tracking-tight">{t("hub.title")}</h1>
|
|
<p className="mt-2 text-sm text-muted-foreground">{t("hub.description")}</p>
|
|
</div>
|
|
<div className="grid gap-4 sm:grid-cols-2">
|
|
{visible.map((card) => (
|
|
<Link key={card.href} href={card.href} className="group block">
|
|
<Card className="h-full transition-colors hover:border-primary/40 hover:bg-muted/20">
|
|
<CardHeader className="pb-2">
|
|
<CardTitle className="flex items-center justify-between text-base">
|
|
{t(card.titleKey)}
|
|
<ChevronRight className="size-4 text-muted-foreground transition-transform group-hover:translate-x-0.5 group-hover:text-primary" />
|
|
</CardTitle>
|
|
<CardDescription>{t(card.descKey)}</CardDescription>
|
|
</CardHeader>
|
|
<CardContent />
|
|
</Card>
|
|
</Link>
|
|
))}
|
|
</div>
|
|
</ModuleScaffold>
|
|
);
|
|
}
|