"use client"; import { Button } from "@workspace/ui/components/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@workspace/ui/components/dialog"; import { Icon } from "@workspace/ui/composed/icon"; import { useTheme } from "next-themes"; import { type RefObject, useEffect, useImperativeHandle, useState, } from "react"; import { useTranslation } from "react-i18next"; import Turnstile, { useTurnstile } from "react-turnstile"; import { useGlobalStore } from "@/stores/global"; export type TurnstileRef = { reset: () => void; }; const CloudFlareTurnstile = function CloudFlareTurnstile({ id, value, onChange, ref, }: { id?: string; value?: null | string; onChange: (value?: string) => void; ref?: RefObject; }) { const { common } = useGlobalStore(); const { verify } = common; const { resolvedTheme } = useTheme(); const { i18n, t } = useTranslation("auth"); const locale = i18n.language; const turnstile = useTurnstile(); const [open, setOpen] = useState(false); const [verified, setVerified] = useState(false); useImperativeHandle( ref, () => ({ reset: () => { setVerified(false); onChange(""); turnstile.reset(); }, }), [turnstile, onChange] ); useEffect(() => { if (value === "") { setVerified(false); turnstile.reset(); } }, [turnstile, value]); const handleOpen = () => { if (verified) return; setOpen(true); }; if (!verify.turnstile_site_key) return null; return ( <> {/* Trigger button */} {/* Turnstile dialog */} { if (!o) setOpen(false); }} open={open} > {t("captcha.turnstile.title", "Security Verification")} { onChange(""); turnstile.reset(); }} onTimeout={() => { onChange(""); turnstile.reset(); }} onVerify={(token) => { setVerified(true); onChange(token); setTimeout(() => setOpen(false), 400); }} sitekey={verify.turnstile_site_key} theme={resolvedTheme as "light" | "dark"} /> ); }; export default CloudFlareTurnstile;