// CENTRAL DA MARCA — Mariana Cabral · Camada de nuvem (Supabase). // Sincroniza TODO o estado (ideias, aprovações, campanha, captações, notas…) com uma // tabela do Supabase, para que os dados persistam de verdade e sincronizem entre // dispositivos. Se não houver configuração, cai no localStorage — nada se perde. // Exporta window.MC_CLOUD (function () { const cfg = window.MC_CONFIG || {}; const URL = (cfg.supabaseUrl || "").replace(/\/+$/, ""); const KEY = cfg.supabaseKey || ""; const ID = cfg.recordId || "mariana-cabral"; const TABLE = cfg.table || "mc_estado"; const enabled = !!(URL && KEY); let status = enabled ? "conectando" : "local"; // local | conectando | ok | salvando | erro const listeners = new Set(); function setStatus(s) { status = s; listeners.forEach((f) => f(s)); } function endpoint(q) { return URL + "/rest/v1/" + TABLE + (q || ""); } function headers(extra) { return Object.assign({ apikey: KEY, Authorization: "Bearer " + KEY, "Content-Type": "application/json" }, extra || {}); } // Busca o estado salvo na nuvem (ou null). async function pull() { if (!enabled) return null; setStatus("conectando"); try { const r = await fetch(endpoint("?id=eq." + encodeURIComponent(ID) + "&select=dados"), { headers: headers() }); if (!r.ok) throw new Error("HTTP " + r.status); const rows = await r.json(); setStatus("ok"); return rows && rows[0] ? rows[0].dados : null; } catch (e) { setStatus("erro"); return null; } } // Salva o estado na nuvem (upsert). Debounce para não bater a cada tecla. let timer = null, pending = null; function push(state) { if (!enabled) return; pending = state; setStatus("salvando"); clearTimeout(timer); timer = setTimeout(flush, 700); } async function flush() { if (!enabled || !pending) return; const body = JSON.stringify([{ id: ID, dados: pending, atualizado_em: new Date().toISOString() }]); pending = null; try { const r = await fetch(endpoint("?on_conflict=id"), { method: "POST", headers: headers({ Prefer: "resolution=merge-duplicates,return=minimal" }), body, }); if (!r.ok) throw new Error("HTTP " + r.status); setStatus("ok"); } catch (e) { setStatus("erro"); } } window.MC_CLOUD = { enabled: () => enabled, configured: () => enabled, pull, push, status: () => status, onStatus: (fn) => { listeners.add(fn); fn(status); return () => listeners.delete(fn); }, }; })();