PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.7
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.7
2.0.13 2.0.12 2.0.11 2.0.10 2.0.9 trunk 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8
blockenberg / blocks / newsletter / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.7, at blocks/newsletter/frontend.js

86 lines 3.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 'use strict';
3
4 function initNewsletter(wrapper) {
5 var form = wrapper.querySelector('.bkbg-nl-form');
6 var btn = wrapper.querySelector('.bkbg-nl-btn');
7 var status = wrapper.querySelector('.bkbg-nl-status');
8 if (!form || !btn || !status) return;
9
10 var successMsg = wrapper.dataset.success || '🎉 You\'re subscribed!';
11 var errorMsg = wrapper.dataset.error || 'Please enter a valid email address.';
12
13 var endpoint = (window.wpApiSettings && window.wpApiSettings.root)
14 ? window.wpApiSettings.root.replace(/\/?$/, '/') + 'blockenberg/v1/subscribe'
15 : '/wp-json/blockenberg/v1/subscribe';
16
17 function showStatus(msg, type) {
18 status.textContent = msg;
19 status.className = 'bkbg-nl-status bkbg-nl-' + type;
20 }
21
22 function clearStatus() {
23 status.className = 'bkbg-nl-status';
24 status.textContent = '';
25 }
26
27 function setLoading(active) {
28 btn.disabled = active;
29 btn.classList.toggle('is-loading', active);
30 }
31
32 form.addEventListener('submit', function (e) {
33 e.preventDefault();
34 clearStatus();
35
36 var emailField = form.querySelector('[name="email"]');
37 var nameField = form.querySelector('[name="name"]');
38 var websiteField = form.querySelector('[name="website"]'); // honeypot
39
40 var email = emailField ? emailField.value.trim() : '';
41 var name = nameField ? nameField.value.trim() : '';
42 var website = websiteField ? websiteField.value.trim() : '';
43
44 if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
45 showStatus(errorMsg, 'error');
46 return;
47 }
48
49 setLoading(true);
50
51 fetch(endpoint, {
52 method : 'POST',
53 headers: { 'Content-Type': 'application/json' },
54 body : JSON.stringify({ email: email, name: name, website: website })
55 })
56 .then(function (res) {
57 return res.json().then(function (body) { return { ok: res.ok, body: body }; });
58 })
59 .then(function (result) {
60 setLoading(false);
61 if (result.ok && result.body && result.body.ok) {
62 showStatus(successMsg, 'success');
63 form.reset();
64 } else {
65 var msg = (result.body && result.body.message) ? result.body.message : errorMsg;
66 showStatus(msg, 'error');
67 }
68 })
69 .catch(function () {
70 setLoading(false);
71 showStatus(errorMsg, 'error');
72 });
73 });
74 }
75
76 function init() {
77 document.querySelectorAll('.bkbg-nl-wrapper').forEach(initNewsletter);
78 }
79
80 if (document.readyState === 'loading') {
81 document.addEventListener('DOMContentLoaded', init);
82 } else {
83 init();
84 }
85 })();
86