import { useEffect, useState, type ReactNode } from "react"; import { Button } from "antd"; import { useNavigate } from "react-router"; import { WorkspacePage } from "@/components/layout/workspace-page"; import { WorkspaceErrorState, WorkspaceLoadingState, WorkspaceState } from "@/components/layout/workspace-state"; import { refreshFeatureAvailability } from "@/lib/user-session"; import { useUserStore } from "@/stores/use-user-store"; type FeatureKey = "shortDramaEnabled" | "taskCenterEnabled" | "creditsEnabled"; const featureNames: Record = { shortDramaEnabled: "短剧创作", taskCenterEnabled: "任务中心", creditsEnabled: "积分中心", }; let featureAvailabilityCheckedOnce = false; export function RequireFeature({ feature, children }: { feature: FeatureKey; children: ReactNode }) { const navigate = useNavigate(); const features = useUserStore((state) => state.features); const [checking, setChecking] = useState(() => !useUserStore.getState().features[feature]); const [error, setError] = useState(""); useEffect(() => { if (featureAvailabilityCheckedOnce) return; featureAvailabilityCheckedOnce = true; let cancelled = false; setError(""); refreshFeatureAvailability() .catch((reason) => { if (!cancelled) setError(reason instanceof Error ? reason.message : "读取功能开放状态失败"); }) .finally(() => { if (!cancelled) setChecking(false); }); return () => { cancelled = true; }; }, []); if (checking) return ; if (error) return navigate("/create", { replace: true })} />; if (!features[feature]) { return ( navigate("/create", { replace: true })}>返回创作台} /> ); } return children; }