Skip to content

Commit 1fc7a8d

Browse files
authored
Merge pull request #477 from IT-Srbija-Org/fix/optimize-turnstile-captcha-loading
perf: optimize Cloudflare Turnstile CAPTCHA loading on login
2 parents 43f93c5 + 777ed29 commit 1fc7a8d

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

templates/base.html.twig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
<link rel="preconnect" href="https://fonts.googleapis.com">
3838
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
39+
<link rel="preconnect" href="https://challenges.cloudflare.com" crossorigin>
3940
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
4041

4142
<link href="{{ asset('stylesheet/tabler-icons/tabler-icons.min.css') }}" rel="stylesheet" type="text/css"/>

templates/captcha.html.twig

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,46 @@
11
{% if show_captcha() %}
22
<div>
33
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" defer></script>
4-
<div class="cf-turnstile" data-sitekey="{{ CLOUDFLARE_TURNSTILE_SITEKEY }}" data-theme="light"></div>
4+
<div class="cf-turnstile"
5+
data-sitekey="{{ CLOUDFLARE_TURNSTILE_SITEKEY }}"
6+
data-theme="light"
7+
data-appearance="interaction-only"
8+
data-retry="auto"
9+
data-callback="onTurnstileSuccess"
10+
></div>
511
</div>
12+
13+
<script>
14+
var turnstileReady = false;
15+
var pendingForm = null;
16+
17+
function onTurnstileSuccess(token) {
18+
turnstileReady = true;
19+
if (pendingForm) {
20+
pendingForm.submit();
21+
}
22+
}
23+
24+
document.addEventListener('DOMContentLoaded', function () {
25+
var widget = document.querySelector('.cf-turnstile');
26+
if (!widget) return;
27+
28+
var form = widget.closest('form');
29+
if (!form) return;
30+
31+
form.addEventListener('submit', function (e) {
32+
if (turnstileReady) return;
33+
34+
e.preventDefault();
35+
pendingForm = form;
36+
37+
var btn = form.querySelector('[type="submit"]');
38+
if (btn) {
39+
btn.disabled = true;
40+
btn.dataset.originalText = btn.textContent;
41+
btn.textContent = 'Molimo sačekajte...';
42+
}
43+
});
44+
});
45+
</script>
646
{% endif %}

0 commit comments

Comments
 (0)