Files
ipal-kit/dist/modules/turnstile/TurnstileProvider.js
T

66 lines
2.3 KiB
JavaScript

'use client';
import { jsx as _jsx } from "react/jsx-runtime";
import { createContext, useCallback, useContext, useState } from 'react';
import { Turnstile } from './Turnstile.js';
const TurnstileContext = /*#__PURE__*/ createContext(null);
/**
* Provides the Turnstile site key once for the whole app, like ConsentProvider
* for cookies. The project reads the key server-side and passes it here in the
* layout; forms then use <TurnstileWidget /> + useTurnstile() with NO per-form
* key wiring.
*
* // layout.tsx (server) → read key, pass to provider
* import { TurnstileProvider } from '@intecion/ipal-kit/client'
* const siteKey = await getTurnstileSiteKey() // your server helper
* <TurnstileProvider siteKey={siteKey}>{children}</TurnstileProvider>
*
* When siteKey is null (Turnstile not configured), widgets render nothing and
* token stays null — forms should treat "no Turnstile" as allowed in dev.
*/ export function TurnstileProvider({ siteKey, children }) {
const [token, setToken] = useState(null);
return /*#__PURE__*/ _jsx(TurnstileContext.Provider, {
value: {
siteKey,
token,
setToken
},
children: children
});
}
/**
* Hook giving a form the Turnstile token + a widget bound to the provider's key.
* No per-form siteKey plumbing — the provider supplies it.
*
* const { token, TurnstileWidget, reset } = useTurnstile()
* // in JSX: <TurnstileWidget />
* // at submit: submitForm({ ..., turnstileToken: token })
* // after submit: reset() // clear for the next submission
*/ export function useTurnstile() {
const ctx = useContext(TurnstileContext);
if (!ctx) {
throw new Error('useTurnstile must be used within <TurnstileProvider>');
}
const { siteKey, token, setToken } = ctx;
const reset = useCallback(()=>setToken(null), [
setToken
]);
const TurnstileWidget = useCallback((props)=>{
if (!siteKey) return null;
return /*#__PURE__*/ _jsx(Turnstile, {
siteKey: siteKey,
onToken: setToken,
theme: props?.theme
});
}, [
siteKey,
setToken
]);
return {
token,
TurnstileWidget,
reset,
enabled: Boolean(siteKey)
};
}
//# sourceMappingURL=TurnstileProvider.js.map