Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,20 @@ const sendPreviewTracking = ({
eventDescription,
renderingTarget,
renderUrl,
isSignedIn,
}: {
identityName: string;
eventDescription: PreviewEventDescription;
renderingTarget: RenderingTarget;
renderUrl: string;
isSignedIn?: boolean | 'Pending';
}) => {
sendNewsletterSignupEvent({
action: eventDescription === 'preview-open' ? 'EXPAND' : 'CLOSE',
identityName,
componentId: NEWSLETTER_SIGNUP_COMPONENT_ID.variant(identityName),
renderingTarget,
value: { eventDescription, renderUrl },
value: { eventDescription, renderUrl, isSignedIn },
});
};

Expand Down Expand Up @@ -90,12 +92,13 @@ export const NewsletterSignupCardContainer = ({
eventDescription: 'preview-open',
renderingTarget,
renderUrl,
isSignedIn,
});
}

return true;
});
}, [identityName, renderingTarget, renderUrl]);
}, [identityName, isSignedIn, renderingTarget, renderUrl]);

const trackPreviewLinkOpen = useCallback(() => {
if (!renderUrl) {
Expand All @@ -107,8 +110,9 @@ export const NewsletterSignupCardContainer = ({
eventDescription: 'preview-open',
renderingTarget,
renderUrl,
isSignedIn,
});
}, [identityName, renderingTarget, renderUrl]);
}, [identityName, isSignedIn, renderingTarget, renderUrl]);

const closePreview = useCallback(() => {
setIsPreviewOpen((isOpen) => {
Expand All @@ -118,12 +122,13 @@ export const NewsletterSignupCardContainer = ({
eventDescription: 'preview-close',
renderingTarget,
renderUrl,
isSignedIn,
});
}

return false;
});
}, [identityName, renderingTarget, renderUrl]);
}, [identityName, isSignedIn, renderingTarget, renderUrl]);

