// Video Maker client. Renders take ~15-40s server-side, so the button holds a // spinner and the copy warns before the wait rather than after it. (function () { 'use strict'; var ANGLES = [ { k: 'two', label: 'You only need two' }, { k: 'pocket', label: 'Pocket change' }, { k: 'phone', label: 'Runs from your phone' }, { k: 'graveyard', label: 'Side-hustle graveyard' }, { k: 'overview', label: 'General overview' } ]; var $ = function (id) { return document.getElementById(id); }; var angle = 'two', busy = false; function renderAngles() { var host = $('vdAngles'); host.innerHTML = ''; ANGLES.forEach(function (x) { var b = document.createElement('button'); b.type = 'button'; b.className = 'vd-angle' + (x.k === angle ? ' on' : ''); b.textContent = x.label; b.addEventListener('click', function () { angle = x.k; renderAngles(); }); host.appendChild(b); }); } function showMeter(m) { if (!m || !m.limit) { $('vdMeter').textContent = ''; return; } $('vdMeter').innerHTML = '' + m.remaining + ' of ' + m.limit + ' videos left this month'; } function gate(msg) { var g = $('vdGate'); g.style.display = 'block'; g.innerHTML = msg; $('vdCard').style.opacity = '.55'; $('vdGo').disabled = true; $('vdName').disabled = true; } async function boot() { renderAngles(); try { var r = await fetch('/api/public/suite-meters'); if (r.status === 401) { gate('You’re not signed in yet. Open the Suite and connect the wallet that holds your position, then come back.'); return; } if (r.status === 403) { gate('The Video Maker isn’t open for this position yet. See your Suite.'); return; } if (!r.ok) return; var d = await r.json(); var m = d.meters && d.meters.video; if (m && m.reason === 'locked') { gate('The Video Maker unlocks at Fabrica (level 3). You’re at level ' + d.level + ' — keep climbing and it opens, along with the Email Engine. See what upgrades cost →'); return; } showMeter(m); } catch (e) {} } async function run() { if (busy) return; busy = true; $('vdErr').style.display = 'none'; $('vdOut').style.display = 'none'; $('vdGo').disabled = true; $('vdGo').innerHTML = 'Rendering your video… (about a minute)'; try { var r = await fetch('/api/public/suite-video', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ angle: angle, name: $('vdName').value.trim() }) }); var d = await r.json(); if (!r.ok) { $('vdErr').textContent = d.error || 'That didn’t go through — try again.'; $('vdErr').style.display = 'block'; if (d.meter) showMeter(d.meter); } else { $('vdDl').href = d.url; $('vdSize').textContent = 'MP4 · about ' + d.mb + ' MB · ready to post anywhere.'; $('vdOut').style.display = 'block'; showMeter(d.meter); $('vdOut').scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } } catch (e) { $('vdErr').textContent = 'Connection hiccup — try again.'; $('vdErr').style.display = 'block'; } busy = false; $('vdGo').disabled = false; $('vdGo').textContent = '🎬 Make my video'; } document.addEventListener('DOMContentLoaded', function () { boot(); $('vdGo').addEventListener('click', run); $('vdName').addEventListener('input', function () { $('vdPrev').textContent = $('vdName').value.trim() || 'Your name'; }); }); })();