diff --git a/app/create/page.test.tsx b/app/create/page.test.tsx index e43078d..1fbbe13 100644 --- a/app/create/page.test.tsx +++ b/app/create/page.test.tsx @@ -162,7 +162,7 @@ describe("CreateGistPage", () => { render(); const pinInput = screen.getByPlaceholderText( - "Set a PIN to protect edits" + "Leave empty for no protection" ); expect(pinInput).toBeInTheDocument(); diff --git a/app/create/page.tsx b/app/create/page.tsx index a7f5f29..b26a3d3 100644 --- a/app/create/page.tsx +++ b/app/create/page.tsx @@ -72,14 +72,6 @@ export default function CreateGistPage() { setIsTurnstileReady(false); }, []); - const handleTurnstileExpire = useCallback(() => { - setTurnstileToken(null); - setIsTurnstileReady(false); - setError( - "⏰ Security verification expired. Please refresh the page to continue." - ); - }, []); - const handleFilesChange = useCallback((newFiles: FileData[]) => { setFiles(newFiles); // Don't clear errors on file change - let them persist @@ -391,9 +383,9 @@ export default function CreateGistPage() { )} diff --git a/components/ui/turnstile.tsx b/components/ui/turnstile.tsx index 9f3ba82..c073e1f 100644 --- a/components/ui/turnstile.tsx +++ b/components/ui/turnstile.tsx @@ -7,12 +7,15 @@ interface TurnstileProps { onSuccess?: (token: string) => void; onExpire?: () => void; onError?: () => void; + onTimeout?: () => void; theme?: "light" | "dark" | "auto"; action?: string; size?: "normal" | "flexible" | "compact"; appearance?: "always" | "execute" | "interaction-only"; execution?: "render" | "execute"; language?: string; + refreshExpired?: "auto" | "manual" | "never"; + refreshTimeout?: "auto" | "manual" | "never"; } declare global { @@ -25,12 +28,15 @@ declare global { callback?: (token: string) => void; "error-callback"?: () => void; "expired-callback"?: () => void; + "timeout-callback"?: () => void; theme?: "light" | "dark" | "auto"; action?: string; size?: "normal" | "flexible" | "compact"; appearance?: "always" | "execute" | "interaction-only"; execution?: "render" | "execute"; language?: string; + "refresh-expired"?: "auto" | "manual" | "never"; + "refresh-timeout"?: "auto" | "manual" | "never"; } ) => string; reset: (widgetId: string) => void; @@ -46,12 +52,15 @@ const Turnstile: React.FC = ({ onSuccess, onExpire, onError, + onTimeout, theme = "auto", action, size = "normal", appearance = "interaction-only", execution = "render", language = "auto", + refreshExpired = "auto", + refreshTimeout = "auto", }) => { const containerRef = useRef(null); const widgetIdRef = useRef(null); @@ -67,9 +76,12 @@ const Turnstile: React.FC = ({ appearance, execution, language, + "refresh-expired": refreshExpired, + "refresh-timeout": refreshTimeout, callback: onSuccess, "error-callback": onError, "expired-callback": onExpire, + "timeout-callback": onTimeout, }); } }; @@ -110,12 +122,15 @@ const Turnstile: React.FC = ({ onSuccess, onError, onExpire, + onTimeout, theme, action, size, appearance, execution, language, + refreshExpired, + refreshTimeout, ]); return
;