'use client'; import { useState, useEffect } from 'react'; import { Lock } from 'lucide-react'; const PREMIUM_UNLOCK_KEY = 'kvideo-premium-unlocked'; export function PremiumPasswordGate({ children }: { children: React.ReactNode }) { const [isLocked, setIsLocked] = useState(true); const [password, setPassword] = useState(''); const [error, setError] = useState(false); const [isClient, setIsClient] = useState(false); const [isValidating, setIsValidating] = useState(false); useEffect(() => { let mounted = true; const init = async () => { // Check if already unlocked in this session const unlocked = sessionStorage.getItem(PREMIUM_UNLOCK_KEY) === 'true'; try { const [configRes, sessionRes] = await Promise.all([ fetch('/api/auth'), fetch('/api/auth/session'), ]); if (!configRes.ok) throw new Error('Failed to fetch auth config'); const data = await configRes.json(); const sessionData = sessionRes.ok ? await sessionRes.json() : null; const isAdminSession = !!sessionData?.session && (sessionData.session.role === 'admin' || sessionData.session.role === 'super_admin'); if (mounted) { // If no premium password configured, allow access setIsLocked(data.hasPremiumAuth && !unlocked && !isAdminSession); setIsClient(true); } } catch { if (mounted) { setIsLocked(false); setIsClient(true); } } }; init(); return () => { mounted = false; }; }, []); const handleUnlock = async (e: React.FormEvent) => { e.preventDefault(); setIsValidating(true); try { const res = await fetch('/api/auth', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ password, type: 'premium' }), }); const data = await res.json(); if (data.valid) { sessionStorage.setItem(PREMIUM_UNLOCK_KEY, 'true'); setIsLocked(false); setIsValidating(false); return; } } catch { // API error } setError(true); setIsValidating(false); const form = document.getElementById('premium-password-form'); form?.classList.add('animate-shake'); setTimeout(() => form?.classList.remove('animate-shake'), 500); }; if (!isClient) return null; if (!isLocked) { return <>{children}; } return (

高级内容

请输入高级内容密码以继续

{ setPassword(e.target.value); setError(false); }} placeholder="输入高级内容密码..." className={`w-full px-4 py-3 rounded-[var(--radius-2xl)] bg-[var(--glass-bg)] border ${error ? 'border-red-500' : 'border-[var(--glass-border)]' } focus:outline-none focus:border-amber-500 focus:shadow-[0_0_0_3px_rgba(245,158,11,0.3)] transition-all duration-[0.4s] cubic-bezier(0.2,0.8,0.2,1) text-white placeholder-gray-500`} autoFocus /> {error && (

密码错误

)}
); }