Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MNTOR-3902 - Design changes to monthly report emails #5530

Merged
merged 16 commits into from
Jan 28, 2025
31 changes: 10 additions & 21 deletions locales-pending/emails-all.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ email-breach-alert-plus-scan-results-data-points-label =
[one] Data exposure
*[other] Data exposures
}
email-breach-alert-plus-scan-results-cta-label = Take action to resolve these exposures
email-breach-alert-plus-scan-results-trailer = We’ll guide you step-by-step through the process
email-breach-alert-scan-results-cta-label = Resolve exposures

# Monthly Report Free User

email-monthly-report-hero-free-heading = Your monthly { -brand-mozilla-monitor } report
email-monthly-report-hero-free-body = A summary of what needs your attention, and what’s been resolved over the past month.
email-monthly-report-hero-free-subtitle = A summary of what needs attention and what’s been resolved this month.

## This string is displayed under a large numeral that indicates the total
## number of data breaches that have exposed the user’s information.
Expand All @@ -91,30 +91,19 @@ email-monthly-report-no-scan-results-data-points-label =
}
email-monthly-report-free-summary-auto-removed =
{ $data_point_count ->
[one] Auto-removed exposure
*[other] Auto-removed exposures
}
email-monthly-report-free-summary-resolved-breaches =
{ $data_point_count ->
[one] Manually resolved data breach
*[other] Manually resolved data breaches
}
email-monthly-report-free-summary-manually-resolved-exposures =
{ $data_point_count ->
[one] Manually resolved exposure
*[other] Manually resolved exposures
[one] Auto-removed exposure*
*[other] Auto-removed exposures*
}
email-monthly-report-free-broker-scan-available = Free data broker scan available
email-monthly-report-free-breaches-resolved-manually = Data breaches resolved manually

##

