// 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 */}
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) => (
))}
$4.99
/ 월
월 구독 시작
언제든 해지 가능 · 첫 7일 무료 체험
);
}
Object.assign(window, { EnergyScreen, AdScreen, SubscribeScreen });