Skip to content

Commit 2f4d5ba

Browse files
committed
prepare all the email templates for the 11th event
1 parent 0307bdc commit 2f4d5ba

File tree

5 files changed

+212
-15
lines changed

5 files changed

+212
-15
lines changed

emails/event-11-2026-03-25.tsx

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import * as React from "react";
2+
import { render } from "@react-email/render";
3+
import Layout from "../components/Layout";
4+
import Text from "../components/Text";
5+
import Button from "../components/Button";
6+
import Link from "../components/Link";
7+
import Heading from "../components/Heading";
8+
import Hr from "../components/Hr";
9+
import Socials from "../components/Socials";
10+
import Schedule from "../components/Schedule";
11+
12+
interface EmailProps {
13+
ticketUrl: string;
14+
}
15+
16+
export const Email = ({ ticketUrl }: EmailProps) => (
17+
<Layout>
18+
<Text>
19+
<strong>NN1 Dev Club #11</strong> is tomorrow and we are looking forward
20+
to seeing you. Just a quick reminder with all the details and the link to
21+
your ticket.
22+
</Text>
23+
<Text>
24+
🗓️ Thursday, 26/03/2026, 18:00
25+
<br />
26+
📍{" "}
27+
<Link href="https://maps.app.goo.gl/q7RFeDME5cLZWPFA7">
28+
Vulcan Works, Northampton, NN1 1EW
29+
</Link>
30+
<br />
31+
🅿️{" "}
32+
<Link href="https://maps.app.goo.gl/fk3jpaPLSLGrHNmH6">
33+
St. John's Multi Storey Car Park
34+
</Link>
35+
</Text>
36+
37+
<Button href={ticketUrl}>Open Your Ticket</Button>
38+
<Hr />
39+
<Heading>Schedule</Heading>
40+
<Schedule
41+
items={[
42+
{
43+
timeStart: "18:00",
44+
timeEnd: "18:30",
45+
title: "Meet and Greet",
46+
},
47+
{
48+
timeStart: "18:30",
49+
timeEnd: "19:00",
50+
title: '"Compiling JavaScript ahead-of-time" by Oliver Medhurst',
51+
descriptoin:
52+
"Existing JavaScript (and TypeScript) is compiled just-in-time, compiled from source on user's machines, but what about ahead-of-time, compiled in advance like C++ or Rust? This talk will explore the pros and cons of this upcoming paradigm with real-world examples and working demos!",
53+
},
54+
{
55+
timeStart: "19:00",
56+
timeEnd: "19:15",
57+
title: "Break",
58+
},
59+
{
60+
timeStart: "19:15",
61+
timeEnd: "19:45",
62+
title: '"Future of Work is Async" by Rob Hough',
63+
descriptoin:
64+
"The way developers work is changing. Remote work, AI, and automation mean we have more leverage than ever — yet many teams are still trapped in endless meetings, interruptions, and slow-moving projects. This talk explores why smaller, async teams are becoming a competitive advantage, and what it takes to work this way effectively.",
65+
},
66+
]}
67+
/>
68+
69+
<Hr />
70+
<Text>
71+
NN1 Dev Club Crew,
72+
<br />
73+
Pawel & Darren
74+
</Text>
75+
<Socials />
76+
</Layout>
77+
);
78+
79+
Email.PreviewProps = {
80+
ticketUrl: "https://nn1.dev/events/5/123",
81+
} as EmailProps;
82+
83+
const renderEmailEvent_11_2026_03_25 = async ({ ticketUrl }: EmailProps) => ({
84+
html: await render(<Email ticketUrl={ticketUrl} />),
85+
text: await render(<Email ticketUrl={ticketUrl} />, { plainText: true }),
86+
});
87+
88+
export default Email;
89+
export { renderEmailEvent_11_2026_03_25 };

