Skip to content

Commit 96594de

Browse files
committed
move turnstile script tag to component
1 parent a77001a commit 96594de

2 files changed

Lines changed: 17 additions & 10 deletions

File tree

src/app.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66
<meta name="color-scheme" content="dark" />
77
<link rel="icon" href="%sveltekit.assets%/favicon.ico" />
88
%sveltekit.head%
9-
<script
10-
src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"
11-
defer
12-
></script>
139
</head>
1410
<body data-sveltekit-preload-data="hover">
1511
<div style="display: contents">%sveltekit.body%</div>

src/lib/components/Turnstile.svelte

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import Bug from '@lucide/svelte/icons/bug';
3-
import { dev } from '$app/environment';
3+
import { browser, dev } from '$app/environment';
44
import { PUBLIC_TURNSTILE_DEV_BYPASS_VALUE, PUBLIC_TURNSTILE_SITE_KEY } from '$env/static/public';
55
import CloudflareLogo from '$lib/components/svg/CloudflareLogo.svelte';
66
import LoadingCircle from '$lib/components/svg/LoadingCircle.svelte';
@@ -58,16 +58,18 @@
5858
5959
onMount(() => {
6060
if (dev) {
61-
console.log('Turnstile is disabled in dev mode');
62-
toast.warning('Turnstile is disabled in dev mode');
6361
response = PUBLIC_TURNSTILE_DEV_BYPASS_VALUE;
6462
return;
6563
}
6664
67-
// If turstile doesnt load, then the index.html is proabably missing the script tag (https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#explicitly-render-the-turnstile-widget)
65+
// Check that Cloudflare Turnstile has been loaded.
66+
// If `window.turnstile` is undefined, it usually means the <script> tag wasn't injected.
67+
// If this error occured under a page that wasnt server-side rendered or prerendered then the script tag never got injected into the html served to browser.
68+
// The script tag will need to get moved into the app.html tag if this is the case, but normally Turnstile should only be used in places where a user isnt auth, places that are pre-renderable.
69+
// See: https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#explicitly-render-the-turnstile-widget
6870
if (!window.turnstile) {
69-
console.error('Failed to load Cloudflare Turnstile resource!');
70-
toast.error('Failed to load Cloudflare Turnstile resource!');
71+
console.error('Failed to load Cloudflare Turnstile (Check Turnstile.svelte for more info)');
72+
toast.error('Internal Error');
7173
return;
7274
}
7375
@@ -79,6 +81,15 @@
7981
});
8082
</script>
8183

84+
<svelte:head>
85+
{#if !browser && !dev}
86+
<script
87+
src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"
88+
defer
89+
></script>
90+
{/if}
91+
</svelte:head>
92+
8293
<!-- see: https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#widget-size -->
8394
<div class="mx-auto h-[65px] w-[300px]" bind:this={element}>
8495
{#if !mounted}

0 commit comments

Comments
 (0)