// energy.jsx — Energy refill sheet, Ad watch, Subscription const { useState: useStateE, useEffect: useEffectE } = React; function EnergyScreen({ data, setData, back, go, resume }) { const full = data.energy >= data.maxEnergy; return (
{/* energy dots */}
{Array.from({ length: data.maxEnergy }).map((_, i) => (
))}

{data.energy > 0 ? `에너지 ${data.energy}개` : '에너지가 없어요'}

{data.energy > 0 ? 'Quest를 하나 진행할 때마다 에너지 1개를 써요.' : '광고를 보거나, 잠시 기다리면 다시 채워져요.'}

{!full && (
다음 +1까지 {fmtClock(data.nextSec)}
)}
{/* watch ad */}
광고 보고 +1 에너지
약 30초 · 무료
go('ad')} disabled={full}>보기
{/* subscribe */}
{resume && data.energy > 0 && ( { setData(d => ({ ...d, energy: Math.max(0, d.energy - 1) })); go('player', { quest: resume }); }}>에너지 쓰고 계속 )}
); } function AdScreen({ onDone }) { const [left, setLeft] = useStateE(5); useEffectE(() => { if (left <= 0) return; const t = setTimeout(() => setLeft(l => l - 1), 1000); return () => clearTimeout(t); }, [left]); return (
{/* fake ad */}
AD
광고 재생 중
잠시만 기다려 주세요
{left}
0} onClick={onDone} icon={left <= 0 ? : null}> {left > 0 ? `${left}초 후 보상 받기` : '+1 에너지 받기'}
); } function SubscribeScreen({ data, onSubscribe, back }) { const feats = [ ['무제한 에너지', '광고·기다림 없이 계속', 'bolt'], ['모든 Motion Academy 잠금 해제', '카메라 코칭 무제한', 'academy'], ['Body Check 월간 리포트', '변화 추적 확장', 'scan'], ['Streak 보호 강화', '바쁜 날도 안심', 'flame'], ]; if (data.pro) { return (

이미 PRO 회원이에요

에너지 무제한이 적용 중이에요.

); } return (
{/* hero */}
FITBODY PRO

멈추지 않고
매일 이어가요

{feats.map((f, i) => (
{f[0]}
{f[1]}
))}
$4.99 / 월
월 구독 시작
언제든 해지 가능 · 첫 7일 무료 체험
); } Object.assign(window, { EnergyScreen, AdScreen, SubscribeScreen });