haixunMaster/components/layout/feature-gate.tsx

48 lines
1.2 KiB
TypeScript
Raw Normal View History

2026-06-21 12:50:31 +00:00
"use client";
import Link from "next/link";
import type { CapabilityFeature } from "@/lib/capabilities/types";
import { useCapabilities } from "@/lib/capabilities/context";
interface FeatureGateProps {
feature: CapabilityFeature;
children?: React.ReactNode;
/** 未就緒時是否顯示說明(預設不顯示,直接隱藏) */
showHint?: boolean;
className?: string;
}
export function FeatureGate({
feature,
children,
showHint = false,
className,
}: FeatureGateProps) {
const { loading, get } = useCapabilities();
if (loading) return null;
const cap = get(feature);
if (cap?.ready) {
return <>{children}</>;
}
if (!showHint || !cap) return null;
return (
<div className={className ?? "rounded-lg border border-dashed border-border bg-muted/40 px-3 py-2.5"}>
<p className="text-[12px] text-muted-foreground">
{cap.reason ?? `${cap.label}尚未就緒`}
{cap.setupHref && cap.setupLabel && (
<>
{" · "}
<Link href={cap.setupHref} className="text-primary underline-offset-2 hover:underline">
{cap.setupLabel}
</Link>
</>
)}
</p>
</div>
);
}