import { useCallback, useEffect, useRef, useState } from "react";
const SCRIPT_SRC = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
type TurnstileApi = {
render: (
element: HTMLElement,
options: {
sitekey: string;
action: string;
theme?: "light" | "dark" | "auto";
callback: (token: string) => void;
"expired-callback": () => void;
"error-callback": () => void;
},
) => string;
reset: (widgetId: string) => void;
remove: (widgetId: string) => void;
};
declare global {
interface Window {
turnstile?: TurnstileApi;
}
}
let loader: Promise<TurnstileApi> | null = null;
function loadTurnstile(): Promise<TurnstileApi> {
if (window.turnstile) return Promise.resolve(window.turnstile);
loader ??= new Promise((resolve, reject) => {
const script = document.createElement("script");
script.src = SCRIPT_SRC;
script.async = true;
script.defer = true;
script.onload = () =>
window.turnstile ? resolve(window.turnstile) : reject(new Error("Turnstile failed to load"));
script.onerror = () => {
loader = null;
reject(new Error("Turnstile failed to load"));