import { useEffect, useRef } from 'react' declare global { interface Window { turnstile?: { render: (element: HTMLElement, options: Record) => void } } } interface TurnstileProps { siteKey: string onVerify: (token: string) => void onExpire?: () => void className?: string } export function Turnstile({ siteKey, onVerify, onExpire, className, }: TurnstileProps) { const ref = useRef(null) useEffect(() => { const render = () => { if (!ref.current || !window.turnstile) return try { window.turnstile.render(ref.current, { sitekey: siteKey, callback: (token: string) => onVerify(token), 'error-callback': () => onExpire?.(), 'expired-callback': () => onExpire?.(), }) } catch { /* empty */ } } if (window.turnstile) { render() return } const scriptId = 'cf-turnstile' if (document.getElementById(scriptId)) return const s = document.createElement('script') s.id = scriptId s.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit' s.async = true s.defer = true s.onload = () => render() document.head.appendChild(s) }, [siteKey, onVerify, onExpire]) return
}