// ESTÚDIO — Camada de nuvem (Supabase). Exporta window.ESTUDIO_CLOUD. // Sincroniza o estado (produção, pautas, hábitos, clientes, CRM…) com uma // tabela do Supabase para persistir de verdade e sincronizar entre aparelhos. // Cada "canal" (ex: "lorenna-estudio", "lorenna-logue") é uma linha da tabela. // Sem configuração (window.ESTUDIO_CONFIG ausente), fica inerte: tudo continua // salvo no navegador (localStorage) e nada quebra. (function () { const cfg = window.ESTUDIO_CONFIG || {}; const URL = (cfg.supabaseUrl || "").replace(/\/+$/, ""); const KEY = cfg.supabaseKey || ""; const TABLE = cfg.table || "mc_estado"; // reaproveita a tabela já existente const enabled = !!(URL && KEY); 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 para um canal (ou null). async function pull(recordId) { if (!enabled) return null; try { const r = await fetch(endpoint("?id=eq." + encodeURIComponent(recordId) + "&select=dados"), { headers: headers() }); if (!r.ok) throw new Error("HTTP " + r.status); const rows = await r.json(); return rows && rows[0] ? rows[0].dados : null; } catch (e) { return null; } } // Salva o estado na nuvem (upsert), com debounce por canal. const timers = {}, pending = {}; function push(recordId, state) { if (!enabled) return; pending[recordId] = state; clearTimeout(timers[recordId]); timers[recordId] = setTimeout(() => flush(recordId), 700); } async function flush(recordId) { if (!enabled || !pending[recordId]) return; const body = JSON.stringify([{ id: recordId, dados: pending[recordId], atualizado_em: new Date().toISOString() }]); pending[recordId] = null; try { await fetch(endpoint("?on_conflict=id"), { method: "POST", headers: headers({ Prefer: "resolution=merge-duplicates,return=minimal" }), body, }); } catch (e) {} } window.ESTUDIO_CLOUD = { enabled: () => enabled, pull, push }; })();