Files
gitlab-instance-0a899031_do…/components/access-gate.tsx
2026-04-02 07:15:42 -05:00

89 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import Link from "next/link";
import { useMemo } from "react";
import { useTrack } from "@/hooks/use-track";
import { TRACKING_EVENTS } from "@/lib/tracking-events";
import { useAuth } from "@/components/auth-provider";
export function AccessGate({ slug, children }: { slug: string; children: React.ReactNode }) {
const { session, loginAs, setAccessLevel } = useAuth();
const { track } = useTrack();
const state = session.accessLevel;
const hint = useMemo(() => {
if (state === "vip") return "当前状态VIP。可访问全部下载渠道与历史版本包。";
if (state === "unlocked") return "当前状态:已解锁。可访问部分高级下载源。";
return "当前状态:游客。请先解锁或开通 VIP。";
}, [state]);
return (
<section className="card-glass space-y-4">
<div className="flex flex-wrap items-center justify-between gap-3">
<div>
<h3 className="text-lg font-semibold"></h3>
<p className="text-sm text-slate-300">{hint}</p>
</div>
<div className="flex gap-2">
<button
className={`pill ${state === "guest" ? "pill-active" : ""}`}
onClick={() => setAccessLevel("guest")}
>
</button>
<button
className={`pill ${state === "unlocked" ? "pill-active" : ""}`}
onClick={() => setAccessLevel("unlocked")}
>
</button>
<button
className={`pill ${state === "vip" ? "pill-active" : ""}`}
onClick={() => setAccessLevel("vip")}
>
VIP
</button>
</div>
</div>
{!session.isLoggedIn && (
<div className="rounded-2xl border border-cyan-300/20 bg-cyan-400/10 p-3 text-sm text-slate-100">
<p></p>
<button
className="cta-sub mt-2"
onClick={() => {
loginAs();
track(TRACKING_EVENTS.ctaClick, { slug, target: "login_quick" });
}}
>
</button>
</div>
)}
{state === "guest" && (
<div className="rounded-2xl border border-amber-300/30 bg-amber-400/10 p-4 text-sm text-amber-100">
<p></p>
<div className="mt-3 flex flex-wrap gap-2">
<Link
href="/unlock"
onClick={() => track(TRACKING_EVENTS.ctaClick, { slug, target: "unlock_center", gate: "guest" })}
className="cta-sub"
>
</Link>
<Link
href={`/checkout?plan=pro&slug=${slug}`}
onClick={() => track(TRACKING_EVENTS.ctaClick, { slug, target: "checkout", gate: "guest" })}
className="cta-main"
>
VIP
</Link>
</div>
</div>
)}
{state !== "guest" && children}
</section>
);
}