const SCRIPT_URL = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';
let loadPromise = null;
function loadTurnstile() {
if (loadPromise) return loadPromise;
loadPromise = new Promise((resolve, reject) => {
if (window.turnstile) return resolve(window.turnstile);
const s = document.createElement('script');
s.src = SCRIPT_URL;
s.async = true;
s.defer = true;
s.onload = () => (window.turnstile ? resolve(window.turnstile) : reject(new Error('turnstile failed to initialise')));
s.onerror = () => reject(new Error('could not load turnstile'));
document.head.appendChild(s);
});
return loadPromise;
}
export async function renderTurnstile(container, sitekey, onToken) {
const turnstile = await loadTurnstile();
const id = turnstile.render(container, {
sitekey,
action: 'turnstile-spin-v2',
theme: 'auto',
callback: (token) => onToken(token),
'expired-callback': () => onToken(null),
'error-callback': () => onToken(null),
});
return {
reset: () => {
try {
turnstile.reset(id);
} catch {
}
},
};
}