// Widgets interactivos: cinta de cabeza, verificador de teléfono, // lista previa, mini quiz, FAQ. const { useState, useEffect, useRef } = React; /* ---------- Diagrama de la cinta (formas simples) ---------- */ const STRAP_CHIPS = [ "A la altura de los ojos", "Cámara hacia abajo — manos a la vista", "Firme: sin rebotes ni giros", "REC · horizontal · lente limpio", ]; function StrapDiagram({ step }) { // step: 0 altura de ojos · 1 angular hacia abajo · 2 ajustar · 3 listo/REC return ( ); } function StrapWalkthrough() { const steps = window.GUIDE.strapSteps; const [step, setStep] = useState(0); return (
{steps.map((s, i) => ( ))}
); } /* ---------- Verificador de teléfono ---------- */ function PhoneChecker() { const phones = window.GUIDE.phones; const [brand, setBrand] = useState(null); const [model, setModel] = useState(null); const b = brand ? phones[brand] : null; const verdict = model == null ? null : model.startsWith("ok:") ? true : false; return (
{Object.keys(phones).map((k) => ( ))}
{b && brand !== "other" ? (
{b.ok.map((m) => ( ))} {b.bad.map((m) => ( ))}
) : null} {verdict === true ? (
¡Compatible! Tu material puede ser aceptado. Recuerda ingresar el código 3JQTT5F4 en la app.
) : verdict === false ? (
No compatible. {brand === "other" ? "Solo se aceptan iPhone, Google Pixel y Samsung Galaxy S de la lista." : "Este modelo no producirá material aceptado."} Si tienes dudas, pregúntale a EGO.
) : (

Elige tu marca y modelo para saber si tu material será aceptado.

)}
); } /* ---------- Lista previa a la sesión ---------- */ function PreflightChecklist() { const items = window.GUIDE.checklist; const KEY = "ego-checklist-v1"; const [done, setDone] = useState(() => { try { return JSON.parse(localStorage.getItem(KEY)) || []; } catch (e) { return []; } }); useEffect(() => { localStorage.setItem(KEY, JSON.stringify(done)); }, [done]); const toggle = (i) => setDone(done.includes(i) ? done.filter((x) => x !== i) : [...done, i]); const pct = Math.round((done.length / items.length) * 100); return (
{done.length}/{items.length}
{pct === 100 ? (
Todo listo. Dos minutos de revisión protegen toda tu sesión. ¡A grabar!
) : (
Repasa esta lista antes de cada sesión — el material rechazado no se paga.
)}
); } /* ---------- Mini quiz ---------- */ function MiniQuiz() { const qs = window.GUIDE.quiz; const [i, setI] = useState(0); const [answer, setAnswer] = useState(null); // true/false elegido const [score, setScore] = useState(0); const [finished, setFinished] = useState(false); const q = qs[i]; const pick = (val) => { if (answer !== null) return; setAnswer(val); if (val === q.ok) setScore(score + 1); }; const next = () => { if (i + 1 >= qs.length) { setFinished(true); return; } setI(i + 1); setAnswer(null); }; const restart = () => { setI(0); setAnswer(null); setScore(0); setFinished(false); }; if (finished) { return (
{score}/{qs.length}

{score === qs.length ? "Perfecto. Ya piensas como un revisor — tu material va por buen camino." : score >= qs.length - 2 ? "¡Muy bien! Repasa las que fallaste y estarás listo." : "Buen intento. Vuelve a leer \u201cSí y No\u201d y \u201cQué se rechaza\u201d, e inténtalo de nuevo."}

); } return (
Escenario {i + 1} de {qs.length}

{q.q}

{answer !== null ? (
{answer === q.ok ? "¡Correcto!" : "No exactamente."} {q.why}
) : null}
); } /* ---------- FAQ ---------- */ function FaqList() { const [open, setOpen] = useState(0); return (
{window.GUIDE.faqs.map((f, i) => (
{open === i ?

{f.a}

: null}
))}
); } Object.assign(window, { StrapWalkthrough, PhoneChecker, PreflightChecklist, MiniQuiz, FaqList });