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 ;