feat: keep the Tiny connection alive and show when it is not
All checks were successful
Build and deploy / Validate source (push) Successful in 8s
Build and deploy / Integration suite on a real stack (push) Successful in 2m29s
Build and deploy / Secret scan and release gate (push) Successful in 7s
Build and deploy / Publish images (push) Successful in 1m49s
All checks were successful
Build and deploy / Validate source (push) Successful in 8s
Build and deploy / Integration suite on a real stack (push) Successful in 2m29s
Build and deploy / Secret scan and release gate (push) Successful in 7s
Build and deploy / Publish images (push) Successful in 1m49s
Connecting now asks for offline_access, retrying once without it if Tiny refuses the scope. Renewal failures are stored: a refused refresh token marks the connection lost and is not sent again (the Kanban previously still said "conectado"), a transient failure shows as a warning until the next renewal, and a session grant with under 12 hours left is flagged. Tiny errors on the callback return to the Kanban instead of a 422. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -483,8 +483,21 @@ if(tinyResult)history.replaceState(null,'',location.pathname);
|
||||
function tinyHeader(){
|
||||
const t=board.tiny||{};const el=$('tiny');
|
||||
if(!t.configured){el.textContent='';return;}
|
||||
el.textContent=t.connected?'Tiny conectado':'Tiny não conectado';
|
||||
el.style.setProperty('--dot',t.connected?'var(--fin)':'var(--warn)');
|
||||
const trouble=!t.connected||t.problem;
|
||||
el.textContent=!t.connected?'Tiny não conectado':t.problem?'Tiny: verificar conexão':'Tiny conectado';
|
||||
el.style.setProperty('--dot',trouble?'var(--warn)':'var(--fin)');
|
||||
}
|
||||
const TINY_PROBLEMS={refused:'O Tiny recusou a renovação da conexão. Conecte de novo.',
|
||||
expired:'A conexão com o Tiny expirou. Conecte de novo.',
|
||||
'renewal-failing':'A última renovação falhou; o sistema tenta de novo sozinho.',
|
||||
expiring:'A conexão expira em breve e não está sendo renovada.'};
|
||||
function tinyDetail(t){
|
||||
if(!t.connected_by)return 'Conecte com uma conta do Tiny.';
|
||||
const parts=[t.connected_by+' · conectado em '+when(t.connected_at),'renovado em '+when(t.renewed_at),
|
||||
t.offline?'sem expiração diária':t.expires_at?'válido até '+when(t.expires_at):'',
|
||||
'envio de pedidos '+(t.orders_enabled?'ativo':'desativado')].filter(Boolean);
|
||||
const problem=TINY_PROBLEMS[t.problem];
|
||||
return (problem?problem+(t.failed_at&&t.problem!=='expired'?' (falha em '+when(t.failed_at)+')':'')+' · ':'')+parts.join(' · ');
|
||||
}
|
||||
function integration(name,state,tone,text,actions=[]){
|
||||
const box=node('div',undefined,'integration');
|
||||
@@ -633,9 +646,8 @@ function renderIntegrations(){
|
||||
if(t.connected){
|
||||
actions.unshift(button('Testar conexão',async()=>{const r=await api('/tiny/test',{});
|
||||
say(r.ok?'Conexão com o Tiny ok: pedidos, contatos e os 4 produtos conferidos.':'Tiny: '+Object.entries(r.results).filter(([,v])=>v!=='ok').map(([k,v])=>k+': '+v).join(' · '),!r.ok);}));}
|
||||
cards.push(integration('Tiny',t.connected?'Conectado':'Não conectado',t.connected?'ok':'warn',
|
||||
t.connected?t.connected_by+' · '+when(t.connected_at)+' · envio de pedidos '+(t.orders_enabled?'ativo':'desativado'):
|
||||
'Conecte com uma conta do Tiny.',actions));
|
||||
cards.push(integration('Tiny',!t.connected?'Não conectado':t.problem?'Verificar':'Conectado',
|
||||
t.connected&&!t.problem?'ok':'warn',tinyDetail(t),actions));
|
||||
}
|
||||
const mp=board.providers?.payment;
|
||||
cards.push(integration('Mercado Pago',mp==='mercadopago'?'Ativo':'Não configurado',mp==='mercadopago'?'ok':'off',
|
||||
|
||||
Reference in New Issue
Block a user