From bc04a5dcd2739a4b1b321bdcd08c9dd42279484c Mon Sep 17 00:00:00 2001 From: Tongsheng Wu Date: Mon, 15 Jun 2026 00:34:26 -0700 Subject: [PATCH 1/3] Add broadcast announcements service Adds /broadcast_hackers with email and SMS broadcast forms, stub senders, a broadcast log stub, and a success page. No real sending infrastructure yet. Co-Authored-By: Claude Sonnet 4.6 --- app/broadcast_hackers/actions.ts | 31 +++++++++++++++++ app/broadcast_hackers/page.tsx | 45 +++++++++++++++++++++++++ app/broadcast_hackers/styles.module.css | 32 ++++++++++++++++++ app/broadcast_hackers/success/page.tsx | 23 +++++++++++++ lib/db/schema/broadcasts.ts | 20 +++++++++++ 5 files changed, 151 insertions(+) create mode 100644 app/broadcast_hackers/actions.ts create mode 100644 app/broadcast_hackers/page.tsx create mode 100644 app/broadcast_hackers/styles.module.css create mode 100644 app/broadcast_hackers/success/page.tsx create mode 100644 lib/db/schema/broadcasts.ts diff --git a/app/broadcast_hackers/actions.ts b/app/broadcast_hackers/actions.ts new file mode 100644 index 0000000..06378af --- /dev/null +++ b/app/broadcast_hackers/actions.ts @@ -0,0 +1,31 @@ +"use server"; + +import { redirect } from "next/navigation"; + +export async function broadcastEmail(formData: FormData) { + const subject = formData.get("subject") as string; + const body = formData.get("body") as string; + send_all_email_stub(subject, body); + log_broadcast_stub("email", body, subject); + redirect("/broadcast_hackers/success?channel=email"); +} + +export async function broadcastSms(formData: FormData) { + const message = formData.get("message") as string; + send_all_sms_stub(message); + log_broadcast_stub("sms", message); + redirect("/broadcast_hackers/success?channel=sms"); +} + +function send_all_email_stub(subject: string, body: string) { + console.log("[EMAIL STUB] subject:", subject); + console.log("[EMAIL STUB] body:", body); +} + +function send_all_sms_stub(message: string) { + console.log("[SMS STUB] message:", message); +} + +function log_broadcast_stub(channel: "email" | "sms", body: string, subject?: string) { + console.log("[BROADCAST LOG STUB] channel:", channel, "subject:", subject, "body:", body); +} diff --git a/app/broadcast_hackers/page.tsx b/app/broadcast_hackers/page.tsx new file mode 100644 index 0000000..ec2eacc --- /dev/null +++ b/app/broadcast_hackers/page.tsx @@ -0,0 +1,45 @@ +"use client"; + +import { broadcastEmail, broadcastSms } from "./actions"; +import styles from "./styles.module.css"; + +function confirm_send(count: number) { + return confirm(`This will alert all ${count} hackers. Are you sure?`); +} + +export default function BroadcastPage() { + const hackerCount = 0; // TODO: replace with real count + + return ( +
+

Broadcast Announcements

+ +

Email

+
{ if (!confirm_send(hackerCount)) e.preventDefault(); }} className={styles.form}> + +