analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
73 lines (72 loc) • 2.13 kB
JavaScript
// src/hooks/useZendesk.ts
import { useCallback, useEffect, useState } from "react";
var SCRIPT_ID = "ze-snippet";
var INITIAL_RETRY_MS = 2e3;
var MAX_RETRY_MS = 3e4;
var POLL_MS = 500;
var getZE = () => globalThis.zE;
var useZendesk = ({
zendeskKey,
enabled = true
}) => {
const [ready, setReady] = useState(false);
useEffect(() => {
if (!enabled || !zendeskKey) return;
let cancelled = false;
let attempt = 0;
let retryTimer;
let pollTimer;
function confirmReady() {
const zE = getZE();
if (!zE) return false;
zE("messenger:set", "locale", "pt-BR");
if (!cancelled) setReady(true);
return true;
}
function scheduleRetry() {
if (cancelled) return;
const delay = Math.min(INITIAL_RETRY_MS * 2 ** attempt, MAX_RETRY_MS);
attempt += 1;
retryTimer = setTimeout(inject, delay);
}
function handleScriptError() {
if (cancelled) return;
document.getElementById(SCRIPT_ID)?.remove();
scheduleRetry();
}
function inject() {
if (cancelled || confirmReady()) return;
const existing = document.getElementById(
SCRIPT_ID
);
if (existing) {
existing.addEventListener("error", handleScriptError, { once: true });
return;
}
const script = document.createElement("script");
script.id = SCRIPT_ID;
script.src = `https://static.zdassets.com/ekr/snippet.js?key=${zendeskKey}`;
script.async = true;
script.addEventListener("error", handleScriptError, { once: true });
document.body.appendChild(script);
}
inject();
pollTimer = setInterval(() => {
if (cancelled) return;
if (confirmReady() && pollTimer) clearInterval(pollTimer);
}, POLL_MS);
return () => {
cancelled = true;
if (retryTimer) clearTimeout(retryTimer);
if (pollTimer) clearInterval(pollTimer);
};
}, [zendeskKey, enabled]);
const openChat = useCallback(() => {
getZE()?.("messenger", "open");
}, []);
return { ready, openChat };
};
export {
useZendesk
};
//# sourceMappingURL=chunk-UTNSYDKE.mjs.map