emails/event-11-2026-03-27.tsx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { render } from "@react-email/render";
2+
import Layout from "../components/Layout";
3+
import Text from "../components/Text";
4+
import Link from "../components/Link";
5+
import Socials from "../components/Socials";
6+
7+
interface EmailProps {
8+
ticketUrl: string;
9+
}
10+
11+
export const Email = ({ ticketUrl }: EmailProps) => (
12+
<Layout>
13+
<Text>
14+
Thank you for attending our meetup yesterday. We always look for ways to
15+
improve, so your feedback is very important to us. Please reply to this
16+
message, share your feedback on{" "}
17+
<Link href="https://chat.nn1.dev/">our Discord server</Link>, or ping us
18+
on social media and tell us how we're doing.
19+
</Text>
20+
<Text>
21+
If you like what we do, consider supporting us via{" "}
22+
<Link href="https://opencollective.com/nn1-dev">Open Collective</Link>. It
23+
is the most transparent way for us to collect donations and for you to
24+
track what we spend it on. As little as a fiver a month means a lot to us.
25+
We also have a special sponsor tier for businesses. Thank you!
26+
</Text>
27+
28+
<Text>
29+
NN1 Dev Club Crew,
30+
<br />
31+
Pawel & Darren
32+
</Text>
33+
<Socials />
34+
</Layout>
35+
);
36+
37+
Email.PreviewProps = {
38+
ticketUrl: "https://nn1.dev/events/5/123",
39+
} as EmailProps;
40+
41+
const renderEmailEvent_11_2026_03_27 = async ({ ticketUrl }: EmailProps) => ({
42+
html: await render(<Email ticketUrl={ticketUrl} />),
43+
text: await render(<Email ticketUrl={ticketUrl} />, { plainText: true }),
44+
});
45+
46+
export default Email;
47+
export { renderEmailEvent_11_2026_03_27 };

emails/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ export { renderEmailEventTest } from "./event-10-test";
33

44
// export { renderEmailNewsletter_2026_01_27 } from "./newsletter-2026-01-27";
55
// export { renderEmailNewsletter_2026_02_02 } from "./newsletter-2026-02-02";
6-
export { renderEmailNewsletter_2026_03_12 } from "./newsletter-2026-03-12";
6+
// export { renderEmailNewsletter_2026_03_12 } from "./newsletter-2026-03-12";
7+
export { renderEmailNewsletter_2026_03_24 } from "./newsletter-2026-03-24";
78
// export { renderEmailEvent_10_2026_01_28 } from "./event-10-2026-01-28";
89
// export { renderEmailEvent_10_2026_01_30 } from "./event-10-2026-01-30";
10+
export { renderEmailEvent_11_2026_03_25 } from "./event-11-2026-03-25";
11+
export { renderEmailEvent_11_2026_03_27 as renderEmailEvent_10_2026_03_27 } from "./event-11-2026-03-27";