email-monthly-report-free-results-heading = Current exposures
email-monthly-report-free-summary-heading = What’s happened in the last month
email-monthly-report-free-upgrade-cta = Unlock with { -brand-monitor-plus }
email-monthly-report-free-banner-heading = { -brand-monitor } now protects you even more
email-monthly-report-free-banner-body = We can find your personal info on data broker sites that sell it for a profit.
email-monthly-report-free-banner-cta-free-scan = Get first scan free
email-monthly-report-free-banner-cta-upgrade = Get { -brand-monitor-plus }
email-monthly-report-free-upgrade-cta = * Unlock with { -brand-monitor-plus }
email-monthly-report-free-view-details = View details
email-monthly-report-hero-free-no-breaches-heading = Great news!
email-monthly-report-hero-free-no-breaches-body = You currently have no data breaches that need action.
email-monthly-report-hero-free-no-breaches-cta = View your Dashboard
email-monthly-report-hero-free-no-breaches-body = { -brand-monitor } didn’t find any data exposures to be resolved.
email-monthly-report-hero-free-no-breaches-cta = View your dashboard
email-unsubscribe-link = <link_to_unsub>Unsubscribe from this email</link_to_unsub> anytime.
Binary file added public/images/email/monthly-activity/lock-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/emails/components/EmailBanner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export const EmailBanner = (props: {

<mj-button
href={props.ctaTarget}
background-color="#0060DF"
background-color="#592ACB"
font-weight={600}
font-size="15px"
line-height="22px"
Expand Down
8 changes: 3 additions & 5 deletions src/emails/components/EmailDataPointCount.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,18 +101,16 @@ export const DataPointCount = (props: Props) => {
>
<mj-column>
<mj-button
href={`${process.env.SERVER_URL}/user/dashboard/action-needed?utm_source=monitor-product&utm_medium=product-email&utm_campaign=${props.utmCampaignId}&utm_content=take-action${utmContentSuffix}`}
background-color="#0060DF"
href={`${process.env.SERVER_URL}/user/dashboard/action-needed?utm_source=monitor-product&utm_medium=product-email&utm_campaign=${props.utmCampaignId}&utm_content=resolve-exposures-${utmContentSuffix}`}
background-color="#592ACB"
border-radius="8px"
padding="12px 24px"
font-weight={600}
font-size="15px"
line-height="22px"
width="100%"
>
{props.l10n.getString(
"email-breach-alert-plus-scan-results-cta-label",
)}
{props.l10n.getString("email-breach-alert-scan-results-cta-label")}
</mj-button>
<mj-text
font-size="12px"
Expand Down
2 changes: 1 addition & 1 deletion src/emails/templates/breachAlert/BreachAlertEmail.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ describe("The redesigned breach alert email", () => {
render(<ComposedEmail />);

const takeActionButton = screen.getByRole("link", {
name: "Take action to resolve these exposures",
name: "Resolve exposures",
});
expect(takeActionButton).toBeInTheDocument();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ export const MonthlyReportFreeUserNoScanWithBreachesResolved: Story = {
},
};

// With scan, only check from unresolvedSanitizedDataPoints
export const MonthlyReportFreeUserWithScanWithExposuresNothingResolved: Story =
{
name: "With Scan With Data Breaches and Brokers, Nothing Resolved",
Expand All @@ -134,7 +133,7 @@ export const MonthlyReportFreeUserWithScanWithExposuresNothingResolved: Story =
};

export const MonthlyReportFreeUserWithScanWithExposuresResolved: Story = {
name: "With Scan With Data Breaches and Data Brokers and Resolved Exposures",
name: "With Scan With Data Breaches and Data Brokers and Resolved Breaches",
args: {
unsubscribeLink: "/",
dataSummary: {
Expand All @@ -144,11 +143,7 @@ export const MonthlyReportFreeUserWithScanWithExposuresResolved: Story = {
{ [dataClassKeyMap.familyMembers]: 10 },
{ [dataClassKeyMap.phoneNumbers]: 5 },
],
fixedSanitizedDataPoints: [
{ [dataClassKeyMap.passwords]: 10 },
{ [dataClassKeyMap.familyMembers]: 10 },
{ [dataClassKeyMap.phoneNumbers]: 5 },
],
dataBreachResolvedNum: 3,
},
subscriber: {
onerep_profile_id: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,32 @@ import Meta, {
MonthlyReportFreeUserWithScanWithExposuresResolved,
} from "./MonthlyActivityFreeEmail.stories";

it("shows the right cta label if a user has not yet run a scan", () => {
it("shows the right label in the right box if a scan hasn't been run", () => {
const ComposedEmail = composeStory(
MonthlyReportFreeUserNoScanWithBreachesNothingResolved,
Meta,
);
render(<ComposedEmail />);

const getFirstScanFreeBtn = screen.getByRole("link", {
name: "Get first scan free",
});
const getFirstScanFreeLabel = screen.getByText(
"Free data broker scan available",
);

expect(getFirstScanFreeBtn).toBeInTheDocument();
expect(getFirstScanFreeLabel).toBeInTheDocument();
});

it("shows the right cta label if a user has run a scan", () => {
it("shows the right label in the right box if a user has run a scan", () => {
const ComposedEmail = composeStory(
MonthlyReportFreeUserWithScanWithExposuresNothingResolved,
Meta,
);
render(<ComposedEmail />);

const getFirstScanFreeBtn = screen.getByRole("link", {
name: "Get ⁨Monitor Plus⁩",
const autoRemovedExposuresLabel = screen.getByText("Auto-removed exposures", {
exact: false,
});

expect(getFirstScanFreeBtn).toBeInTheDocument();
expect(autoRemovedExposuresLabel).toBeInTheDocument();
});

it("shows the inactive state if there are 0 manually resolved data breaches", () => {
Expand All @@ -49,11 +49,11 @@ it("shows the inactive state if there are 0 manually resolved data breaches", ()
render(<ComposedEmail />);

const manuallyResolvedDataBreaches = screen.getByText(
"Manually resolved data breaches",
"Data breaches resolved manually",
{ exact: false },
);

expect(manuallyResolvedDataBreaches).toHaveStyle("color: #9E9E9E");
expect(manuallyResolvedDataBreaches).toHaveStyle("color: #6D6D6E");
});

it("shows the active state if there are manually resolved data breaches", () => {
Expand All @@ -64,11 +64,11 @@ it("shows the active state if there are manually resolved data breaches", () =>
render(<ComposedEmail />);

const manuallyResolvedExposures = screen.getByText(
"Manually resolved exposures",
"Data breaches resolved manually",
{ exact: false },
);

expect(manuallyResolvedExposures).toHaveStyle("color: #7542E5");
expect(manuallyResolvedExposures).toHaveStyle("color: #000000");
});

it("says exposures instead of breaches once a user has run a scan", () => {
Expand All @@ -78,14 +78,9 @@ it("says exposures instead of breaches once a user has run a scan", () => {
);
render(<ComposedEmail />);

const manuallyResolvedExposures = screen.getByText(
"Manually resolved exposures",
{ exact: false },
);

const dataExposures = screen.getByText("Data exposures", { exact: false });
const dataExposures = screen.getByText("Data exposures", { exact: true });

expect(manuallyResolvedExposures).toBeInTheDocument();
expect(screen.queryByText("Data breaches", { exact: true })).toBeNull();
expect(dataExposures).toBeInTheDocument();
});

Expand Down
Loading
Loading