Redirecionando...
<script>
(function(){
// === PATHS ===
const PATH_GENERATOR = "/pages/gerador-de-token";
const PATH_UPSELL = "/pages/pos-compra-exclusivo"; // "upsell"
const PATH_COMUNIDADE = "/pages/pos-compra-exclusivo";
// Rode SOMENTE na página geradora
if (location.pathname.replace(/\/+$/,'') !== PATH_GENERATOR) return;
// --- helper: mostra mensagem e redireciona ---
function redirectWithMessage(url){
const add = () => {
try {
const el = document.createElement('div');
el.textContent = "Redirecionando...";
el.setAttribute('aria-live','polite');
el.style.cssText = "position:fixed;inset:0;display:flex;align-items:center;justify-content:center;font-family:Montserrat,Arial,sans-serif;font-weight:600;font-size:18px;color:#111;background:rgba(255,255,255,.92);z-index:2147483647;pointer-events:none;";
document.body.appendChild(el);
} catch(_) {}
};
if (document.body) add();
else {
const onReady = () => {
if (document.readyState !== 'loading') {
document.removeEventListener('readystatechange', onReady);
add();
}
};
document.addEventListener('readystatechange', onReady);
}
setTimeout(() => { location.replace(url); }, 100);
}
// === TZ helpers (sem parse frágil de string) ===
const TZ = "America/Sao_Paulo";
const BRT_UTC_HOUR = 3; // 00:00 SP ~= 03:00 UTC (sem DST)
function nowPartsTZ(){
const p = new Intl.DateTimeFormat('en-US',{
timeZone: TZ, year:'numeric', month:'2-digit', day:'2-digit',
hour:'2-digit', minute:'2-digit', second:'2-digit', hour12:false
}).formatToParts(new Date()).reduce((a,b)=>(a[b.type]=b.value, a),{});
return { year:+p.year, month:+p.month, day:+p.day, hour:+p.hour, minute:+p.minute };
}
function weekdayIndexTZ(){
const map = {Sun:0, Mon:1, Tue:2, Wed:3, Thu:4, Fri:5, Sat:6};
return map[new Intl.DateTimeFormat('en-US',{ timeZone: TZ, weekday:'short'}).format(new Date())];
}
function dentroDaJanela(day, hour, minute){
const minutesToday = hour*60 + minute;
const startMin = 11*60; // 11:00
if (day >= 1 && day <= 4) return minutesToday >= startMin; // Seg–Qui 10:30–23:59
if (day === 5) return minutesToday >= startMin; // Sex 10:30 em diante
if (day === 6 || day === 0) return true; // Sáb/Dom liberado
return false;
}
// Leitura de token e estados
function lerToken(){
try { return JSON.parse(localStorage.getItem("acessoToken") || "{}"); }
catch { return {}; }
}
function tokenValido(tok){ return !!tok.validade && Date.now() <= +tok.validade; }
function tokenExpirado(tok){ return !!tok.validade && Date.now() > +tok.validade; }
// Verifica se há lock ativo (trava pós-expiração de 20 dias)
function lockAtivo(tok){
return !!tok.lockUntil && Date.now() <= +tok.lockUntil;
}
// Calcula validade (próx. 00:00 SP, ou 2ª 00:00 se sexta)
function calcValidadeTs(parts, day){
const addDays = (day === 5) ? 3 : 1;
return Date.UTC(parts.year, parts.month-1, parts.day + addDays, BRT_UTC_HOUR, 0, 0);
}
const parts = nowPartsTZ();
const day = weekdayIndexTZ();
const tok = lerToken();
// --- NOVA REGRA SOLICITADA ---
if (tokenValido(tok)) {
// Tem token válido -> manda direto para o upsell
redirectWithMessage(PATH_UPSELL);
return;
}
if (tokenExpirado(tok)) {
// Tem token, mas expirado -> vai para a comunidade
redirectWithMessage(PATH_COMUNIDADE);
return;
}
// --- Fluxo original de geração (sem token OU expirado porém fora do lock de 20 dias) ---
if (lockAtivo(tok)) {
// Travado: não gera novo token durante o período de lock
redirectWithMessage(PATH_COMUNIDADE);
return;
}
if (!dentroDaJanela(day, parts.hour, parts.minute)) {
// Fora do horário: sem geração
redirectWithMessage(PATH_COMUNIDADE);
return;
}
// No horário e sem lock -> gera token e define nova janela de lock (+20 dias após expiração)
const validade = calcValidadeTs(parts, day);
const lockUntil = Date.UTC(parts.year, parts.month-1, parts.day + ((day===5)?3:1) + 20, BRT_UTC_HOUR, 0, 0); // expira + 20 dias
try {
localStorage.setItem("acessoToken", JSON.stringify({
timestamp: Date.now(),
validade,
lockUntil
}));
} catch(_) { /* se storage falhar, o acesso não persistirá */ }
// Vai para o upsell
redirectWithMessage(PATH_UPSELL);
})();
</script>