'use client'; import { useState, useEffect } from 'react'; import { createBrowserClient } from '@supabase/ssr'; import { useRouter } from 'next/navigation'; import TokenPurchaseModal from '@/components/TokenPurchaseModal'; import { ensureProfile } from '@/lib/ensure-profile'; interface Props { children: React.ReactNode; } export default function TojeongDetailUnlock({ children }: Props) { const [isUnlocked, setIsUnlocked] = useState(false); const [user, setUser] = useState(null); const [credits, setCredits] = useState(0); const [showModal, setShowModal] = useState(false); const [loading, setLoading] = useState(false); const router = useRouter(); const supabase = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! ); useEffect(() => { const init = async () => { const { data: { user } } = await supabase.auth.getUser(); if (user) { setUser(user); const currentCredits = await ensureProfile(supabase, user); setCredits(currentCredits); } }; init(); }, []); const handleUnlock = async () => { if (!user) { if (confirm('로그인이 필요합니다. 로그인 페이지로 이동하시겠습니까?')) { router.push('/login'); } return; } if (credits < 1) { setShowModal(true); return; } setLoading(true); const { error } = await supabase .from('profiles') .update({ credits: credits - 1 }) .eq('id', user.id); if (error) { alert('토큰 차감에 실패했습니다. 다시 시도해주세요.'); setLoading(false); return; } setCredits(credits - 1); setIsUnlocked(true); setLoading(false); }; const handlePurchaseComplete = async () => { setShowModal(false); if (user) { const { data: profile } = await supabase .from('profiles') .select('credits') .eq('id', user.id) .single(); if (profile) setCredits(profile.credits || 0); } }; if (isUnlocked) { return <>{children}; } return ( <>
{/* 블러 처리된 미리보기 */}

💡 한 해를 위한 조언

{/* 잠금 오버레이 */}
🔐

상세 조언 잠금해제

토정비결의 상세한 조언과 해석을 확인하세요.

토큰 1개 사용 | 보유: {credits}개

setShowModal(false)} onPurchaseComplete={handlePurchaseComplete} user={user} supabase={supabase} /> ); }