const previewAction = hasPreviewUrl
? renderingTarget === 'Apps'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ describe('NewsletterSignupForm', () => {
expect(params.get('browserId')).toBe('test-browser-id');

expectTrackedEventDescriptions([
'email-input-focused',
'click-button',
'open-captcha',
'captcha-passed',
Expand Down Expand Up @@ -368,6 +369,7 @@ describe('NewsletterSignupForm', () => {
});

expectTrackedEventDescriptions([
'email-input-focused',
'click-button',
'open-captcha',
'captcha-passed',
Expand Down Expand Up @@ -402,6 +404,7 @@ describe('NewsletterSignupForm', () => {
expect(global.fetch).not.toHaveBeenCalled();

expectTrackedEventDescriptions([
'email-input-focused',
'click-button',
'open-captcha',
'captcha-not-passed',
Expand Down Expand Up @@ -433,6 +436,7 @@ describe('NewsletterSignupForm', () => {
expect(global.fetch).not.toHaveBeenCalled();

expectTrackedEventDescriptions([
'email-input-focused',
'click-button',
'open-captcha',
'captcha-load-error',
Expand Down
50 changes: 45 additions & 5 deletions dotcom-rendering/src/components/SecureSignup.island.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -208,14 +208,15 @@ const sendTracking = (
newsletterId: string,
eventDescription: NewsletterEventDescription,
renderingTarget: RenderingTarget,
isSignedIn: boolean | 'Pending',
abTest?: AbTest,
): void => {
sendNewsletterSignupEvent({
action: EVENT_DESCRIPTION_TO_ACTION[eventDescription],
identityName: newsletterId,
componentId: NEWSLETTER_SIGNUP_COMPONENT_ID.control(newsletterId),
renderingTarget,
value: { eventDescription },
value: { eventDescription, isSignedIn },
abTest,
});
};
Expand Down Expand Up @@ -275,7 +276,13 @@ export const SecureSignup = ({
document.querySelector('input[type="email"]') ?? null;
const emailAddress: string = input?.value ?? '';

sendTracking(newsletterId, 'form-submission', renderingTarget, abTest);
sendTracking(
newsletterId,
'form-submission',
renderingTarget,
isSignedIn,
abTest,
);

const formData = buildFormData(
emailAddress,
Expand Down Expand Up @@ -305,6 +312,7 @@ export const SecureSignup = ({
newsletterId,
response.ok ? 'submission-confirmed' : 'submission-failed',
renderingTarget,
isSignedIn,
abTest,
);
};
Expand All @@ -320,6 +328,7 @@ export const SecureSignup = ({
newsletterId,
'captcha-load-error',
renderingTarget,
isSignedIn,
abTest,
);
setErrorMessage(`Sorry, the reCAPTCHA failed to load.`);
Expand All @@ -332,18 +341,26 @@ export const SecureSignup = ({
newsletterId,
'captcha-not-passed',
renderingTarget,
isSignedIn,
abTest,
);
return;
}
sendTracking(newsletterId, 'captcha-passed', renderingTarget, abTest);
sendTracking(
newsletterId,
'captcha-passed',
renderingTarget,
isSignedIn,
abTest,
);
setIsWaitingForResponse(true);
submitForm(token).catch((error) => {
console.error(error);
sendTracking(
newsletterId,
'form-submit-error',
renderingTarget,
isSignedIn,
abTest,
);
setErrorMessage(`Sorry, there was an error signing you up.`);
Expand All @@ -352,7 +369,23 @@ export const SecureSignup = ({
};

const handleClick = (): void => {
sendTracking(newsletterId, 'click-button', renderingTarget, abTest);
sendTracking(
newsletterId,
'click-button',
renderingTarget,
isSignedIn,
abTest,
);
};

const handleEmailFocus = (): void => {
sendTracking(
newsletterId,
'email-input-focused',
renderingTarget,
isSignedIn,
abTest,
);
};

const handleSubmit = (event: FormEvent<HTMLFormElement>): void => {
Expand All @@ -361,7 +394,13 @@ export const SecureSignup = ({
return;
}
setErrorMessage(undefined);
sendTracking(newsletterId, 'open-captcha', renderingTarget, abTest);
sendTracking(
newsletterId,
'open-captcha',
renderingTarget,
isSignedIn,
abTest,
);
recaptchaRef.current?.execute();
};

Expand All @@ -387,6 +426,7 @@ export const SecureSignup = ({
type="email"
value={userEmail ?? ''}
onChange={(e) => setUserEmail(e.target.value)}
onFocus={handleEmailFocus}
/>
{isSignedIn === false && (
<CheckboxGroup
Expand Down
2 changes: 2 additions & 0 deletions dotcom-rendering/src/lib/newsletterSignupTracking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export const AB_TEST_NAME = 'newsletters-newsletter-signup-card';

export type NewsletterEventDescription =
| 'click-button'
| 'email-input-focused'
| 'form-submission'
| 'submission-confirmed'
| 'submission-failed'
Expand All @@ -17,6 +18,7 @@ export type NewsletterEventDescription =

export const EVENT_DESCRIPTION_TO_ACTION = {
'click-button': 'CLICK',
'email-input-focused': 'EXPAND',
'form-submission': 'ANSWER',
'captcha-not-passed': 'ANSWER',
'captcha-passed': 'ANSWER',
Expand Down
43 changes: 35 additions & 8 deletions dotcom-rendering/src/lib/useNewsletterSignupForm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,14 +98,15 @@ const sendTracking = (
newsletterId: string,
eventDescription: NewsletterEventDescription,
renderingTarget: RenderingTarget,
isSignedIn: boolean | 'Pending',
abTest?: AbTest,
): void => {
sendNewsletterSignupEvent({
action: EVENT_DESCRIPTION_TO_ACTION[eventDescription],
identityName: newsletterId,
componentId: NEWSLETTER_SIGNUP_COMPONENT_ID.variant(newsletterId),
renderingTarget,
value: { eventDescription },
value: { eventDescription, isSignedIn },
abTest,
});
};
Expand Down Expand Up @@ -274,6 +275,7 @@ export const useNewsletterSignupForm = (
newsletterId,
'form-submission',
renderingTarget,
isSignedIn,
abTest,
);

Expand Down Expand Up @@ -306,10 +308,11 @@ export const useNewsletterSignupForm = (
newsletterId,
response.ok ? 'submission-confirmed' : 'submission-failed',
renderingTarget,
isSignedIn,
abTest,
);
},
[abTest, newsletterId, renderingTarget],
[abTest, isSignedIn, newsletterId, renderingTarget],
);

const handleCaptchaComplete = useCallback(
Expand All @@ -319,6 +322,7 @@ export const useNewsletterSignupForm = (
newsletterId,
'captcha-not-passed',
renderingTarget,
isSignedIn,
abTest,
);
setIsValidationError(false);
Expand All @@ -331,6 +335,7 @@ export const useNewsletterSignupForm = (
newsletterId,
'captcha-passed',
renderingTarget,
isSignedIn,
abTest,
);
// Read the email that was validated at submit-time — not the
Expand All @@ -344,6 +349,7 @@ export const useNewsletterSignupForm = (
newsletterId,
'form-submit-error',
renderingTarget,
isSignedIn,
abTest,
);
setIsValidationError(false);
Expand All @@ -356,21 +362,22 @@ export const useNewsletterSignupForm = (
setIsWaitingForResponse(false);
});
},
[abTest, newsletterId, renderingTarget, submitForm],
[abTest, isSignedIn, newsletterId, renderingTarget, submitForm],
);

const handleCaptchaLoadError = useCallback((): void => {
sendTracking(
newsletterId,
'captcha-load-error',
renderingTarget,
isSignedIn,
abTest,
);
setIsValidationError(false);
setErrorMessage('Sorry, the reCAPTCHA failed to load.');
setIsWaitingForResponse(false);
recaptchaRef.current?.reset();
}, [abTest, newsletterId, renderingTarget]);
}, [abTest, isSignedIn, newsletterId, renderingTarget]);

const handleSubmit = useCallback(
(event: FormEvent<HTMLFormElement>): void => {
Expand All @@ -388,11 +395,18 @@ export const useNewsletterSignupForm = (
setIsValidationError(false);
setErrorMessage(undefined);
setIsWaitingForResponse(true);
sendTracking(newsletterId, 'open-captcha', renderingTarget, abTest);
sendTracking(
newsletterId,
'open-captcha',
renderingTarget,
isSignedIn,
abTest,
);
recaptchaRef.current?.execute();
},
[
abTest,
isSignedIn,
isWaitingForResponse,
newsletterId,
renderingTarget,
Expand All @@ -409,7 +423,14 @@ export const useNewsletterSignupForm = (

const handleEmailFocus = useCallback((): void => {
setIsInteracted(true);
}, []);
sendTracking(
newsletterId,
'email-input-focused',
renderingTarget,
isSignedIn,
abTest,
);
}, [abTest, isSignedIn, newsletterId, renderingTarget]);

const handleEmailInvalid = useCallback<
React.FormEventHandler<HTMLInputElement>
Expand All @@ -434,8 +455,14 @@ export const useNewsletterSignupForm = (

const handleSubmitButtonClick = useCallback((): void => {
hasAttemptedSubmitRef.current = true;
sendTracking(newsletterId, 'click-button', renderingTarget, abTest);
}, [abTest, newsletterId, renderingTarget]);
sendTracking(
newsletterId,
'click-button',
renderingTarget,
isSignedIn,
abTest,
);
}, [abTest, isSignedIn, newsletterId, renderingTarget]);

const handleReset = useCallback<
ReactEventHandler<HTMLButtonElement>
Expand Down
Loading