emails/newsletter-2026-03-24.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { render } from "@react-email/render";
2+
import Button from "../components/Button";
3+
import Hr from "../components/Hr";
4+
import Link from "../components/Link";
5+
import Text from "../components/Text";
6+
import Layout from "../components/Layout";
7+
import Socials from "../components/Socials";
8+
9+
interface EmailProps {
10+
unsubscribeUrl: string;
11+
}
12+
13+
export const Email = ({ unsubscribeUrl }: EmailProps) => (
14+
<Layout>
15+
<Text>
16+
A quick reminder about the upcoming meetup with{" "}
17+
<strong>Oliver Medhurst</strong> and <strong>Rob Hough</strong>. It is
18+
happening in two days and we still have a few slots left! In addition to
19+
top speakers, pizza, beers, and some other snacks, we have a little
20+
something for every attendee of this meetup. We are looking forward to
21+
seeing you!
22+
</Text>
23+
<Text>
24+
🗓️ Thursday, 26/03/2026, 18:00
25+
<br />
26+
📍 Vulcan Works, Northampton, NN1 1EW
27+
<br />
28+
💰 Free (registration required)
29+
</Text>
30+
<Button href="https://nn1.dev/events/11">Register now</Button>
31+
<Hr />
32+
<Text>Questions? Reach out on social media or reply to this email!</Text>
33+
<Text>
34+
NN1 Dev Club Crew,
35+
<br />
36+
Pawel & Darren
37+
</Text>
38+
<Socials />
39+
<Hr />
40+
<Text>
41+
Are you no longer interested? You can{" "}
42+
<Link href={unsubscribeUrl}>unsubscribe</Link> anytime.
43+
</Text>
44+
</Layout>
45+
);
46+
47+
Email.PreviewProps = {
48+
unsubscribeUrl: "https://nn1.dev",
49+
} as EmailProps;
50+
51+
const renderEmailNewsletter_2026_03_24 = async (props: EmailProps) => ({
52+
html: await render(<Email {...props} />),
53+
text: await render(<Email {...props} />, { plainText: true }),
54+
});
55+
56+
export default Email;
57+
export { renderEmailNewsletter_2026_03_24 };

src/handlers/broadcast.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import { Resend } from "resend";
33
import z from "zod";
44
import { instrumentD1WithSentry, captureException } from "@sentry/cloudflare";
55
import {
6-
renderEmailNewsletter_2026_03_12,
7-
// renderEmailEvent_10_2026_01_28,
8-
// renderEmailEvent_10_2026_01_30,
6+
renderEmailNewsletter_2026_03_24,
7+
renderEmailEvent_11_2026_03_25,
8+
renderEmailEvent_10_2026_03_27,
99
} from "../../emails";
1010
import { chunkArray } from "../utils";
1111
import auth from "../middlewares/auth";
1212
import { EMAIL_FROM, ERROR_MESSAGE_BAD_REQUEST } from "../constants";
13+
import { renderEmailEvent_11_2026_03_27 } from "../../emails/event-11-2026-03-27";
1314

1415
// https://resend.mintlify.dev/docs/api-reference/emails/send-batch-emails
1516
const RESEND_MAX_BATCH_CHUNK = 100;
@@ -32,9 +33,9 @@ const TEMPLATE_MAPPER_NEWSLETTER: Record<
3233
// template: renderEmailNewsletter_2026_01_27,
3334
// subject: "✨ NN1 Dev Club #10 is on Thursday!",
3435
// },
35-
"2026-03-12": {
36-
template: renderEmailNewsletter_2026_03_12,
37-
subject: "✨ NN1 Dev Club #11: See you in two weeks!",
36+
"2026-03-24": {
37+
template: renderEmailNewsletter_2026_03_24,
38+
subject: "✨ NN1 Dev Club #11 is on Thursday!",
3839
},
3940
};
4041

@@ -52,14 +53,14 @@ const TEMPLATE_MAPPER_EVENT: Record<
5253
// template: renderEmailEventTest,
5354
// subject: "✨ NN1 Dev Club #Test Event",
5455
// },
55-
// "10-2026-01-28": {
56-
// template: renderEmailEvent_10_2026_01_28,
57-
// subject: "✨ NN1 Dev Club #10 - See you tomorrow!",
58-
// },
59-
// "10-2026-01-30": {
60-
// template: renderEmailEvent_10_2026_01_30,
61-
// subject: "✨ NN1 Dev Club #10 - Thank you for attending!",
62-
// },
56+
"11-2026-03-25": {
57+
template: renderEmailEvent_11_2026_03_25,
58+
subject: "✨ NN1 Dev Club #11 - See you tomorrow!",
59+
},
60+
"11-2026-03-27": {
61+
template: renderEmailEvent_11_2026_03_27,
62+
subject: "✨ NN1 Dev Club #11 - Thank you for attending!",
63+
},
6364
};
6465

6566
async function createEmailPayload({

0 commit comments

Comments
 (0)