ultimate-jekyll-manager 0.0.118 → 0.0.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +409 -23
- package/README.md +171 -2
- package/TODO.md +10 -2
- package/_backup/form-manager.backup.js +1020 -0
- package/dist/assets/js/core/auth.js +5 -4
- package/dist/assets/js/core/cookieconsent.js +24 -17
- package/dist/assets/js/core/exit-popup.js +15 -12
- package/dist/assets/js/core/social-sharing.js +8 -4
- package/dist/assets/js/libs/auth/pages.js +78 -149
- package/dist/assets/js/libs/dev.js +192 -129
- package/dist/assets/js/libs/form-manager.js +643 -775
- package/dist/assets/js/pages/account/index.js +3 -2
- package/dist/assets/js/pages/account/sections/api-keys.js +37 -52
- package/dist/assets/js/pages/account/sections/connections.js +37 -46
- package/dist/assets/js/pages/account/sections/delete.js +57 -78
- package/dist/assets/js/pages/account/sections/profile.js +37 -56
- package/dist/assets/js/pages/account/sections/security.js +102 -125
- package/dist/assets/js/pages/admin/notifications/new/index.js +73 -151
- package/dist/assets/js/pages/blog/index.js +33 -53
- package/dist/assets/js/pages/contact/index.js +112 -173
- package/dist/assets/js/pages/download/index.js +39 -86
- package/dist/assets/js/pages/oauth2/index.js +17 -17
- package/dist/assets/js/pages/payment/checkout/index.js +23 -36
- package/dist/assets/js/pages/pricing/index.js +5 -2
- package/dist/assets/js/pages/test/libraries/form-manager/index.js +194 -0
- package/dist/assets/themes/classy/css/components/_cards.scss +2 -2
- package/dist/defaults/_.env +6 -0
- package/dist/defaults/_.gitignore +7 -1
- package/dist/defaults/dist/_includes/core/body.html +5 -13
- package/dist/defaults/dist/_includes/core/foot.html +1 -0
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +51 -36
- package/dist/defaults/dist/_layouts/blueprint/admin/notifications/new.html +13 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/about.html +84 -42
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +26 -21
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/index.html +72 -58
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/post.html +46 -29
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/contact.html +46 -53
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/download.html +111 -73
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +111 -56
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +127 -81
- package/dist/defaults/dist/pages/test/libraries/form-manager.html +181 -0
- package/dist/defaults/dist/pages/test/libraries/lazy-loading.html +1 -1
- package/dist/gulp/tasks/defaults.js +210 -1
- package/dist/gulp/tasks/serve.js +18 -0
- package/dist/lib/logger.js +1 -1
- package/firebase-debug.log +770 -0
- package/package.json +6 -6
- package/.playwright-mcp/page-2025-10-22T19-11-27-666Z.png +0 -0
- package/.playwright-mcp/page-2025-10-22T19-11-57-357Z.png +0 -0
|
@@ -32,7 +32,7 @@ export default function (Manager, options) {
|
|
|
32
32
|
console.log('[Auth] state changed:', state);
|
|
33
33
|
|
|
34
34
|
// Set user ID for analytics tracking
|
|
35
|
-
setAnalyticsUserId(user);
|
|
35
|
+
setAnalyticsUserId(user, webManager);
|
|
36
36
|
|
|
37
37
|
// Check if we're in the process of signing out
|
|
38
38
|
if (authSignout === 'true' && user) {
|
|
@@ -119,9 +119,10 @@ function redirect(url, returnUrl) {
|
|
|
119
119
|
window.location.href = newURL;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
function setAnalyticsUserId(user) {
|
|
122
|
+
function setAnalyticsUserId(user, webManager) {
|
|
123
123
|
const userId = user?.uid;
|
|
124
124
|
const email = user?.email;
|
|
125
|
+
const metaPixelId = webManager.config.tracking['meta-pixel'];
|
|
125
126
|
|
|
126
127
|
// Short-circuit if no user
|
|
127
128
|
if (!userId) {
|
|
@@ -129,7 +130,7 @@ function setAnalyticsUserId(user) {
|
|
|
129
130
|
gtag('set', { user_id: null });
|
|
130
131
|
|
|
131
132
|
// Facebook Pixel - Clear advanced matching
|
|
132
|
-
fbq('init',
|
|
133
|
+
fbq('init', metaPixelId, {});
|
|
133
134
|
|
|
134
135
|
// TikTok Pixel - Clear user data
|
|
135
136
|
ttq.identify({});
|
|
@@ -147,7 +148,7 @@ function setAnalyticsUserId(user) {
|
|
|
147
148
|
});
|
|
148
149
|
|
|
149
150
|
// Facebook Pixel - Set advanced matching with user data
|
|
150
|
-
fbq('init',
|
|
151
|
+
fbq('init', metaPixelId, {
|
|
151
152
|
external_id: userId,
|
|
152
153
|
// em: email ? btoa(email.toLowerCase().trim()) : undefined,
|
|
153
154
|
em: email,
|
|
@@ -310,59 +310,66 @@ export default function (Manager, options) {
|
|
|
310
310
|
|
|
311
311
|
// Tracking functions
|
|
312
312
|
function trackCookieBannerShown() {
|
|
313
|
-
gtag('event', '
|
|
313
|
+
gtag('event', 'cookie_banner_show', {
|
|
314
314
|
event_category: 'consent'
|
|
315
315
|
});
|
|
316
|
-
fbq('trackCustom', '
|
|
316
|
+
fbq('trackCustom', 'CookieBannerShow');
|
|
317
317
|
ttq.track('ViewContent', {
|
|
318
|
-
|
|
318
|
+
content_id: 'cookie-banner-show',
|
|
319
|
+
content_type: 'product',
|
|
320
|
+
content_name: 'Cookie Banner Show'
|
|
319
321
|
});
|
|
320
322
|
}
|
|
321
323
|
|
|
322
324
|
function trackCookieAccepted() {
|
|
323
|
-
gtag('event', '
|
|
325
|
+
gtag('event', 'cookie_consent_accept', {
|
|
324
326
|
event_category: 'consent',
|
|
325
327
|
consent_type: config.type
|
|
326
328
|
});
|
|
327
|
-
fbq('trackCustom', '
|
|
329
|
+
fbq('trackCustom', 'CookieConsentAccept');
|
|
328
330
|
ttq.track('ClickButton', {
|
|
329
|
-
|
|
330
|
-
content_type: '
|
|
331
|
+
content_id: 'cookie-consent-accept',
|
|
332
|
+
content_type: 'product',
|
|
333
|
+
content_name: 'Cookie Consent Accept'
|
|
331
334
|
});
|
|
332
335
|
}
|
|
333
336
|
|
|
334
337
|
function trackCookieDenied() {
|
|
335
|
-
gtag('event', '
|
|
338
|
+
gtag('event', 'cookie_consent_deny', {
|
|
336
339
|
event_category: 'consent',
|
|
337
340
|
consent_type: config.type
|
|
338
341
|
});
|
|
339
|
-
fbq('trackCustom', '
|
|
342
|
+
fbq('trackCustom', 'CookieConsentDeny');
|
|
340
343
|
ttq.track('ClickButton', {
|
|
341
|
-
|
|
342
|
-
content_type: '
|
|
344
|
+
content_id: 'cookie-consent-deny',
|
|
345
|
+
content_type: 'product',
|
|
346
|
+
content_name: 'Cookie Consent Deny'
|
|
343
347
|
});
|
|
344
348
|
}
|
|
345
349
|
|
|
346
350
|
function trackCookieAutoAccepted(trigger) {
|
|
347
|
-
gtag('event', '
|
|
351
|
+
gtag('event', 'cookie_consent_auto_accept', {
|
|
348
352
|
event_category: 'consent',
|
|
349
353
|
trigger: trigger
|
|
350
354
|
});
|
|
351
|
-
fbq('trackCustom', '
|
|
355
|
+
fbq('trackCustom', 'CookieConsentAutoAccept', {
|
|
352
356
|
trigger: trigger
|
|
353
357
|
});
|
|
354
358
|
ttq.track('ViewContent', {
|
|
355
|
-
|
|
356
|
-
content_type:
|
|
359
|
+
content_id: 'cookie-consent-auto-accept',
|
|
360
|
+
content_type: 'product',
|
|
361
|
+
content_name: 'Cookie Consent Auto Accept'
|
|
357
362
|
});
|
|
358
363
|
}
|
|
359
364
|
|
|
360
365
|
function trackCookiePolicyReopened() {
|
|
361
|
-
gtag('event', '
|
|
366
|
+
gtag('event', 'cookie_policy_reopen', {
|
|
362
367
|
event_category: 'consent'
|
|
363
368
|
});
|
|
364
|
-
fbq('trackCustom', '
|
|
369
|
+
fbq('trackCustom', 'CookiePolicyReopen');
|
|
365
370
|
ttq.track('ClickButton', {
|
|
371
|
+
content_id: 'cookie-policy-reopen',
|
|
372
|
+
content_type: 'product',
|
|
366
373
|
content_name: 'Cookie Policy Reopen'
|
|
367
374
|
});
|
|
368
375
|
}
|
|
@@ -177,20 +177,21 @@ export default function (Manager, options) {
|
|
|
177
177
|
|
|
178
178
|
// Tracking functions
|
|
179
179
|
function trackExitPopupShown() {
|
|
180
|
-
gtag('event', '
|
|
180
|
+
gtag('event', 'exit_popup_show', {
|
|
181
181
|
event_category: 'engagement',
|
|
182
182
|
event_label: config.title,
|
|
183
183
|
page_path: window.location.pathname
|
|
184
184
|
});
|
|
185
185
|
|
|
186
|
-
fbq('trackCustom', '
|
|
187
|
-
content_name:
|
|
186
|
+
fbq('trackCustom', 'ExitPopupShow', {
|
|
187
|
+
content_name: 'Exit Popup Show',
|
|
188
188
|
page_path: window.location.pathname
|
|
189
189
|
});
|
|
190
190
|
|
|
191
191
|
ttq.track('ViewContent', {
|
|
192
|
-
|
|
193
|
-
content_type:
|
|
192
|
+
content_id: 'exit-popup-show',
|
|
193
|
+
content_type: 'product',
|
|
194
|
+
content_name: 'Exit Popup Show'
|
|
194
195
|
});
|
|
195
196
|
}
|
|
196
197
|
|
|
@@ -207,24 +208,26 @@ export default function (Manager, options) {
|
|
|
207
208
|
});
|
|
208
209
|
|
|
209
210
|
ttq.track('ClickButton', {
|
|
210
|
-
|
|
211
|
-
content_type:
|
|
211
|
+
content_id: 'exit-popup-click',
|
|
212
|
+
content_type: 'product',
|
|
213
|
+
content_name: 'Exit Popup Click'
|
|
212
214
|
});
|
|
213
215
|
}
|
|
214
216
|
|
|
215
217
|
function trackExitPopupDismissed() {
|
|
216
|
-
gtag('event', '
|
|
218
|
+
gtag('event', 'exit_popup_dismiss', {
|
|
217
219
|
event_category: 'engagement',
|
|
218
220
|
event_label: config.title
|
|
219
221
|
});
|
|
220
222
|
|
|
221
|
-
fbq('trackCustom', '
|
|
222
|
-
content_name:
|
|
223
|
+
fbq('trackCustom', 'ExitPopupDismiss', {
|
|
224
|
+
content_name: 'Exit Popup Dismiss'
|
|
223
225
|
});
|
|
224
226
|
|
|
225
227
|
ttq.track('ViewContent', {
|
|
226
|
-
|
|
227
|
-
content_type:
|
|
228
|
+
content_id: 'exit-popup-dismiss',
|
|
229
|
+
content_type: 'product',
|
|
230
|
+
content_name: 'Exit Popup Dismiss'
|
|
228
231
|
});
|
|
229
232
|
}
|
|
230
233
|
};
|
|
@@ -289,6 +289,8 @@ export default function (Manager, options) {
|
|
|
289
289
|
|
|
290
290
|
// Tracking functions
|
|
291
291
|
function trackShare(platformKey, shareConfig) {
|
|
292
|
+
const platformName = platforms[platformKey]?.name || platformKey;
|
|
293
|
+
|
|
292
294
|
gtag('event', 'share', {
|
|
293
295
|
method: platformKey,
|
|
294
296
|
content_type: 'article',
|
|
@@ -302,9 +304,9 @@ export default function (Manager, options) {
|
|
|
302
304
|
});
|
|
303
305
|
|
|
304
306
|
ttq.track('Share', {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
307
|
+
content_id: `social-share-${platformKey}`,
|
|
308
|
+
content_type: 'product',
|
|
309
|
+
content_name: `Social Share ${platformName}`
|
|
308
310
|
});
|
|
309
311
|
}
|
|
310
312
|
|
|
@@ -319,7 +321,9 @@ export default function (Manager, options) {
|
|
|
319
321
|
});
|
|
320
322
|
|
|
321
323
|
ttq.track('ClickButton', {
|
|
322
|
-
|
|
324
|
+
content_id: 'social-share-copy-link',
|
|
325
|
+
content_type: 'product',
|
|
326
|
+
content_name: 'Social Share Copy Link'
|
|
323
327
|
});
|
|
324
328
|
}
|
|
325
329
|
};
|
|
@@ -9,12 +9,6 @@ export default function (Manager) {
|
|
|
9
9
|
// Form manager instance
|
|
10
10
|
let formManager = null;
|
|
11
11
|
|
|
12
|
-
// Shared FormManager configuration
|
|
13
|
-
const formManagerConfig = {
|
|
14
|
-
allowMultipleSubmissions: false,
|
|
15
|
-
validateOnSubmit: true,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
12
|
// Check query string for popup parameter
|
|
19
13
|
const url = new URL(window.location.href);
|
|
20
14
|
const useAuthPopup = url.searchParams.get('authPopup') === 'true' || window !== window.top;
|
|
@@ -61,125 +55,66 @@ export default function (Manager) {
|
|
|
61
55
|
}
|
|
62
56
|
}
|
|
63
57
|
|
|
64
|
-
//
|
|
65
|
-
function
|
|
66
|
-
|
|
67
|
-
...formManagerConfig,
|
|
68
|
-
submitButtonLoadingText: 'Signing in...'
|
|
69
|
-
});
|
|
58
|
+
// Shared validation for signin/signup forms - only validate when email provider is selected
|
|
59
|
+
function validateEmailProvider({ data, setError, $submitButton }) {
|
|
60
|
+
const provider = $submitButton?.getAttribute('data-provider');
|
|
70
61
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
62
|
+
if (provider === 'email') {
|
|
63
|
+
if (!data.email?.trim()) {
|
|
64
|
+
setError('email', 'Email is required');
|
|
65
|
+
}
|
|
66
|
+
if (!data.password) {
|
|
67
|
+
setError('password', 'Password is required');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
75
71
|
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
// Shared submit handler factory for signin/signup forms
|
|
73
|
+
function createAuthSubmitHandler(action, emailHandler) {
|
|
74
|
+
return async ({ data, $submitButton }) => {
|
|
75
|
+
const provider = $submitButton?.getAttribute('data-provider');
|
|
78
76
|
|
|
79
|
-
// Only validate for email provider
|
|
80
77
|
if (provider === 'email') {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
formManager.setFormState('ready');
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
78
|
+
await emailHandler(data);
|
|
79
|
+
} else if (provider) {
|
|
80
|
+
await signInWithProvider(provider, action);
|
|
87
81
|
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
88
84
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
} catch (error) {
|
|
97
|
-
// Set form back to ready state
|
|
98
|
-
formManager.setFormState('ready');
|
|
99
|
-
|
|
100
|
-
// Show the error to the user
|
|
101
|
-
formManager.showError(error.message || 'An error occurred during sign in');
|
|
102
|
-
|
|
103
|
-
// Log for debugging
|
|
104
|
-
console.error('Signin error:', error);
|
|
105
|
-
}
|
|
85
|
+
// Initialize signin form
|
|
86
|
+
function initializeSigninForm() {
|
|
87
|
+
formManager = new FormManager('#signin-form', {
|
|
88
|
+
allowResubmit: false,
|
|
89
|
+
submittingText: 'Signing in...',
|
|
90
|
+
submittedText: 'Signed In!',
|
|
106
91
|
});
|
|
92
|
+
|
|
93
|
+
formManager.on('validation', validateEmailProvider);
|
|
94
|
+
formManager.on('submit', createAuthSubmitHandler('signin', handleEmailSignin));
|
|
107
95
|
}
|
|
108
96
|
|
|
109
97
|
// Initialize signup form
|
|
110
98
|
function initializeSignupForm() {
|
|
111
99
|
formManager = new FormManager('#signup-form', {
|
|
112
|
-
|
|
113
|
-
|
|
100
|
+
allowResubmit: false,
|
|
101
|
+
submittingText: 'Creating account...',
|
|
102
|
+
submittedText: 'Account Created!',
|
|
114
103
|
});
|
|
115
104
|
|
|
116
|
-
|
|
117
|
-
formManager.
|
|
118
|
-
// Prevent FormManager's default submit handler
|
|
119
|
-
e.preventDefault();
|
|
120
|
-
|
|
121
|
-
const { submitButton, data } = e.detail;
|
|
122
|
-
const provider = submitButton?.getAttribute('data-provider');
|
|
123
|
-
|
|
124
|
-
// Only validate for email provider
|
|
125
|
-
if (provider === 'email') {
|
|
126
|
-
const validation = formManager.validate(data);
|
|
127
|
-
if (!validation.isValid) {
|
|
128
|
-
formManager.showErrors(validation.errors);
|
|
129
|
-
formManager.setFormState('ready');
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
try {
|
|
135
|
-
if (provider === 'email') {
|
|
136
|
-
// Pass the already collected data to avoid re-collecting from disabled fields
|
|
137
|
-
await handleEmailSignup(data);
|
|
138
|
-
} else if (provider) {
|
|
139
|
-
await signInWithProvider(provider, 'signup');
|
|
140
|
-
}
|
|
141
|
-
} catch (error) {
|
|
142
|
-
// Set form back to ready state
|
|
143
|
-
formManager.setFormState('ready');
|
|
144
|
-
|
|
145
|
-
// Show the error to the user
|
|
146
|
-
formManager.showError(error.message || 'An error occurred during sign up');
|
|
147
|
-
|
|
148
|
-
// Log for debugging
|
|
149
|
-
console.error('Signup error:', error);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
105
|
+
formManager.on('validation', validateEmailProvider);
|
|
106
|
+
formManager.on('submit', createAuthSubmitHandler('signup', handleEmailSignup));
|
|
152
107
|
}
|
|
153
108
|
|
|
154
109
|
// Initialize reset form
|
|
155
110
|
function initializeResetForm() {
|
|
156
111
|
formManager = new FormManager('#reset-form', {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
112
|
+
allowResubmit: false,
|
|
113
|
+
submittingText: 'Sending...',
|
|
114
|
+
submittedText: 'Email Sent!',
|
|
160
115
|
});
|
|
161
116
|
|
|
162
|
-
|
|
163
|
-
formManager.addEventListener('submit', async (e) => {
|
|
164
|
-
// Prevent FormManager's default submit handler
|
|
165
|
-
e.preventDefault();
|
|
166
|
-
|
|
167
|
-
const { data } = e.detail;
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
// Pass the already collected data to avoid re-collecting from disabled fields
|
|
171
|
-
await handlePasswordReset(data);
|
|
172
|
-
} catch (error) {
|
|
173
|
-
// Set form back to ready state
|
|
174
|
-
formManager.setFormState('ready');
|
|
175
|
-
|
|
176
|
-
// Show the error to the user
|
|
177
|
-
formManager.showError(error.message || 'An error occurred during password reset');
|
|
178
|
-
|
|
179
|
-
// Log for debugging
|
|
180
|
-
console.error('Reset error:', error);
|
|
181
|
-
}
|
|
182
|
-
});
|
|
117
|
+
formManager.on('submit', ({ data }) => handlePasswordReset(data));
|
|
183
118
|
}
|
|
184
119
|
|
|
185
120
|
async function handleRedirectResult() {
|
|
@@ -211,14 +146,10 @@ export default function (Manager) {
|
|
|
211
146
|
|
|
212
147
|
if (isNewUser || isSignupPage) {
|
|
213
148
|
trackSignup(providerId, result.user);
|
|
214
|
-
// Show success message
|
|
215
149
|
formManager.showSuccess('Account created successfully!');
|
|
216
|
-
formManager.setFormState('submitted');
|
|
217
150
|
} else {
|
|
218
151
|
trackLogin(providerId, result.user);
|
|
219
|
-
// Show success message
|
|
220
152
|
formManager.showSuccess('Successfully signed in!');
|
|
221
|
-
formManager.setFormState('submitted');
|
|
222
153
|
}
|
|
223
154
|
} catch (error) {
|
|
224
155
|
// Only capture unexpected errors to Sentry
|
|
@@ -353,9 +284,6 @@ export default function (Manager) {
|
|
|
353
284
|
|
|
354
285
|
// Show success message
|
|
355
286
|
formManager.showSuccess('Account created successfully!');
|
|
356
|
-
|
|
357
|
-
// FormManager will handle the success state
|
|
358
|
-
formManager.setFormState('submitted');
|
|
359
287
|
} catch (error) {
|
|
360
288
|
// Handle Firebase-specific errors
|
|
361
289
|
if (error.code === 'auth/email-already-in-use') {
|
|
@@ -370,9 +298,6 @@ export default function (Manager) {
|
|
|
370
298
|
|
|
371
299
|
// Show success message
|
|
372
300
|
formManager.showSuccess('Successfully signed in!');
|
|
373
|
-
|
|
374
|
-
// Set success state
|
|
375
|
-
formManager.setFormState('submitted');
|
|
376
301
|
return;
|
|
377
302
|
} catch (signInError) {
|
|
378
303
|
// Throw error for outer catch to handle
|
|
@@ -403,9 +328,6 @@ export default function (Manager) {
|
|
|
403
328
|
|
|
404
329
|
// Show success message
|
|
405
330
|
formManager.showSuccess('Successfully signed in!');
|
|
406
|
-
|
|
407
|
-
// FormManager will handle the success state
|
|
408
|
-
formManager.setFormState('submitted');
|
|
409
331
|
}
|
|
410
332
|
|
|
411
333
|
async function handlePasswordReset(formData) {
|
|
@@ -429,9 +351,6 @@ export default function (Manager) {
|
|
|
429
351
|
|
|
430
352
|
// Show success message
|
|
431
353
|
formManager.showSuccess(`Password reset email sent to ${email}. Please check your inbox.`);
|
|
432
|
-
|
|
433
|
-
// Set form to submitted state
|
|
434
|
-
formManager.setFormState('submitted');
|
|
435
354
|
} catch (error) {
|
|
436
355
|
// Handle Firebase-specific errors
|
|
437
356
|
if (error.code === 'auth/user-not-found') {
|
|
@@ -439,7 +358,6 @@ export default function (Manager) {
|
|
|
439
358
|
// Still show success to prevent email enumeration
|
|
440
359
|
trackPasswordReset(email); // Track as success for security
|
|
441
360
|
formManager.showSuccess(`If an account exists for ${email}, a password reset email has been sent.`);
|
|
442
|
-
formManager.setFormState('submitted');
|
|
443
361
|
return;
|
|
444
362
|
}
|
|
445
363
|
|
|
@@ -484,19 +402,32 @@ export default function (Manager) {
|
|
|
484
402
|
throw new Error(`Unsupported provider: ${providerName}`);
|
|
485
403
|
}
|
|
486
404
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
)
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
405
|
+
/* @dev-only:start */
|
|
406
|
+
{
|
|
407
|
+
// // Add device_id and device_name for private IP addresses (required by Firebase)
|
|
408
|
+
// const deviceId = webManager.storage().get('devDeviceId') || crypto.randomUUID();
|
|
409
|
+
// webManager.storage().set('devDeviceId', deviceId);
|
|
410
|
+
|
|
411
|
+
// provider.setCustomParameters({
|
|
412
|
+
// device_id: deviceId,
|
|
413
|
+
// device_name: navigator.userAgent.substring(0, 100),
|
|
414
|
+
// });
|
|
415
|
+
|
|
416
|
+
// Show warning in dev mode when using redirect
|
|
417
|
+
if (!useAuthPopup) {
|
|
418
|
+
webManager.utilities().showNotification(
|
|
419
|
+
'OAuth redirect may fail in development. Use localhost:4000 or add ?authPopup=true to the URL',
|
|
420
|
+
{
|
|
421
|
+
type: 'warning',
|
|
422
|
+
timeout: 10000 // Show for 10 seconds
|
|
423
|
+
}
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
// Wait
|
|
427
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
428
|
+
}
|
|
499
429
|
}
|
|
430
|
+
/* @dev-only:end */
|
|
500
431
|
|
|
501
432
|
// Use popup if query parameter is set, otherwise use redirect
|
|
502
433
|
if (useAuthPopup) {
|
|
@@ -516,9 +447,6 @@ export default function (Manager) {
|
|
|
516
447
|
// Show success message
|
|
517
448
|
formManager.showSuccess('Successfully signed in!');
|
|
518
449
|
}
|
|
519
|
-
|
|
520
|
-
// Set form to submitted state
|
|
521
|
-
formManager.setFormState('submitted');
|
|
522
450
|
} catch (popupError) {
|
|
523
451
|
// Check if popup was blocked or failed
|
|
524
452
|
if (popupError.code === 'auth/popup-blocked' ||
|
|
@@ -620,6 +548,7 @@ export default function (Manager) {
|
|
|
620
548
|
|
|
621
549
|
function trackLogin(method, user) {
|
|
622
550
|
const userId = user.uid;
|
|
551
|
+
const methodName = method.charAt(0).toUpperCase() + method.slice(1);
|
|
623
552
|
|
|
624
553
|
// Google Analytics 4
|
|
625
554
|
gtag('event', 'login', {
|
|
@@ -629,21 +558,22 @@ export default function (Manager) {
|
|
|
629
558
|
|
|
630
559
|
// Facebook Pixel
|
|
631
560
|
fbq('trackCustom', 'Login', {
|
|
561
|
+
content_name: `Account Login ${methodName}`,
|
|
632
562
|
method: method,
|
|
633
|
-
status: 'success'
|
|
634
563
|
});
|
|
635
564
|
|
|
636
565
|
// TikTok Pixel
|
|
637
566
|
ttq.track('Login', {
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
567
|
+
content_id: `account-login-${method}`,
|
|
568
|
+
content_type: 'product',
|
|
569
|
+
content_name: `Account Login ${methodName}`
|
|
641
570
|
});
|
|
642
571
|
}
|
|
643
572
|
|
|
644
573
|
// Analytics tracking functions
|
|
645
574
|
function trackSignup(method, user) {
|
|
646
575
|
const userId = user.uid;
|
|
576
|
+
const methodName = method.charAt(0).toUpperCase() + method.slice(1);
|
|
647
577
|
|
|
648
578
|
// Google Analytics 4
|
|
649
579
|
gtag('event', 'sign_up', {
|
|
@@ -653,17 +583,15 @@ export default function (Manager) {
|
|
|
653
583
|
|
|
654
584
|
// Facebook Pixel
|
|
655
585
|
fbq('track', 'CompleteRegistration', {
|
|
656
|
-
content_name:
|
|
657
|
-
|
|
658
|
-
value: 0,
|
|
659
|
-
currency: 'USD'
|
|
586
|
+
content_name: `Account Registration ${methodName}`,
|
|
587
|
+
method: method,
|
|
660
588
|
});
|
|
661
589
|
|
|
662
590
|
// TikTok Pixel
|
|
663
591
|
ttq.track('CompleteRegistration', {
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
592
|
+
content_id: `account-registration-${method}`,
|
|
593
|
+
content_type: 'product',
|
|
594
|
+
content_name: `Account Registration ${methodName}`
|
|
667
595
|
});
|
|
668
596
|
}
|
|
669
597
|
|
|
@@ -683,8 +611,9 @@ export default function (Manager) {
|
|
|
683
611
|
|
|
684
612
|
// TikTok Pixel
|
|
685
613
|
ttq.track('SubmitForm', {
|
|
686
|
-
|
|
687
|
-
content_type: '
|
|
614
|
+
content_id: 'password-reset',
|
|
615
|
+
content_type: 'product',
|
|
616
|
+
content_name: 'Password Reset'
|
|
688
617
|
});
|
|
689
618
|
}
|
|
690
619
|
}
|