From c3df6399958025d5c5b86c98f7c3b157992c44d0 Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 00:53:31 -0800 Subject: [PATCH 1/9] Judge invites! Template and template image pending change --- .../2026JudgeHubInviteTemplate.ts | 61 ++++++ app/(api)/_actions/emails/parseInviteCSV.ts | 86 ++++++++ .../emails/sendBulkJudgeHubInvites.ts | 110 ++++++++++ .../emails/sendSingleJudgeHubInvite.ts | 69 ++++++ app/(api)/_actions/emails/transporter.ts | 24 ++ .../JudgeInvites/JudgeBulkInviteForm.tsx | 205 ++++++++++++++++++ .../JudgeInvites/JudgeSingleInviteForm.tsx | 88 ++++++++ app/(pages)/admin/invite-judges/page.tsx | 31 +++ .../admin/invite-link/invite.module.scss | 5 - app/(pages)/admin/invite-link/page.tsx | 12 - app/(pages)/admin/page.tsx | 2 +- app/_types/emails.ts | 27 +++ public/email/2025_email_header.png | Bin 0 -> 199982 bytes 13 files changed, 702 insertions(+), 18 deletions(-) create mode 100644 app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts create mode 100644 app/(api)/_actions/emails/parseInviteCSV.ts create mode 100644 app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts create mode 100644 app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts create mode 100644 app/(api)/_actions/emails/transporter.ts create mode 100644 app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx create mode 100644 app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx create mode 100644 app/(pages)/admin/invite-judges/page.tsx delete mode 100644 app/(pages)/admin/invite-link/invite.module.scss delete mode 100644 app/(pages)/admin/invite-link/page.tsx create mode 100644 app/_types/emails.ts create mode 100644 public/email/2025_email_header.png diff --git a/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts b/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts new file mode 100644 index 000000000..2707bd8c2 --- /dev/null +++ b/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts @@ -0,0 +1,61 @@ +export default function judgeHubInviteTemplate( + fname: string, + inviteLink: string +) { + return ` + + + + + Judge Invitation - HackDavis 2026 + + + +
+ HackDavis 2026 +

Welcome to HackDavis 2026! πŸŽ‰

+
+

Hi ${fname},

+

We are thrilled to welcome you as a judge at HackDavis 2026! We're excited to have your expertise help our hackers bring their ideas to life.

+

Here's what you need to do:

+
    +
  • + Create your HackDavis Hub account by clicking the button below: +
    • This link is unique to you β€” do NOT share it with anyone.
    +
  • +
  • + Join our Discord at https://discord.gg/wc6QQEc to stay up to date with event details. +
  • +
+ Create Your Hub Account +

If the button doesn't work, copy and paste this link into your browser:

+

${inviteLink}

+

See you at HackDavis! ✨

+

The HackDavis Team

+
+
+ HackDavis 2026 +
+ +`; +} diff --git a/app/(api)/_actions/emails/parseInviteCSV.ts b/app/(api)/_actions/emails/parseInviteCSV.ts new file mode 100644 index 000000000..6152a7d5a --- /dev/null +++ b/app/(api)/_actions/emails/parseInviteCSV.ts @@ -0,0 +1,86 @@ +import { parse } from 'csv-parse/sync'; +import { z } from 'zod'; +import { JudgeInviteData } from '@typeDefs/emails'; + +const emailSchema = z.string().email(); + +interface ParseResult { + ok: true; + body: JudgeInviteData[]; +} + +interface ParseError { + ok: false; + error: string; +} + +export default function parseInviteCSV( + csvText: string +): ParseResult | ParseError { + try { + if (!csvText.trim()) { + return { ok: false, error: 'CSV file is empty.' }; + } + + const rows: string[][] = parse(csvText, { + trim: true, + skip_empty_lines: true, + }); + + if (rows.length === 0) { + return { ok: false, error: 'CSV file has no rows.' }; + } + + // Detect and skip header row + const firstRow = rows[0].map((cell) => cell.toLowerCase()); + const hasHeader = + firstRow.some((cell) => cell.includes('first')) || + firstRow.some((cell) => cell.includes('email')); + const dataRows = hasHeader ? rows.slice(1) : rows; + + if (dataRows.length === 0) { + return { ok: false, error: 'CSV has a header but no data rows.' }; + } + + const results: JudgeInviteData[] = []; + const errors: string[] = []; + + for (let i = 0; i < dataRows.length; i++) { + const row = dataRows[i]; + const rowNum = hasHeader ? i + 2 : i + 1; + + if (row.length < 3) { + errors.push(`Row ${rowNum}: expected 3 columns (First Name, Last Name, Email), got ${row.length}.`); + continue; + } + + const [firstName, lastName, email] = row; + + if (!firstName) { + errors.push(`Row ${rowNum}: First Name is empty.`); + continue; + } + if (!lastName) { + errors.push(`Row ${rowNum}: Last Name is empty.`); + continue; + } + + const emailResult = emailSchema.safeParse(email); + if (!emailResult.success) { + errors.push(`Row ${rowNum}: "${email}" is not a valid email address.`); + continue; + } + + results.push({ firstName, lastName, email }); + } + + if (errors.length > 0) { + return { ok: false, error: errors.join('\n') }; + } + + return { ok: true, body: results }; + } catch (e) { + const error = e as Error; + return { ok: false, error: `Failed to parse CSV: ${error.message}` }; + } +} diff --git a/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts b/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts new file mode 100644 index 000000000..aa4adb4ba --- /dev/null +++ b/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts @@ -0,0 +1,110 @@ +'use server'; + +import { GetManyUsers } from '@datalib/users/getUser'; +import parseInviteCSV from './parseInviteCSV'; +import sendSingleJudgeHubInvite from './sendSingleJudgeHubInvite'; +import { + BulkJudgeInviteResponse, + JudgeInviteData, + JudgeInviteResult, +} from '@typeDefs/emails'; + +const CONCURRENCY = 10; + +export default async function sendBulkJudgeHubInvites( + csvText: string +): Promise { + // Parse and validate CSV + const parsed = parseInviteCSV(csvText); + if (!parsed.ok) { + return { + ok: false, + results: [], + successCount: 0, + failureCount: 0, + error: parsed.error, + }; + } + + const allJudges = parsed.body; + const results: JudgeInviteResult[] = []; + let successCount = 0; + let failureCount = 0; + + const totalStartTime = Date.now(); + + // Single upfront duplicate check for all emails at once + const dupStart = Date.now(); + const allEmails = allJudges.map((j) => j.email); + const existingUsers = await GetManyUsers({ email: { $in: allEmails } }); + const existingEmailSet = new Set( + existingUsers.ok ? existingUsers.body.map((u: { email: string }) => u.email) : [] + ); + console.log( + `[Bulk Judge Invites] Duplicate check (${allEmails.length} emails): ${Date.now() - dupStart}ms β€” ${existingEmailSet.size} already registered` + ); + + // Partition judges into duplicates (immediate failure) and new (to send) + const judges: JudgeInviteData[] = []; + for (const judge of allJudges) { + if (existingEmailSet.has(judge.email)) { + results.push({ email: judge.email, success: false, error: 'User already exists.' }); + failureCount++; + } else { + judges.push(judge); + } + } + + const totalBatches = Math.ceil(judges.length / CONCURRENCY); + console.log( + `[Bulk Judge Invites] Sending to ${judges.length} new judges (concurrency: ${CONCURRENCY}, ${totalBatches} batches)` + ); + + for (let i = 0; i < judges.length; i += CONCURRENCY) { + const batch: JudgeInviteData[] = judges.slice(i, i + CONCURRENCY); + const batchNum = Math.floor(i / CONCURRENCY) + 1; + const batchStartTime = Date.now(); + console.log( + `[Bulk Judge Invites] Processing batch ${batchNum}/${totalBatches} (${batch.length} judges)` + ); + + const batchResults = await Promise.allSettled( + batch.map((judge) => sendSingleJudgeHubInvite(judge, true)) + ); + + for (let j = 0; j < batchResults.length; j++) { + const result = batchResults[j]; + const email = batch[j].email; + + if (result.status === 'fulfilled' && result.value.ok) { + results.push({ email, success: true, inviteUrl: result.value.inviteUrl }); + successCount++; + } else { + const errorMsg = + result.status === 'rejected' + ? result.reason?.message ?? 'Unknown error' + : result.value.error ?? 'Unknown error'; + console.error(`[Bulk Judge Invites] βœ— Failed: ${email}`, errorMsg); + results.push({ email, success: false, error: errorMsg }); + failureCount++; + } + } + + console.log( + `[Bulk Judge Invites] Batch ${batchNum}/${totalBatches} completed in ${Date.now() - batchStartTime}ms` + ); + } + + const totalTime = Date.now() - totalStartTime; + console.log( + `[Bulk Judge Invites] Complete: ${successCount} success, ${failureCount} failed in ${(totalTime / 1000).toFixed(1)}s` + ); + + return { + ok: failureCount === 0, + results, + successCount, + failureCount, + error: failureCount > 0 ? `${failureCount} invite(s) failed to send.` : null, + }; +} diff --git a/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts b/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts new file mode 100644 index 000000000..d2afa94bf --- /dev/null +++ b/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts @@ -0,0 +1,69 @@ +'use server'; + +import GenerateInvite from '@datalib/invite/generateInvite'; +import { GetManyUsers } from '@datalib/users/getUser'; +import { DuplicateError, HttpError } from '@utils/response/Errors'; +import judgeHubInviteTemplate from './emailFormats/2026JudgeHubInviteTemplate'; +import { DEFAULT_SENDER, transporter } from './transporter'; +import { JudgeInviteData, SingleJudgeInviteResponse } from '@typeDefs/emails'; + +export default async function sendSingleJudgeHubInvite( + options: JudgeInviteData, + skipDuplicateCheck = false +): Promise { + const totalStart = Date.now(); + const { firstName, lastName, email } = options; + + try { + console.log(`[Judge Hub Invite] Starting invite for ${email}`); + + // Step 1: duplicate check (skipped in bulk flow β€” checked upfront there) + if (!skipDuplicateCheck) { + const dupStart = Date.now(); + const users = await GetManyUsers({ email }); + console.log(`[Judge Hub Invite] Duplicate check: ${Date.now() - dupStart}ms`); + if (users.ok && users.body.length > 0) { + throw new DuplicateError(`User with email ${email} already exists.`); + } + } + + // Step 2: generate HMAC-signed invite link + const genStart = Date.now(); + const invite = await GenerateInvite( + { email, name: `${firstName} ${lastName}`, role: 'judge' }, + 'invite' + ); + console.log(`[Judge Hub Invite] Invite generation: ${Date.now() - genStart}ms`); + if (!invite.ok || !invite.body) { + throw new HttpError(invite.error ?? 'Failed to generate invite link.'); + } + + if (!DEFAULT_SENDER) { + throw new Error('Email configuration missing: SENDER_EMAIL is not set.'); + } + + const htmlContent = judgeHubInviteTemplate(firstName, invite.body); + + // Step 3: send email + const mailStart = Date.now(); + await transporter.sendMail({ + from: DEFAULT_SENDER, + to: email, + subject: "You're Invited to HackDavis 2026 - Create Your Hub Account", + html: htmlContent, + }); + console.log(`[Judge Hub Invite] sendMail: ${Date.now() - mailStart}ms`); + + console.log( + `[Judge Hub Invite] βœ“ Done (${email}) β€” total: ${Date.now() - totalStart}ms` + ); + return { ok: true, inviteUrl: invite.body, error: null }; + } catch (e) { + const error = e as HttpError; + console.error( + `[Judge Hub Invite] βœ— Failed (${email}) after ${Date.now() - totalStart}ms:`, + error.message + ); + return { ok: false, error: error.message }; + } +} diff --git a/app/(api)/_actions/emails/transporter.ts b/app/(api)/_actions/emails/transporter.ts new file mode 100644 index 000000000..6a68e661e --- /dev/null +++ b/app/(api)/_actions/emails/transporter.ts @@ -0,0 +1,24 @@ +import nodemailer from 'nodemailer'; + +const SENDER_EMAIL = process.env.SENDER_EMAIL; +const SENDER_PWD = process.env.SENDER_PWD; + +if (!SENDER_EMAIL || !SENDER_PWD) { + const missingVars: string[] = []; + if (!SENDER_EMAIL) missingVars.push('SENDER_EMAIL'); + if (!SENDER_PWD) missingVars.push('SENDER_PWD'); + console.error('Missing Environment Variable(s): ' + missingVars.join(', ')); +} + +export const transporter = nodemailer.createTransport({ + service: 'gmail', + pool: true, + maxConnections: 10, + maxMessages: Infinity, // don't recycle connections mid-batch + auth: { + user: SENDER_EMAIL, + pass: SENDER_PWD, + }, +}); + +export const DEFAULT_SENDER = SENDER_EMAIL; diff --git a/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx b/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx new file mode 100644 index 000000000..eb8a792ec --- /dev/null +++ b/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx @@ -0,0 +1,205 @@ +'use client'; + +import { ChangeEvent, useState } from 'react'; +import sendBulkJudgeHubInvites from '@actions/emails/sendBulkJudgeHubInvites'; +import { BulkJudgeInviteResponse, JudgeInviteData } from '@typeDefs/emails'; + +/** Browser-safe CSV preview parser (no Node.js deps). Full validation runs server-side. */ +function previewCSV(text: string): { ok: true; rows: JudgeInviteData[] } | { ok: false; error: string } { + const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean); + if (lines.length === 0) return { ok: false, error: 'CSV is empty.' }; + + const firstCells = lines[0].toLowerCase(); + const hasHeader = + firstCells.includes('first') || firstCells.includes('email'); + const dataLines = hasHeader ? lines.slice(1) : lines; + if (dataLines.length === 0) return { ok: false, error: 'No data rows found.' }; + + const rows: JudgeInviteData[] = []; + for (let i = 0; i < dataLines.length; i++) { + const cols = dataLines[i].split(',').map((c) => c.trim()); + if (cols.length < 3) { + return { ok: false, error: `Row ${hasHeader ? i + 2 : i + 1}: expected 3 columns, got ${cols.length}.` }; + } + rows.push({ firstName: cols[0], lastName: cols[1], email: cols[2] }); + } + return { ok: true, rows }; +} + +type Status = 'idle' | 'previewing' | 'sending' | 'done'; + +export default function JudgeBulkInviteForm() { + const [status, setStatus] = useState('idle'); + const [csvText, setCsvText] = useState(''); + const [preview, setPreview] = useState([]); + const [parseError, setParseError] = useState(''); + const [result, setResult] = useState(null); + + const handleFileChange = (e: ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + const reader = new FileReader(); + reader.onload = (ev) => { + const text = ev.target?.result as string; + setCsvText(text); + + const parsed = previewCSV(text); + if (parsed.ok) { + setPreview(parsed.rows); + setParseError(''); + setStatus('previewing'); + } else { + setParseError(parsed.error); + setPreview([]); + setStatus('idle'); + } + }; + reader.readAsText(file); + }; + + const handleSend = async () => { + setStatus('sending'); + setResult(null); + + const response = await sendBulkJudgeHubInvites(csvText); + setResult(response); + setStatus('done'); + }; + + const handleReset = () => { + setStatus('idle'); + setCsvText(''); + setPreview([]); + setParseError(''); + setResult(null); + }; + + return ( +
+ {/* File input */} +
+ + +
+ + {/* Parse error */} + {parseError && ( +
+

CSV errors:

+
{parseError}
+
+ )} + + {/* Preview table */} + {status === 'previewing' && preview.length > 0 && ( +
+

+ {preview.length} judge + {preview.length !== 1 ? 's' : ''} found. Review before sending: +

+
+
+ + + + + + + + + + {preview.map((judge, i) => ( + + + + + + ))} + +
+ First Name + + Last Name + + Email +
{judge.firstName}{judge.lastName}{judge.email}
+
+
+ +
+ )} + + {/* Sending spinner */} + {status === 'sending' && ( +
+
+ Sending invites… +
+ )} + + {/* Results */} + {status === 'done' && result && ( +
+
+
+

{result.successCount}

+

Sent

+
+
+

{result.failureCount}

+

Failed

+
+
+ + {result.failureCount > 0 && ( +
+

+ Failed invites +

+
+ {result.results + .filter((r) => !r.success) + .map((r, i) => ( +
+ {r.email} + {r.error} +
+ ))} +
+
+ )} + + +
+ )} +
+ ); +} diff --git a/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx b/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx new file mode 100644 index 000000000..00a9b434f --- /dev/null +++ b/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx @@ -0,0 +1,88 @@ +'use client'; + +import { FormEvent, useState } from 'react'; +import sendSingleJudgeHubInvite from '@actions/emails/sendSingleJudgeHubInvite'; + +export default function JudgeSingleInviteForm() { + const [loading, setLoading] = useState(false); + const [inviteUrl, setInviteUrl] = useState(''); + const [error, setError] = useState(''); + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + setLoading(true); + setInviteUrl(''); + setError(''); + + const formData = new FormData(e.currentTarget); + const firstName = formData.get('firstName') as string; + const lastName = formData.get('lastName') as string; + const email = formData.get('email') as string; + + const result = await sendSingleJudgeHubInvite({ firstName, lastName, email }); + + setLoading(false); + + if (result.ok) { + setInviteUrl(result.inviteUrl ?? ''); + (e.target as HTMLFormElement).reset(); + } else { + setError(result.error ?? 'An unexpected error occurred.'); + } + }; + + return ( +
+
+
+ + +
+
+ + +
+
+ +
+ + +
+ + + + {error && ( +

+ {error} +

+ )} + {inviteUrl && ( +
+

Invite sent!

+

{inviteUrl}

+
+ )} +
+ ); +} diff --git a/app/(pages)/admin/invite-judges/page.tsx b/app/(pages)/admin/invite-judges/page.tsx new file mode 100644 index 000000000..c878b3f49 --- /dev/null +++ b/app/(pages)/admin/invite-judges/page.tsx @@ -0,0 +1,31 @@ +'use client'; + +import JudgeSingleInviteForm from '../_components/JudgeInvites/JudgeSingleInviteForm'; +import JudgeBulkInviteForm from '../_components/JudgeInvites/JudgeBulkInviteForm'; + +export default function InviteJudgesPage() { + return ( +
+

Invite Judges

+ +
+

Invite a Judge

+

+ Send a HackDavis Hub invite to a single judge by entering their details below. +

+ +
+ +
+ +
+

Bulk Invite Judges

+

+ Upload a CSV with columns First Name, Last Name, Email to + send Hub invites to multiple judges at once. +

+ +
+
+ ); +} diff --git a/app/(pages)/admin/invite-link/invite.module.scss b/app/(pages)/admin/invite-link/invite.module.scss deleted file mode 100644 index 847ca7f68..000000000 --- a/app/(pages)/admin/invite-link/invite.module.scss +++ /dev/null @@ -1,5 +0,0 @@ -.container { - min-height: 100vh; - background-color: var(--background-tertiary); - padding: 24px; -} \ No newline at end of file diff --git a/app/(pages)/admin/invite-link/page.tsx b/app/(pages)/admin/invite-link/page.tsx deleted file mode 100644 index 1e03eb424..000000000 --- a/app/(pages)/admin/invite-link/page.tsx +++ /dev/null @@ -1,12 +0,0 @@ -'use client'; - -import InviteLinkForm from '../_components/InviteLinkForm/InviteLinkForm'; -import styles from './invite.module.scss'; - -export default function AdminInviteLinkPage() { - return ( -
- -
- ); -} diff --git a/app/(pages)/admin/page.tsx b/app/(pages)/admin/page.tsx index c7a1f1b5d..e9a42d773 100644 --- a/app/(pages)/admin/page.tsx +++ b/app/(pages)/admin/page.tsx @@ -22,7 +22,7 @@ const action_links = [ body: 'Create Panels', }, { - href: '/admin/invite-link', + href: '/admin/invite-judges', body: 'Invite Judges', }, { diff --git a/app/_types/emails.ts b/app/_types/emails.ts new file mode 100644 index 000000000..9d2c29912 --- /dev/null +++ b/app/_types/emails.ts @@ -0,0 +1,27 @@ +// Judge Hub invite types +export interface JudgeInviteData { + firstName: string; + lastName: string; + email: string; +} + +export interface JudgeInviteResult { + email: string; + success: boolean; + inviteUrl?: string; + error?: string; +} + +export interface BulkJudgeInviteResponse { + ok: boolean; + results: JudgeInviteResult[]; + successCount: number; + failureCount: number; + error: string | null; +} + +export interface SingleJudgeInviteResponse { + ok: boolean; + inviteUrl?: string; + error: string | null; +} diff --git a/public/email/2025_email_header.png b/public/email/2025_email_header.png new file mode 100644 index 0000000000000000000000000000000000000000..0c829d6934273bb03a0f1e6e1d501d832c34f32a GIT binary patch literal 199982 zcmY(q1x#Gg)&@HG;DbwXcc&e+xVyVM6n87`?oM%cr?|ruC{A&AFO-1-ecYG4d;hnR z$s{K^Cws5`oh9G;PPB@WG&%|~3IG5=mz9xF0|4O7005X_AmaNKC;1+?_dj?yF##}1Nh4#wO6ovKXQ){)-+DDe(b7|Aosa%Rbi$|nYdPG#QMfMP3F4*w>X4|+0 z9s}H!XYV%+4K=f|-l(~_sHv%2ntgq{tF8AxIdxZa?L+r|Km(sf3BugoI01!lA~4PX z_<)cfJ*R)6MW6ri^trt9pA{gD`SeRPH~!ZMRX~6^w=@!@!q;T-VWh`PxP6ked&M#$ zZ|50N;NXunroMj*UqjqbQ7b#^m%3QUyj8>+cmH~OyW<+a<$g}+eemTWYd6gJGRuj% zyR&^0&>CVg5Z3bF=Qk39L9k)V&e#>Q30uw~ct zKqRl6*L-%wn5bl(4V(A-L(G5a{`Y3oShR^x8^Y$Dy?x70E}pnoA9Hoi-FHCPmkN!I z-akc=MHe19`;f+yU-95115;54lfTf-u z_8xdOmme9*{v39U>cf%*i37FPzijB}M%O>U!AXux$o{?<63od@*le&d{jaG4SF|$b zOoNvwyG59StdEYv6SMl{%uSnmDFCoDEvjD{ z6aW7>BOhjl&p^)E!;&a7Gvk?c#)O)t(y^go|6-^|h-7q+6

W`=zPqwlZC1_lNe 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≪P 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⩽OZL1BaqINE5*@eUFLm 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 literal 0 HcmV?d00001 From 302ee394e2660063f30dd2685b5077a35df9d252 Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 00:57:13 -0800 Subject: [PATCH 2/9] Linty lint --- app/(api)/_actions/emails/parseInviteCSV.ts | 4 +- .../emails/sendBulkJudgeHubInvites.ts | 31 ++++++++++--- .../emails/sendSingleJudgeHubInvite.ts | 16 +++++-- .../JudgeInvites/JudgeBulkInviteForm.tsx | 43 ++++++++++++++----- .../JudgeInvites/JudgeSingleInviteForm.tsx | 14 ++++-- app/(pages)/admin/invite-judges/page.tsx | 10 +++-- 6 files changed, 90 insertions(+), 28 deletions(-) diff --git a/app/(api)/_actions/emails/parseInviteCSV.ts b/app/(api)/_actions/emails/parseInviteCSV.ts index 6152a7d5a..57ba39fd4 100644 --- a/app/(api)/_actions/emails/parseInviteCSV.ts +++ b/app/(api)/_actions/emails/parseInviteCSV.ts @@ -50,7 +50,9 @@ export default function parseInviteCSV( const rowNum = hasHeader ? i + 2 : i + 1; if (row.length < 3) { - errors.push(`Row ${rowNum}: expected 3 columns (First Name, Last Name, Email), got ${row.length}.`); + errors.push( + `Row ${rowNum}: expected 3 columns (First Name, Last Name, Email), got ${row.length}.` + ); continue; } diff --git a/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts b/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts index aa4adb4ba..37d511db7 100644 --- a/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts +++ b/app/(api)/_actions/emails/sendBulkJudgeHubInvites.ts @@ -38,17 +38,25 @@ export default async function sendBulkJudgeHubInvites( const allEmails = allJudges.map((j) => j.email); const existingUsers = await GetManyUsers({ email: { $in: allEmails } }); const existingEmailSet = new Set( - existingUsers.ok ? existingUsers.body.map((u: { email: string }) => u.email) : [] + existingUsers.ok + ? existingUsers.body.map((u: { email: string }) => u.email) + : [] ); console.log( - `[Bulk Judge Invites] Duplicate check (${allEmails.length} emails): ${Date.now() - dupStart}ms β€” ${existingEmailSet.size} already registered` + `[Bulk Judge Invites] Duplicate check (${allEmails.length} emails): ${ + Date.now() - dupStart + }ms β€” ${existingEmailSet.size} already registered` ); // Partition judges into duplicates (immediate failure) and new (to send) const judges: JudgeInviteData[] = []; for (const judge of allJudges) { if (existingEmailSet.has(judge.email)) { - results.push({ email: judge.email, success: false, error: 'User already exists.' }); + results.push({ + email: judge.email, + success: false, + error: 'User already exists.', + }); failureCount++; } else { judges.push(judge); @@ -77,7 +85,11 @@ export default async function sendBulkJudgeHubInvites( const email = batch[j].email; if (result.status === 'fulfilled' && result.value.ok) { - results.push({ email, success: true, inviteUrl: result.value.inviteUrl }); + results.push({ + email, + success: true, + inviteUrl: result.value.inviteUrl, + }); successCount++; } else { const errorMsg = @@ -91,13 +103,17 @@ export default async function sendBulkJudgeHubInvites( } console.log( - `[Bulk Judge Invites] Batch ${batchNum}/${totalBatches} completed in ${Date.now() - batchStartTime}ms` + `[Bulk Judge Invites] Batch ${batchNum}/${totalBatches} completed in ${ + Date.now() - batchStartTime + }ms` ); } const totalTime = Date.now() - totalStartTime; console.log( - `[Bulk Judge Invites] Complete: ${successCount} success, ${failureCount} failed in ${(totalTime / 1000).toFixed(1)}s` + `[Bulk Judge Invites] Complete: ${successCount} success, ${failureCount} failed in ${( + totalTime / 1000 + ).toFixed(1)}s` ); return { @@ -105,6 +121,7 @@ export default async function sendBulkJudgeHubInvites( results, successCount, failureCount, - error: failureCount > 0 ? `${failureCount} invite(s) failed to send.` : null, + error: + failureCount > 0 ? `${failureCount} invite(s) failed to send.` : null, }; } diff --git a/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts b/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts index d2afa94bf..3ca2d0af8 100644 --- a/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts +++ b/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts @@ -21,7 +21,9 @@ export default async function sendSingleJudgeHubInvite( if (!skipDuplicateCheck) { const dupStart = Date.now(); const users = await GetManyUsers({ email }); - console.log(`[Judge Hub Invite] Duplicate check: ${Date.now() - dupStart}ms`); + console.log( + `[Judge Hub Invite] Duplicate check: ${Date.now() - dupStart}ms` + ); if (users.ok && users.body.length > 0) { throw new DuplicateError(`User with email ${email} already exists.`); } @@ -33,7 +35,9 @@ export default async function sendSingleJudgeHubInvite( { email, name: `${firstName} ${lastName}`, role: 'judge' }, 'invite' ); - console.log(`[Judge Hub Invite] Invite generation: ${Date.now() - genStart}ms`); + console.log( + `[Judge Hub Invite] Invite generation: ${Date.now() - genStart}ms` + ); if (!invite.ok || !invite.body) { throw new HttpError(invite.error ?? 'Failed to generate invite link.'); } @@ -55,13 +59,17 @@ export default async function sendSingleJudgeHubInvite( console.log(`[Judge Hub Invite] sendMail: ${Date.now() - mailStart}ms`); console.log( - `[Judge Hub Invite] βœ“ Done (${email}) β€” total: ${Date.now() - totalStart}ms` + `[Judge Hub Invite] βœ“ Done (${email}) β€” total: ${ + Date.now() - totalStart + }ms` ); return { ok: true, inviteUrl: invite.body, error: null }; } catch (e) { const error = e as HttpError; console.error( - `[Judge Hub Invite] βœ— Failed (${email}) after ${Date.now() - totalStart}ms:`, + `[Judge Hub Invite] βœ— Failed (${email}) after ${ + Date.now() - totalStart + }ms:`, error.message ); return { ok: false, error: error.message }; diff --git a/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx b/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx index eb8a792ec..a396167da 100644 --- a/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx +++ b/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx @@ -5,21 +5,32 @@ import sendBulkJudgeHubInvites from '@actions/emails/sendBulkJudgeHubInvites'; import { BulkJudgeInviteResponse, JudgeInviteData } from '@typeDefs/emails'; /** Browser-safe CSV preview parser (no Node.js deps). Full validation runs server-side. */ -function previewCSV(text: string): { ok: true; rows: JudgeInviteData[] } | { ok: false; error: string } { - const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean); +function previewCSV( + text: string +): { ok: true; rows: JudgeInviteData[] } | { ok: false; error: string } { + const lines = text + .split(/\r?\n/) + .map((l) => l.trim()) + .filter(Boolean); if (lines.length === 0) return { ok: false, error: 'CSV is empty.' }; const firstCells = lines[0].toLowerCase(); const hasHeader = firstCells.includes('first') || firstCells.includes('email'); const dataLines = hasHeader ? lines.slice(1) : lines; - if (dataLines.length === 0) return { ok: false, error: 'No data rows found.' }; + if (dataLines.length === 0) + return { ok: false, error: 'No data rows found.' }; const rows: JudgeInviteData[] = []; for (let i = 0; i < dataLines.length; i++) { const cols = dataLines[i].split(',').map((c) => c.trim()); if (cols.length < 3) { - return { ok: false, error: `Row ${hasHeader ? i + 2 : i + 1}: expected 3 columns, got ${cols.length}.` }; + return { + ok: false, + error: `Row ${hasHeader ? i + 2 : i + 1}: expected 3 columns, got ${ + cols.length + }.`, + }; } rows.push({ firstName: cols[0], lastName: cols[1], email: cols[2] }); } @@ -98,7 +109,9 @@ export default function JudgeBulkInviteForm() { {parseError && (

CSV errors:

-
{parseError}
+
+            {parseError}
+          
)} @@ -131,8 +144,12 @@ export default function JudgeBulkInviteForm() { key={i} className={i % 2 === 0 ? 'bg-white' : 'bg-gray-50'} > - {judge.firstName} - {judge.lastName} + + {judge.firstName} + + + {judge.lastName} + {judge.email} ))} @@ -162,11 +179,15 @@ export default function JudgeBulkInviteForm() {
-

{result.successCount}

+

+ {result.successCount} +

Sent

-

{result.failureCount}

+

+ {result.failureCount} +

Failed

@@ -184,7 +205,9 @@ export default function JudgeBulkInviteForm() { key={i} className="flex flex-col gap-0.5 px-4 py-2 border-b border-gray-100 last:border-0" > - {r.email} + + {r.email} + {r.error}
))} diff --git a/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx b/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx index 00a9b434f..8b5e00d2b 100644 --- a/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx +++ b/app/(pages)/admin/_components/JudgeInvites/JudgeSingleInviteForm.tsx @@ -19,7 +19,11 @@ export default function JudgeSingleInviteForm() { const lastName = formData.get('lastName') as string; const email = formData.get('email') as string; - const result = await sendSingleJudgeHubInvite({ firstName, lastName, email }); + const result = await sendSingleJudgeHubInvite({ + firstName, + lastName, + email, + }); setLoading(false); @@ -35,7 +39,9 @@ export default function JudgeSingleInviteForm() {
- + -

Invite sent!

+

+ Invite sent! +

{inviteUrl}

)} diff --git a/app/(pages)/admin/invite-judges/page.tsx b/app/(pages)/admin/invite-judges/page.tsx index c878b3f49..c892ef0ba 100644 --- a/app/(pages)/admin/invite-judges/page.tsx +++ b/app/(pages)/admin/invite-judges/page.tsx @@ -11,7 +11,8 @@ export default function InviteJudgesPage() {

Invite a Judge

- Send a HackDavis Hub invite to a single judge by entering their details below. + Send a HackDavis Hub invite to a single judge by entering their + details below.

@@ -21,8 +22,11 @@ export default function InviteJudgesPage() {

Bulk Invite Judges

- Upload a CSV with columns First Name, Last Name, Email to - send Hub invites to multiple judges at once. + Upload a CSV with columns{' '} + + First Name, Last Name, Email + {' '} + to send Hub invites to multiple judges at once.

From f4d23713930dc33220d777997414c2fa0e9b5dec Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 01:09:52 -0800 Subject: [PATCH 3/9] Fix image URL and error handling for sending emails --- .../emails/emailFormats/2026JudgeHubInviteTemplate.ts | 4 ++-- app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts b/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts index 2707bd8c2..dc9010166 100644 --- a/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts +++ b/app/(api)/_actions/emails/emailFormats/2026JudgeHubInviteTemplate.ts @@ -32,7 +32,7 @@ export default function judgeHubInviteTemplate(
- HackDavis 2026 + HackDavis 2026

Welcome to HackDavis 2026! πŸŽ‰

Hi ${fname},

@@ -54,7 +54,7 @@ export default function judgeHubInviteTemplate(

The HackDavis Team

- HackDavis 2026 + HackDavis 2026
`; diff --git a/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts b/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts index 3ca2d0af8..e9863a1b4 100644 --- a/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts +++ b/app/(api)/_actions/emails/sendSingleJudgeHubInvite.ts @@ -65,13 +65,18 @@ export default async function sendSingleJudgeHubInvite( ); return { ok: true, inviteUrl: invite.body, error: null }; } catch (e) { - const error = e as HttpError; + const errorMessage = + e instanceof Error + ? e.message + : typeof e === 'string' + ? e + : 'Unknown error'; console.error( `[Judge Hub Invite] βœ— Failed (${email}) after ${ Date.now() - totalStart }ms:`, - error.message + errorMessage ); - return { ok: false, error: error.message }; + return { ok: false, error: errorMessage }; } } From 2ee04c426a347bb8cecfcded2102606ebc39290f Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 01:15:15 -0800 Subject: [PATCH 4/9] Document browser preview csv parser --- .../admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx b/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx index a396167da..6d78a0a62 100644 --- a/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx +++ b/app/(pages)/admin/_components/JudgeInvites/JudgeBulkInviteForm.tsx @@ -4,7 +4,11 @@ import { ChangeEvent, useState } from 'react'; import sendBulkJudgeHubInvites from '@actions/emails/sendBulkJudgeHubInvites'; import { BulkJudgeInviteResponse, JudgeInviteData } from '@typeDefs/emails'; -/** Browser-safe CSV preview parser (no Node.js deps). Full validation runs server-side. */ +/** + * Browser-safe CSV preview parser (no Node.js deps). Full validation runs server-side. + * Note: uses simple comma-split, so quoted fields containing commas are not supported. + * This is acceptable since judge names/emails rarely contain commas. + */ function previewCSV( text: string ): { ok: true; rows: JudgeInviteData[] } | { ok: false; error: string } { From 47aef860a289b72f9eee520e64506d7697d1aba9 Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 01:15:48 -0800 Subject: [PATCH 5/9] Throw error for missing email ENV vars --- app/(api)/_actions/emails/transporter.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/(api)/_actions/emails/transporter.ts b/app/(api)/_actions/emails/transporter.ts index 6a68e661e..ada44c0a3 100644 --- a/app/(api)/_actions/emails/transporter.ts +++ b/app/(api)/_actions/emails/transporter.ts @@ -3,11 +3,15 @@ import nodemailer from 'nodemailer'; const SENDER_EMAIL = process.env.SENDER_EMAIL; const SENDER_PWD = process.env.SENDER_PWD; -if (!SENDER_EMAIL || !SENDER_PWD) { - const missingVars: string[] = []; - if (!SENDER_EMAIL) missingVars.push('SENDER_EMAIL'); - if (!SENDER_PWD) missingVars.push('SENDER_PWD'); - console.error('Missing Environment Variable(s): ' + missingVars.join(', ')); +const missingVars: string[] = []; +if (!SENDER_EMAIL) missingVars.push('SENDER_EMAIL'); +if (!SENDER_PWD) missingVars.push('SENDER_PWD'); +if (missingVars.length > 0) { + throw new Error( + `Email transporter: missing environment variable(s): ${missingVars.join( + ', ' + )}` + ); } export const transporter = nodemailer.createTransport({ From 3e8893037311bf5dfdc019625a6ba2d93f86f19b Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 02:08:57 -0800 Subject: [PATCH 6/9] Single mentor invite --- .../emailFormats/2026MentorInviteTemplate.ts | 60 +++++++ .../_actions/emails/sendSingleMentorInvite.ts | 64 +++++++ .../_actions/tito/createRsvpInvitation.ts | 73 ++++++++ .../tito/deleteRsvpInvitationByEmail.ts | 51 ++++++ .../tito/getOrCreateTitoInvitation.ts | 60 +++++++ app/(api)/_actions/tito/getReleases.ts | 20 +++ .../_actions/tito/getRsvpInvitationByEmail.ts | 38 ++++ app/(api)/_actions/tito/getRsvpLists.ts | 20 +++ app/(api)/_actions/tito/titoClient.ts | 38 ++++ .../MentorInvites/MentorInvitesPanel.tsx | 57 ++++++ .../MentorInvites/MentorSingleInviteForm.tsx | 168 ++++++++++++++++++ .../admin/_utils/generateInviteResultsCSV.ts | 48 +++++ app/_types/emails.ts | 21 +++ app/_types/tito.ts | 41 +++++ 14 files changed, 759 insertions(+) create mode 100644 app/(api)/_actions/emails/emailFormats/2026MentorInviteTemplate.ts create mode 100644 app/(api)/_actions/emails/sendSingleMentorInvite.ts create mode 100644 app/(api)/_actions/tito/createRsvpInvitation.ts create mode 100644 app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts create mode 100644 app/(api)/_actions/tito/getOrCreateTitoInvitation.ts create mode 100644 app/(api)/_actions/tito/getReleases.ts create mode 100644 app/(api)/_actions/tito/getRsvpInvitationByEmail.ts create mode 100644 app/(api)/_actions/tito/getRsvpLists.ts create mode 100644 app/(api)/_actions/tito/titoClient.ts create mode 100644 app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx create mode 100644 app/(pages)/admin/_components/MentorInvites/MentorSingleInviteForm.tsx create mode 100644 app/(pages)/admin/_utils/generateInviteResultsCSV.ts create mode 100644 app/_types/tito.ts diff --git a/app/(api)/_actions/emails/emailFormats/2026MentorInviteTemplate.ts b/app/(api)/_actions/emails/emailFormats/2026MentorInviteTemplate.ts new file mode 100644 index 000000000..0d51ba6e4 --- /dev/null +++ b/app/(api)/_actions/emails/emailFormats/2026MentorInviteTemplate.ts @@ -0,0 +1,60 @@ +export default function mentorInviteTemplate(fname: string, titoUrl: string) { + return ` + + + + + Mentor Invitation - HackDavis 2026 + + + +
+ HackDavis 2026 +

Congratulations from HackDavis! πŸŽ‰

+
+

Hi ${fname},

+

We are thrilled to welcome you as a mentor at HackDavis 2026! We're excited to have your expertise help our hackers bring their ideas to life.

+

Here's what we need from you:

+
+ Claim Your Mentor Ticket +

If the button doesn't work, copy and paste this link into your browser:

+

${titoUrl}

+

After claiming your ticket, you will receive a unique QR code for check-in at the event.

+

See you at HackDavis! ✨

+

The HackDavis Team

+
+
+ HackDavis 2026 +
+ +`; +} diff --git a/app/(api)/_actions/emails/sendSingleMentorInvite.ts b/app/(api)/_actions/emails/sendSingleMentorInvite.ts new file mode 100644 index 000000000..4f3a5abbb --- /dev/null +++ b/app/(api)/_actions/emails/sendSingleMentorInvite.ts @@ -0,0 +1,64 @@ +'use server'; + +import getOrCreateTitoInvitation from '@actions/tito/getOrCreateTitoInvitation'; +import mentorInviteTemplate from './emailFormats/2026MentorInviteTemplate'; +import { DEFAULT_SENDER, transporter } from './transporter'; +import { MentorInviteData, SingleMentorInviteResponse } from '@typeDefs/emails'; + +interface MentorInviteOptions extends MentorInviteData { + rsvpListSlug: string; + releaseIds: string; +} + +export default async function sendSingleMentorInvite( + options: MentorInviteOptions +): Promise { + const totalStart = Date.now(); + const { firstName, lastName, email, rsvpListSlug, releaseIds } = options; + + try { + console.log(`[Mentor Invite] Starting invite for ${email}`); + + // Step 1: Get or create Tito invitation (with duplicate recovery) + const titoStart = Date.now(); + const titoResult = await getOrCreateTitoInvitation({ + firstName, + lastName, + email, + rsvpListSlug, + releaseIds, + }); + console.log(`[Mentor Invite] Tito: ${Date.now() - titoStart}ms`); + + if (!titoResult.ok) { + throw new Error(titoResult.error); + } + + if (!DEFAULT_SENDER) { + throw new Error('Email configuration missing: SENDER_EMAIL is not set.'); + } + + // Step 2: Send email with Tito URL + const mailStart = Date.now(); + await transporter.sendMail({ + from: DEFAULT_SENDER, + to: email, + subject: "You're Invited to Mentor at HackDavis 2026", + html: mentorInviteTemplate(firstName, titoResult.titoUrl), + }); + console.log(`[Mentor Invite] sendMail: ${Date.now() - mailStart}ms`); + + console.log( + `[Mentor Invite] βœ“ Done (${email}) β€” total: ${Date.now() - totalStart}ms` + ); + return { ok: true, titoUrl: titoResult.titoUrl, error: null }; + } catch (e) { + const errorMessage = + e instanceof Error ? e.message : typeof e === 'string' ? e : 'Unknown error'; + console.error( + `[Mentor Invite] βœ— Failed (${email}) after ${Date.now() - totalStart}ms:`, + errorMessage + ); + return { ok: false, error: errorMessage }; + } +} diff --git a/app/(api)/_actions/tito/createRsvpInvitation.ts b/app/(api)/_actions/tito/createRsvpInvitation.ts new file mode 100644 index 000000000..8e099eefc --- /dev/null +++ b/app/(api)/_actions/tito/createRsvpInvitation.ts @@ -0,0 +1,73 @@ +'use server'; + +import { ReleaseInvitation, ReleaseInvitationRequest, TitoResponse } from '@typeDefs/tito'; +import { TitoRequest } from './titoClient'; + +const MAX_RETRIES = 5; +const BASE_DELAY_MS = 1000; + +async function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +export default async function createRsvpInvitation( + data: ReleaseInvitationRequest +): Promise> { + try { + if (!data.email?.trim()) throw new Error('Email is required'); + if (!data.rsvpListSlug) throw new Error('RSVP list slug is required'); + if (!data.releaseIds?.trim()) throw new Error('Release IDs are required'); + + const releaseIdsArray = data.releaseIds + .split(',') + .map((id) => parseInt(id.trim(), 10)) + .filter((id) => !isNaN(id)); + + if (releaseIdsArray.length === 0) { + throw new Error('Invalid release IDs format. Use comma-separated numbers.'); + } + + const requestBody: { + email: string; + release_ids: number[]; + first_name?: string; + last_name?: string; + discount_code?: string; + } = { email: data.email.trim(), release_ids: releaseIdsArray }; + + if (data.firstName?.trim()) requestBody.first_name = data.firstName.trim(); + if (data.lastName?.trim()) requestBody.last_name = data.lastName.trim(); + if (data.discountCode?.trim()) requestBody.discount_code = data.discountCode.trim(); + + const url = `/rsvp_lists/${data.rsvpListSlug}/release_invitations`; + + for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) { + try { + const response = await TitoRequest<{ release_invitation: ReleaseInvitation }>(url, { + method: 'POST', + body: JSON.stringify({ release_invitation: requestBody }), + }); + console.log(`[Tito] βœ“ Created invitation for ${data.email}`); + return { ok: true, body: response.release_invitation, error: null }; + } catch (err: any) { + if (err.message.includes('429') && attempt < MAX_RETRIES) { + const waitMs = err.retryAfter + ? parseFloat(err.retryAfter) * BASE_DELAY_MS + : Math.pow(2, attempt) * BASE_DELAY_MS + Math.random() * BASE_DELAY_MS; + console.warn( + `[Tito] 429 rate-limited for ${data.email}, retrying in ${Math.round(waitMs)}ms (attempt ${attempt + 1}/${MAX_RETRIES})` + ); + await delay(waitMs); + continue; + } + throw err; + } + } + + throw new Error('Tito API rate limit exceeded after 5 retries'); + } catch (e) { + const error = e instanceof Error ? e.message : 'Unknown error'; + console.error('[Tito] createRsvpInvitation failed:', error); + return { ok: false, body: null, error }; + } +} diff --git a/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts b/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts new file mode 100644 index 000000000..7f5ed7e5c --- /dev/null +++ b/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts @@ -0,0 +1,51 @@ +'use server'; + +import { ReleaseInvitation } from '@typeDefs/tito'; +import { TitoRequest } from './titoClient'; + +export default async function deleteRsvpInvitationByEmail( + rsvpListSlug: string, + email: string +): Promise<{ ok: boolean; error: string | null }> { + try { + const normalizedEmail = email.trim().toLowerCase(); + if (!normalizedEmail) throw new Error('Email is required'); + if (!rsvpListSlug?.trim()) throw new Error('RSVP list slug is required'); + + const pageSize = 1000; + let page = 1; + let foundSlug: string | null = null; + + while (!foundSlug) { + const url = `/rsvp_lists/${rsvpListSlug}/release_invitations?page[size]=${pageSize}&page[number]=${page}`; + const data = await TitoRequest<{ release_invitations: ReleaseInvitation[] }>(url); + const invitations = data.release_invitations ?? []; + + const match = invitations.find( + (inv) => inv.email?.toLowerCase() === normalizedEmail + ); + if (match?.slug) { + foundSlug = match.slug; + break; + } + + if (invitations.length < pageSize) break; + page++; + } + + if (!foundSlug) { + return { ok: false, error: 'No existing invitation found for this email' }; + } + + await TitoRequest(`/rsvp_lists/${rsvpListSlug}/release_invitations/${foundSlug}`, { + method: 'DELETE', + }); + + console.log(`[Tito] Deleted invitation for ${email}`); + return { ok: true, error: null }; + } catch (e) { + const error = e instanceof Error ? e.message : 'Unknown error'; + console.error('[Tito] deleteRsvpInvitationByEmail failed:', error); + return { ok: false, error }; + } +} diff --git a/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts b/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts new file mode 100644 index 000000000..b3256c4a4 --- /dev/null +++ b/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts @@ -0,0 +1,60 @@ +'use server'; + +import createRsvpInvitation from './createRsvpInvitation'; +import getRsvpInvitationByEmail from './getRsvpInvitationByEmail'; +import deleteRsvpInvitationByEmail from './deleteRsvpInvitationByEmail'; +import { ReleaseInvitationRequest } from '@typeDefs/tito'; + +function isDuplicateTicketError(error: string | null | undefined): boolean { + if (!error) return false; + const normalized = error.toLowerCase(); + return ( + normalized.includes('already has a tito ticket attached') || + normalized.includes('already has a ticket attached') || + normalized.includes('email has already been taken') || + normalized.includes('has already been taken') || + (normalized.includes('"email"') && normalized.includes('already taken')) || + normalized.includes('already exists') || + (normalized.includes('already') && normalized.includes('invitation')) + ); +} + +export default async function getOrCreateTitoInvitation( + data: ReleaseInvitationRequest +): Promise<{ ok: true; titoUrl: string } | { ok: false; error: string }> { + const { email, rsvpListSlug } = data; + + let titoResponse = await createRsvpInvitation(data); + + // Duplicate recovery: reuse existing URL if possible, otherwise delete + recreate + if (!titoResponse.ok && isDuplicateTicketError(titoResponse.error)) { + console.warn(`[Tito] Duplicate detected for ${email}, attempting recovery`); + + const existingRes = await getRsvpInvitationByEmail(rsvpListSlug, email); + if (existingRes.ok && existingRes.body) { + const existingUrl = existingRes.body.unique_url ?? existingRes.body.url; + if (existingUrl) { + console.log(`[Tito] Reusing existing URL for ${email}`); + return { ok: true, titoUrl: existingUrl }; + } + } + + console.warn(`[Tito] No usable URL found, deleting and recreating for ${email}`); + const deleteRes = await deleteRsvpInvitationByEmail(rsvpListSlug, email); + if (!deleteRes.ok) { + return { ok: false, error: `Duplicate recovery failed (delete): ${deleteRes.error}` }; + } + titoResponse = await createRsvpInvitation(data); + } + + if (!titoResponse.ok || !titoResponse.body) { + return { ok: false, error: titoResponse.error ?? 'Failed to create Tito invitation' }; + } + + const titoUrl = titoResponse.body.unique_url ?? titoResponse.body.url; + if (!titoUrl) { + return { ok: false, error: 'Tito invitation created but no URL was returned' }; + } + + return { ok: true, titoUrl }; +} diff --git a/app/(api)/_actions/tito/getReleases.ts b/app/(api)/_actions/tito/getReleases.ts new file mode 100644 index 000000000..e3c66b8bd --- /dev/null +++ b/app/(api)/_actions/tito/getReleases.ts @@ -0,0 +1,20 @@ +'use server'; + +import { Release, TitoResponse } from '@typeDefs/tito'; +import { TitoRequest } from './titoClient'; + +export default async function getReleases(): Promise> { + try { + const start = Date.now(); + const data = await TitoRequest<{ releases: Release[] }>('/releases'); + console.log(`[Tito] getReleases: ${Date.now() - start}ms`); + + const releases = data.releases ?? []; + console.log(`[Tito] Fetched ${releases.length} releases`); + return { ok: true, body: releases, error: null }; + } catch (e) { + const error = e instanceof Error ? e.message : 'Unknown error'; + console.error('[Tito] getReleases failed:', error); + return { ok: false, body: null, error }; + } +} diff --git a/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts b/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts new file mode 100644 index 000000000..2f169dbf7 --- /dev/null +++ b/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts @@ -0,0 +1,38 @@ +'use server'; + +import { ReleaseInvitation, TitoResponse } from '@typeDefs/tito'; +import { TitoRequest } from './titoClient'; + +export default async function getRsvpInvitationByEmail( + rsvpListSlug: string, + email: string +): Promise> { + try { + const normalizedEmail = email.trim().toLowerCase(); + if (!normalizedEmail) throw new Error('Email is required'); + if (!rsvpListSlug?.trim()) throw new Error('RSVP list slug is required'); + + const pageSize = 1000; + let page = 1; + + while (true) { + const url = `/rsvp_lists/${rsvpListSlug}/release_invitations?page[size]=${pageSize}&page[number]=${page}`; + const data = await TitoRequest<{ release_invitations: ReleaseInvitation[] }>(url); + const invitations = data.release_invitations ?? []; + + const match = invitations.find( + (inv) => inv.email?.toLowerCase() === normalizedEmail + ); + if (match) return { ok: true, body: match, error: null }; + + if (invitations.length < pageSize) break; + page++; + } + + return { ok: false, body: null, error: 'No existing invitation found for this email' }; + } catch (e) { + const error = e instanceof Error ? e.message : 'Unknown error'; + console.error('[Tito] getRsvpInvitationByEmail failed:', error); + return { ok: false, body: null, error }; + } +} diff --git a/app/(api)/_actions/tito/getRsvpLists.ts b/app/(api)/_actions/tito/getRsvpLists.ts new file mode 100644 index 000000000..4b06b3b2a --- /dev/null +++ b/app/(api)/_actions/tito/getRsvpLists.ts @@ -0,0 +1,20 @@ +'use server'; + +import { RsvpList, TitoResponse } from '@typeDefs/tito'; +import { TitoRequest } from './titoClient'; + +export default async function getRsvpLists(): Promise> { + try { + const start = Date.now(); + const data = await TitoRequest<{ rsvp_lists: RsvpList[] }>('/rsvp_lists'); + console.log(`[Tito] getRsvpLists: ${Date.now() - start}ms`); + + const rsvpLists = data.rsvp_lists ?? []; + console.log(`[Tito] Fetched ${rsvpLists.length} RSVP lists`); + return { ok: true, body: rsvpLists, error: null }; + } catch (e) { + const error = e instanceof Error ? e.message : 'Unknown error'; + console.error('[Tito] getRsvpLists failed:', error); + return { ok: false, body: null, error }; + } +} diff --git a/app/(api)/_actions/tito/titoClient.ts b/app/(api)/_actions/tito/titoClient.ts new file mode 100644 index 000000000..df5a48d46 --- /dev/null +++ b/app/(api)/_actions/tito/titoClient.ts @@ -0,0 +1,38 @@ +const TITO_API_TOKEN = process.env.TITO_API_TOKEN; +const TITO_ACCOUNT_SLUG = process.env.TITO_ACCOUNT_SLUG; +const TITO_EVENT_SLUG = process.env.TITO_EVENT_SLUG; + +export async function TitoRequest( + endpoint: string, + options: RequestInit = {} +): Promise { + if (!TITO_API_TOKEN || !TITO_ACCOUNT_SLUG || !TITO_EVENT_SLUG) { + throw new Error('Missing Tito API configuration in environment variables'); + } + + const baseUrl = `https://api.tito.io/v3/${TITO_ACCOUNT_SLUG}/${TITO_EVENT_SLUG}`; + const url = `${baseUrl}${endpoint}`; + + const response = await fetch(url, { + ...options, + headers: { + Authorization: `Token token=${TITO_API_TOKEN}`, + Accept: 'application/json', + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + const retryAfter = response.headers.get('Retry-After'); + const error = new Error(`Tito API ${response.status}: ${errorText}`); + if (retryAfter) (error as any).retryAfter = retryAfter; + throw error; + } + + // DELETE responses may return 204 No Content + if (response.status === 204) return {} as T; + + return response.json(); +} diff --git a/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx b/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx new file mode 100644 index 000000000..61fcc7779 --- /dev/null +++ b/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import getRsvpLists from '@actions/tito/getRsvpLists'; +import getReleases from '@actions/tito/getReleases'; +import { Release, RsvpList } from '@typeDefs/tito'; +import MentorSingleInviteForm from './MentorSingleInviteForm'; + +export default function MentorInvitesPanel() { + const [rsvpLists, setRsvpLists] = useState([]); + const [releases, setReleases] = useState([]); + const [loading, setLoading] = useState(true); + const [loadError, setLoadError] = useState(''); + + useEffect(() => { + (async () => { + const [rsvpRes, relRes] = await Promise.all([getRsvpLists(), getReleases()]); + if (!rsvpRes.ok || !rsvpRes.body) { + setLoadError(rsvpRes.error ?? 'Failed to load RSVP lists.'); + } else if (!relRes.ok || !relRes.body) { + setLoadError(relRes.error ?? 'Failed to load releases.'); + } else { + setRsvpLists(rsvpRes.body); + setReleases(relRes.body); + } + setLoading(false); + })(); + }, []); + + if (loading) { + return ( +
+
+ Loading Tito configuration… +
+ ); + } + + if (loadError) { + return ( +

+ {loadError} +

+ ); + } + + return ( +
+
+

+ Send a Tito invite to a single mentor by entering their details below. +

+ +
+
+ ); +} diff --git a/app/(pages)/admin/_components/MentorInvites/MentorSingleInviteForm.tsx b/app/(pages)/admin/_components/MentorInvites/MentorSingleInviteForm.tsx new file mode 100644 index 000000000..bfc234dcf --- /dev/null +++ b/app/(pages)/admin/_components/MentorInvites/MentorSingleInviteForm.tsx @@ -0,0 +1,168 @@ +'use client'; + +import { FormEvent, useState } from 'react'; +import sendSingleMentorInvite from '@actions/emails/sendSingleMentorInvite'; +import { Release, RsvpList } from '@typeDefs/tito'; + +interface Props { + rsvpLists: RsvpList[]; + releases: Release[]; +} + +export default function MentorSingleInviteForm({ rsvpLists, releases }: Props) { + const [loading, setLoading] = useState(false); + const [titoUrl, setTitoUrl] = useState(''); + const [error, setError] = useState(''); + const [selectedListSlug, setSelectedListSlug] = useState(rsvpLists[0]?.slug ?? ''); + const [selectedReleases, setSelectedReleases] = useState([]); + + const toggleRelease = (id: string) => + setSelectedReleases((prev) => + prev.includes(id) ? prev.filter((r) => r !== id) : [...prev, id] + ); + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + if (!selectedListSlug) { + setError('Please select an RSVP list.'); + return; + } + if (selectedReleases.length === 0) { + setError('Please select at least one release.'); + return; + } + + setLoading(true); + setTitoUrl(''); + setError(''); + + const formData = new FormData(e.currentTarget); + const result = await sendSingleMentorInvite({ + firstName: formData.get('firstName') as string, + lastName: formData.get('lastName') as string, + email: formData.get('email') as string, + rsvpListSlug: selectedListSlug, + releaseIds: selectedReleases.join(','), + }); + + setLoading(false); + + if (result.ok) { + setTitoUrl(result.titoUrl ?? ''); + (e.target as HTMLFormElement).reset(); + setSelectedReleases([]); + } else { + setError(result.error ?? 'An unexpected error occurred.'); + } + }; + + return ( + + {/* Name + Email */} +
+
+ + +
+
+ + +
+
+
+ + +
+ + {/* RSVP List */} +
+ + +
+ + {/* Releases */} +
+
+ + +
+
+ {releases.map((release) => ( + + ))} +
+
+ + + + {error && ( +

+ {error} +

+ )} + {titoUrl && ( +
+

Invite sent!

+

{titoUrl}

+
+ )} + + ); +} diff --git a/app/(pages)/admin/_utils/generateInviteResultsCSV.ts b/app/(pages)/admin/_utils/generateInviteResultsCSV.ts new file mode 100644 index 000000000..42a913ed4 --- /dev/null +++ b/app/(pages)/admin/_utils/generateInviteResultsCSV.ts @@ -0,0 +1,48 @@ +export interface InviteResultRow { + firstName: string; + lastName: string; + email: string; + titoUrl?: string; + hubUrl?: string; // populated for hacker invites; omitted for mentor-only + success: boolean; + error?: string; +} + +function escapeCell(value: string): string { + return `"${value.replace(/"/g, '""')}"`; +} + +/** + * Generates a CSV string from bulk invite results. + * @param rows Merged invite result rows (one per person). + * @param includeHub Set true for hacker invites that include a Hub URL column. + */ +export function generateInviteResultsCSV( + rows: InviteResultRow[], + includeHub = false +): string { + const headers = [ + 'Email', + 'First Name', + 'Last Name', + 'Tito Invite URL', + ...(includeHub ? ['Hub Invite URL'] : []), + 'Success', + 'Notes', + ]; + + const csvRows = rows.map((row) => { + const cells = [ + row.email, + row.firstName, + row.lastName, + row.titoUrl ?? '', + ...(includeHub ? [row.hubUrl ?? ''] : []), + row.success ? 'TRUE' : 'FALSE', + row.success ? '' : (row.error ?? 'Unknown error'), + ]; + return cells.map(escapeCell).join(','); + }); + + return [headers.join(','), ...csvRows].join('\n'); +} diff --git a/app/_types/emails.ts b/app/_types/emails.ts index 9d2c29912..8c9cc5a41 100644 --- a/app/_types/emails.ts +++ b/app/_types/emails.ts @@ -25,3 +25,24 @@ export interface SingleJudgeInviteResponse { inviteUrl?: string; error: string | null; } + +// Mentor Hub invite types + +export interface MentorInviteData { + firstName: string; + lastName: string; + email: string; +} + +export interface MentorInviteResult { + email: string; + success: boolean; + titoUrl?: string; + error?: string; +} + +export interface SingleMentorInviteResponse { + ok: boolean; + titoUrl?: string; + error: string | null; +} diff --git a/app/_types/tito.ts b/app/_types/tito.ts new file mode 100644 index 000000000..a1bc99202 --- /dev/null +++ b/app/_types/tito.ts @@ -0,0 +1,41 @@ +export interface RsvpList { + id: string; + slug: string; + title: string; + release_ids?: number[]; + question_ids?: number[]; + activity_ids?: number[]; +} + +export interface Release { + id: string; + slug: string; + title: string; + quantity?: number; +} + +export interface ReleaseInvitation { + id: string; + slug: string; + email: string; + first_name: string; + last_name: string; + url?: string; + unique_url?: string; + created_at: string; +} + +export interface ReleaseInvitationRequest { + firstName: string; + lastName: string; + email: string; + rsvpListSlug: string; + releaseIds: string; // comma-separated release IDs + discountCode?: string; +} + +export interface TitoResponse { + ok: boolean; + body: T | null; + error: string | null; +} From b8ae04b2d4a8b312acbc56dcd3e8b5e738dd7799 Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 02:09:53 -0800 Subject: [PATCH 7/9] Bulk mentor invites and modify invites page --- .../MentorInvites/MentorBulkInviteForm.tsx | 336 ++++++++++++++++++ .../MentorInvites/MentorInvitesPanel.tsx | 34 ++ app/(pages)/admin/invite-judges/page.tsx | 35 -- app/(pages)/admin/invites/page.tsx | 71 ++++ app/(pages)/admin/page.tsx | 4 +- app/_types/emails.ts | 8 + 6 files changed, 451 insertions(+), 37 deletions(-) create mode 100644 app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx delete mode 100644 app/(pages)/admin/invite-judges/page.tsx create mode 100644 app/(pages)/admin/invites/page.tsx diff --git a/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx b/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx new file mode 100644 index 000000000..b086c70f3 --- /dev/null +++ b/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx @@ -0,0 +1,336 @@ +'use client'; + +import { ChangeEvent, useState } from 'react'; +import sendBulkMentorInvites from '@actions/emails/sendBulkMentorInvites'; +import { BulkMentorInviteResponse, MentorInviteData } from '@typeDefs/emails'; +import { Release, RsvpList } from '@typeDefs/tito'; +import { generateInviteResultsCSV } from '../../_utils/generateInviteResultsCSV'; + +/** + * Browser-safe CSV preview parser (no Node.js deps). Full validation runs server-side. + * Note: uses simple comma-split β€” quoted fields containing commas are not supported. + */ +function previewCSV( + text: string +): { ok: true; rows: MentorInviteData[] } | { ok: false; error: string } { + const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean); + if (lines.length === 0) return { ok: false, error: 'CSV is empty.' }; + + const firstCells = lines[0].toLowerCase(); + const hasHeader = firstCells.includes('first') || firstCells.includes('email'); + const dataLines = hasHeader ? lines.slice(1) : lines; + if (dataLines.length === 0) return { ok: false, error: 'No data rows found.' }; + + const rows: MentorInviteData[] = []; + for (let i = 0; i < dataLines.length; i++) { + const cols = dataLines[i].split(',').map((c) => c.trim()); + if (cols.length < 3) { + return { + ok: false, + error: `Row ${hasHeader ? i + 2 : i + 1}: expected 3 columns, got ${cols.length}.`, + }; + } + rows.push({ firstName: cols[0], lastName: cols[1], email: cols[2] }); + } + return { ok: true, rows }; +} + +type Status = 'idle' | 'previewing' | 'sending' | 'done'; + +interface Props { + rsvpLists: RsvpList[]; + releases: Release[]; +} + +export default function MentorBulkInviteForm({ rsvpLists, releases }: Props) { + const [status, setStatus] = useState('idle'); + const [csvText, setCsvText] = useState(''); + const [preview, setPreview] = useState([]); + const [parseError, setParseError] = useState(''); + const [result, setResult] = useState(null); + const [selectedListSlug, setSelectedListSlug] = useState(rsvpLists[0]?.slug ?? ''); + const [selectedReleases, setSelectedReleases] = useState([]); + const [configError, setConfigError] = useState(''); + + const toggleRelease = (id: string) => + setSelectedReleases((prev) => + prev.includes(id) ? prev.filter((r) => r !== id) : [...prev, id] + ); + + const handleFileChange = (e: ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + const reader = new FileReader(); + reader.onload = (ev) => { + const text = ev.target?.result as string; + setCsvText(text); + const parsed = previewCSV(text); + if (parsed.ok) { + setPreview(parsed.rows); + setParseError(''); + setStatus('previewing'); + } else { + setParseError(parsed.error); + setPreview([]); + setStatus('idle'); + } + }; + reader.readAsText(file); + }; + + const handleSend = async () => { + if (!selectedListSlug) { + setConfigError('Please select an RSVP list.'); + return; + } + if (selectedReleases.length === 0) { + setConfigError('Please select at least one release.'); + return; + } + setConfigError(''); + setStatus('sending'); + setResult(null); + + const response = await sendBulkMentorInvites( + csvText, + selectedListSlug, + selectedReleases.join(',') + ); + setResult(response); + setStatus('done'); + }; + + const handleDownloadCSV = () => { + if (!result) return; + const resultMap = new Map( + result.results.map((r) => [r.email.toLowerCase(), r]) + ); + const rows = preview.map((mentor) => { + const res = resultMap.get(mentor.email.toLowerCase()); + return { + firstName: mentor.firstName, + lastName: mentor.lastName, + email: mentor.email, + titoUrl: res?.titoUrl, + success: res?.success ?? false, + error: res?.error, + }; + }); + const csv = generateInviteResultsCSV(rows); + const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `mentor-invites-${new Date().toISOString().split('T')[0]}.csv`; + link.click(); + URL.revokeObjectURL(url); + }; + + const handleReset = () => { + setStatus('idle'); + setCsvText(''); + setPreview([]); + setParseError(''); + setResult(null); + setConfigError(''); + setSelectedReleases([]); + }; + + return ( +
+ {/* File input */} +
+ + +
+ + {/* Parse error */} + {parseError && ( +
+

CSV errors:

+
{parseError}
+
+ )} + + {/* Preview table */} + {status === 'previewing' && preview.length > 0 && ( +
+

+ {preview.length} mentor + {preview.length !== 1 ? 's' : ''} found. Configure Tito settings and + review before sending: +

+ +
+
+ + + + + + + + + + {preview.map((mentor, i) => ( + + + + + + ))} + +
+ First Name + + Last Name + + Email +
{mentor.firstName}{mentor.lastName}{mentor.email}
+
+
+ + {/* RSVP List */} +
+ + +
+ + {/* Releases */} +
+
+ + +
+
+ {releases.map((release) => ( + + ))} +
+
+ + {configError && ( +

+ {configError} +

+ )} + + +
+ )} + + {/* Sending spinner */} + {status === 'sending' && ( +
+
+ Sending invites… +
+ )} + + {/* Results */} + {status === 'done' && result && ( +
+
+
+

{result.successCount}

+

Sent

+
+
+

{result.failureCount}

+

Failed

+
+
+ + {result.failureCount > 0 && ( +
+

+ Failed invites +

+
+ {result.results + .filter((r) => !r.success) + .map((r, i) => ( +
+ {r.email} + {r.error} +
+ ))} +
+
+ )} + +
+ + +
+
+ )} +
+ ); +} diff --git a/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx b/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx index 61fcc7779..b8fec2560 100644 --- a/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx +++ b/app/(pages)/admin/_components/MentorInvites/MentorInvitesPanel.tsx @@ -5,8 +5,12 @@ import getRsvpLists from '@actions/tito/getRsvpLists'; import getReleases from '@actions/tito/getReleases'; import { Release, RsvpList } from '@typeDefs/tito'; import MentorSingleInviteForm from './MentorSingleInviteForm'; +import MentorBulkInviteForm from './MentorBulkInviteForm'; + +type Mode = 'single' | 'bulk'; export default function MentorInvitesPanel() { + const [mode, setMode] = useState('single'); const [rsvpLists, setRsvpLists] = useState([]); const [releases, setReleases] = useState([]); const [loading, setLoading] = useState(true); @@ -46,12 +50,42 @@ export default function MentorInvitesPanel() { return (
+ {/* Single / Bulk toggle */} +
+ {(['single', 'bulk'] as Mode[]).map((m) => ( + + ))} +
+ + {mode === 'single' ? (

Send a Tito invite to a single mentor by entering their details below.

+ ) : ( +
+

+ Upload a CSV with columns{' '} + + First Name, Last Name, Email + {' '} + to send Tito invites to multiple mentors at once. +

+ +
+ )}
); } diff --git a/app/(pages)/admin/invite-judges/page.tsx b/app/(pages)/admin/invite-judges/page.tsx deleted file mode 100644 index c892ef0ba..000000000 --- a/app/(pages)/admin/invite-judges/page.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; - -import JudgeSingleInviteForm from '../_components/JudgeInvites/JudgeSingleInviteForm'; -import JudgeBulkInviteForm from '../_components/JudgeInvites/JudgeBulkInviteForm'; - -export default function InviteJudgesPage() { - return ( -
-

Invite Judges

- -
-

Invite a Judge

-

- Send a HackDavis Hub invite to a single judge by entering their - details below. -

- -
- -
- -
-

Bulk Invite Judges

-

- Upload a CSV with columns{' '} - - First Name, Last Name, Email - {' '} - to send Hub invites to multiple judges at once. -

- -
-
- ); -} diff --git a/app/(pages)/admin/invites/page.tsx b/app/(pages)/admin/invites/page.tsx new file mode 100644 index 000000000..7e1aed0fc --- /dev/null +++ b/app/(pages)/admin/invites/page.tsx @@ -0,0 +1,71 @@ +'use client'; + +import { useState } from 'react'; +import JudgeSingleInviteForm from '../_components/JudgeInvites/JudgeSingleInviteForm'; +import JudgeBulkInviteForm from '../_components/JudgeInvites/JudgeBulkInviteForm'; +import MentorInvitesPanel from '../_components/MentorInvites/MentorInvitesPanel'; + +type Tab = 'judges' | 'mentors'; + +export default function InvitesPage() { + const [tab, setTab] = useState('judges'); + + return ( +
+

Invites

+ + {/* Tab bar */} +
+ {(['judges', 'mentors'] as Tab[]).map((t) => ( + + ))} +
+ + {/* Judges panel */} + {tab === 'judges' && ( +
+
+

Invite a Judge

+

+ Send a HackDavis Hub invite to a single judge by entering their + details below. +

+ +
+ +
+ +
+

Bulk Invite Judges

+

+ Upload a CSV with columns{' '} + + First Name, Last Name, Email + {' '} + to send Hub invites to multiple judges at once. +

+ +
+
+ )} + + {/* Mentors panel */} + {tab === 'mentors' && ( +
+

Mentor Invites

+ +
+ )} +
+ ); +} diff --git a/app/(pages)/admin/page.tsx b/app/(pages)/admin/page.tsx index e9a42d773..e5b25fc2c 100644 --- a/app/(pages)/admin/page.tsx +++ b/app/(pages)/admin/page.tsx @@ -22,8 +22,8 @@ const action_links = [ body: 'Create Panels', }, { - href: '/admin/invite-judges', - body: 'Invite Judges', + href: '/admin/invites', + body: 'Invites', }, { href: '/admin/randomize-projects', diff --git a/app/_types/emails.ts b/app/_types/emails.ts index 8c9cc5a41..5f749368c 100644 --- a/app/_types/emails.ts +++ b/app/_types/emails.ts @@ -41,6 +41,14 @@ export interface MentorInviteResult { error?: string; } +export interface BulkMentorInviteResponse { + ok: boolean; + results: MentorInviteResult[]; + successCount: number; + failureCount: number; + error: string | null; +} + export interface SingleMentorInviteResponse { ok: boolean; titoUrl?: string; From e08f6fa872edde82fb658b61e3ae30bc88963579 Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 02:11:28 -0800 Subject: [PATCH 8/9] New format bulk mentor invites A per-person pipeline with two independent concurrency-limited pools where each person moves from Tito to email on their own as soon as a slot is free, with no batch boundaries. --- .../_actions/emails/sendBulkMentorInvites.ts | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 app/(api)/_actions/emails/sendBulkMentorInvites.ts diff --git a/app/(api)/_actions/emails/sendBulkMentorInvites.ts b/app/(api)/_actions/emails/sendBulkMentorInvites.ts new file mode 100644 index 000000000..694285a72 --- /dev/null +++ b/app/(api)/_actions/emails/sendBulkMentorInvites.ts @@ -0,0 +1,134 @@ +'use server'; + +import parseInviteCSV from './parseInviteCSV'; +import getOrCreateTitoInvitation from '@actions/tito/getOrCreateTitoInvitation'; +import mentorInviteTemplate from './emailFormats/2026MentorInviteTemplate'; +import { DEFAULT_SENDER, transporter } from './transporter'; +import { + BulkMentorInviteResponse, + MentorInviteData, + MentorInviteResult, +} from '@typeDefs/emails'; + +const TITO_CONCURRENCY = 20; +const EMAIL_CONCURRENCY = 10; + +/** + * Returns an async function that enforces at most `concurrency` simultaneous + * calls. Each slot is released as soon as its fn resolves/rejects, so the + * pool is always kept as full as possible β€” no batch-boundary idle time. + */ +function createLimiter(concurrency: number) { + let active = 0; + const queue: (() => void)[] = []; + + return async function run(fn: () => Promise): Promise { + if (active >= concurrency) { + await new Promise((resolve) => queue.push(resolve)); + } + active++; + try { + return await fn(); + } finally { + active--; + queue.shift()?.(); + } + }; +} + +export default async function sendBulkMentorInvites( + csvText: string, + rsvpListSlug: string, + releaseIds: string +): Promise { + const parsed = parseInviteCSV(csvText); + if (!parsed.ok) { + return { ok: false, results: [], successCount: 0, failureCount: 0, error: parsed.error }; + } + + const mentors = parsed.body as MentorInviteData[]; + + // Fail fast β€” no point creating Tito invites if email can't send + if (!DEFAULT_SENDER) { + return { + ok: false, + results: [], + successCount: 0, + failureCount: mentors.length, + error: 'Email configuration missing: SENDER_EMAIL is not set.', + }; + } + const sender = DEFAULT_SENDER; // capture for TypeScript narrowing inside async closures + + const totalStart = Date.now(); + console.log( + `[Bulk Mentor Invites] Starting ${mentors.length} mentors β€” Tito pool: ${TITO_CONCURRENCY}, Email pool: ${EMAIL_CONCURRENCY}` + ); + + const titoLimiter = createLimiter(TITO_CONCURRENCY); + const emailLimiter = createLimiter(EMAIL_CONCURRENCY); + + const results: MentorInviteResult[] = []; + let successCount = 0; + let failureCount = 0; + let completed = 0; + + await Promise.allSettled( + mentors.map(async (mentor) => { + // ── Stage 1: Tito ────────────────────────────────────────────────────── + // Slot is released as soon as Tito resolves, before email starts. + const titoResult = await titoLimiter(() => + getOrCreateTitoInvitation({ ...mentor, rsvpListSlug, releaseIds }) + ); + + if (!titoResult.ok) { + console.error(`[Bulk Mentor Invites] βœ— Tito failed: ${mentor.email}`, titoResult.error); + results.push({ email: mentor.email, success: false, error: titoResult.error }); + failureCount++; + console.log(`[Bulk Mentor Invites] Progress: ${++completed}/${mentors.length}`); + return; + } + + // ── Stage 2: Email ───────────────────────────────────────────────────── + // Tito slot is already free; email slot acquired independently. + // While this person waits for an email slot, other people can be running + // their Tito stage in those freed Tito slots. + try { + await emailLimiter(() => + transporter.sendMail({ + from: sender, + to: mentor.email, + subject: "You're Invited to Mentor at HackDavis 2026", + html: mentorInviteTemplate(mentor.firstName, titoResult.titoUrl), + }) + ); + results.push({ email: mentor.email, success: true, titoUrl: titoResult.titoUrl }); + successCount++; + } catch (e) { + const errorMsg = e instanceof Error ? e.message : 'Unknown error'; + console.error(`[Bulk Mentor Invites] βœ— Email failed: ${mentor.email}`, errorMsg); + results.push({ + email: mentor.email, + success: false, + error: `Email send failed: ${errorMsg}`, + }); + failureCount++; + } + + console.log(`[Bulk Mentor Invites] Progress: ${++completed}/${mentors.length}`); + }) + ); + + const totalTime = Date.now() - totalStart; + console.log( + `[Bulk Mentor Invites] Complete: ${successCount} success, ${failureCount} failed in ${(totalTime / 1000).toFixed(1)}s` + ); + + return { + ok: failureCount === 0, + results, + successCount, + failureCount, + error: failureCount > 0 ? `${failureCount} invite(s) failed to send.` : null, + }; +} From 9b2ef1dd2e761933fe14dddd38e945613fe2efcc Mon Sep 17 00:00:00 2001 From: reehals Date: Thu, 26 Feb 2026 17:03:19 -0800 Subject: [PATCH 9/9] Lint fixes --- .../_actions/emails/sendBulkMentorInvites.ts | 45 +++++++++--- .../_actions/emails/sendSingleMentorInvite.ts | 6 +- .../_actions/tito/createRsvpInvitation.ts | 26 +++++-- .../tito/deleteRsvpInvitationByEmail.ts | 18 +++-- .../tito/getOrCreateTitoInvitation.ts | 19 +++-- .../_actions/tito/getRsvpInvitationByEmail.ts | 20 ++++-- app/(api)/_actions/tito/getRsvpLists.ts | 4 +- .../MentorInvites/MentorBulkInviteForm.tsx | 72 ++++++++++++++----- .../MentorInvites/MentorInvitesPanel.tsx | 8 ++- .../MentorInvites/MentorSingleInviteForm.tsx | 16 +++-- .../admin/_utils/generateInviteResultsCSV.ts | 2 +- 11 files changed, 180 insertions(+), 56 deletions(-) diff --git a/app/(api)/_actions/emails/sendBulkMentorInvites.ts b/app/(api)/_actions/emails/sendBulkMentorInvites.ts index 694285a72..6a6a46ef5 100644 --- a/app/(api)/_actions/emails/sendBulkMentorInvites.ts +++ b/app/(api)/_actions/emails/sendBulkMentorInvites.ts @@ -43,7 +43,13 @@ export default async function sendBulkMentorInvites( ): Promise { const parsed = parseInviteCSV(csvText); if (!parsed.ok) { - return { ok: false, results: [], successCount: 0, failureCount: 0, error: parsed.error }; + return { + ok: false, + results: [], + successCount: 0, + failureCount: 0, + error: parsed.error, + }; } const mentors = parsed.body as MentorInviteData[]; @@ -82,10 +88,19 @@ export default async function sendBulkMentorInvites( ); if (!titoResult.ok) { - console.error(`[Bulk Mentor Invites] βœ— Tito failed: ${mentor.email}`, titoResult.error); - results.push({ email: mentor.email, success: false, error: titoResult.error }); + console.error( + `[Bulk Mentor Invites] βœ— Tito failed: ${mentor.email}`, + titoResult.error + ); + results.push({ + email: mentor.email, + success: false, + error: titoResult.error, + }); failureCount++; - console.log(`[Bulk Mentor Invites] Progress: ${++completed}/${mentors.length}`); + console.log( + `[Bulk Mentor Invites] Progress: ${++completed}/${mentors.length}` + ); return; } @@ -102,11 +117,18 @@ export default async function sendBulkMentorInvites( html: mentorInviteTemplate(mentor.firstName, titoResult.titoUrl), }) ); - results.push({ email: mentor.email, success: true, titoUrl: titoResult.titoUrl }); + results.push({ + email: mentor.email, + success: true, + titoUrl: titoResult.titoUrl, + }); successCount++; } catch (e) { const errorMsg = e instanceof Error ? e.message : 'Unknown error'; - console.error(`[Bulk Mentor Invites] βœ— Email failed: ${mentor.email}`, errorMsg); + console.error( + `[Bulk Mentor Invites] βœ— Email failed: ${mentor.email}`, + errorMsg + ); results.push({ email: mentor.email, success: false, @@ -115,13 +137,17 @@ export default async function sendBulkMentorInvites( failureCount++; } - console.log(`[Bulk Mentor Invites] Progress: ${++completed}/${mentors.length}`); + console.log( + `[Bulk Mentor Invites] Progress: ${++completed}/${mentors.length}` + ); }) ); const totalTime = Date.now() - totalStart; console.log( - `[Bulk Mentor Invites] Complete: ${successCount} success, ${failureCount} failed in ${(totalTime / 1000).toFixed(1)}s` + `[Bulk Mentor Invites] Complete: ${successCount} success, ${failureCount} failed in ${( + totalTime / 1000 + ).toFixed(1)}s` ); return { @@ -129,6 +155,7 @@ export default async function sendBulkMentorInvites( results, successCount, failureCount, - error: failureCount > 0 ? `${failureCount} invite(s) failed to send.` : null, + error: + failureCount > 0 ? `${failureCount} invite(s) failed to send.` : null, }; } diff --git a/app/(api)/_actions/emails/sendSingleMentorInvite.ts b/app/(api)/_actions/emails/sendSingleMentorInvite.ts index 4f3a5abbb..78a52090b 100644 --- a/app/(api)/_actions/emails/sendSingleMentorInvite.ts +++ b/app/(api)/_actions/emails/sendSingleMentorInvite.ts @@ -54,7 +54,11 @@ export default async function sendSingleMentorInvite( return { ok: true, titoUrl: titoResult.titoUrl, error: null }; } catch (e) { const errorMessage = - e instanceof Error ? e.message : typeof e === 'string' ? e : 'Unknown error'; + e instanceof Error + ? e.message + : typeof e === 'string' + ? e + : 'Unknown error'; console.error( `[Mentor Invite] βœ— Failed (${email}) after ${Date.now() - totalStart}ms:`, errorMessage diff --git a/app/(api)/_actions/tito/createRsvpInvitation.ts b/app/(api)/_actions/tito/createRsvpInvitation.ts index 8e099eefc..067a7871c 100644 --- a/app/(api)/_actions/tito/createRsvpInvitation.ts +++ b/app/(api)/_actions/tito/createRsvpInvitation.ts @@ -1,6 +1,10 @@ 'use server'; -import { ReleaseInvitation, ReleaseInvitationRequest, TitoResponse } from '@typeDefs/tito'; +import { + ReleaseInvitation, + ReleaseInvitationRequest, + TitoResponse, +} from '@typeDefs/tito'; import { TitoRequest } from './titoClient'; const MAX_RETRIES = 5; @@ -24,7 +28,9 @@ export default async function createRsvpInvitation( .filter((id) => !isNaN(id)); if (releaseIdsArray.length === 0) { - throw new Error('Invalid release IDs format. Use comma-separated numbers.'); + throw new Error( + 'Invalid release IDs format. Use comma-separated numbers.' + ); } const requestBody: { @@ -37,13 +43,16 @@ export default async function createRsvpInvitation( if (data.firstName?.trim()) requestBody.first_name = data.firstName.trim(); if (data.lastName?.trim()) requestBody.last_name = data.lastName.trim(); - if (data.discountCode?.trim()) requestBody.discount_code = data.discountCode.trim(); + if (data.discountCode?.trim()) + requestBody.discount_code = data.discountCode.trim(); const url = `/rsvp_lists/${data.rsvpListSlug}/release_invitations`; for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) { try { - const response = await TitoRequest<{ release_invitation: ReleaseInvitation }>(url, { + const response = await TitoRequest<{ + release_invitation: ReleaseInvitation; + }>(url, { method: 'POST', body: JSON.stringify({ release_invitation: requestBody }), }); @@ -53,9 +62,14 @@ export default async function createRsvpInvitation( if (err.message.includes('429') && attempt < MAX_RETRIES) { const waitMs = err.retryAfter ? parseFloat(err.retryAfter) * BASE_DELAY_MS - : Math.pow(2, attempt) * BASE_DELAY_MS + Math.random() * BASE_DELAY_MS; + : Math.pow(2, attempt) * BASE_DELAY_MS + + Math.random() * BASE_DELAY_MS; console.warn( - `[Tito] 429 rate-limited for ${data.email}, retrying in ${Math.round(waitMs)}ms (attempt ${attempt + 1}/${MAX_RETRIES})` + `[Tito] 429 rate-limited for ${ + data.email + }, retrying in ${Math.round(waitMs)}ms (attempt ${ + attempt + 1 + }/${MAX_RETRIES})` ); await delay(waitMs); continue; diff --git a/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts b/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts index 7f5ed7e5c..1f0909b81 100644 --- a/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts +++ b/app/(api)/_actions/tito/deleteRsvpInvitationByEmail.ts @@ -18,7 +18,9 @@ export default async function deleteRsvpInvitationByEmail( while (!foundSlug) { const url = `/rsvp_lists/${rsvpListSlug}/release_invitations?page[size]=${pageSize}&page[number]=${page}`; - const data = await TitoRequest<{ release_invitations: ReleaseInvitation[] }>(url); + const data = await TitoRequest<{ + release_invitations: ReleaseInvitation[]; + }>(url); const invitations = data.release_invitations ?? []; const match = invitations.find( @@ -34,12 +36,18 @@ export default async function deleteRsvpInvitationByEmail( } if (!foundSlug) { - return { ok: false, error: 'No existing invitation found for this email' }; + return { + ok: false, + error: 'No existing invitation found for this email', + }; } - await TitoRequest(`/rsvp_lists/${rsvpListSlug}/release_invitations/${foundSlug}`, { - method: 'DELETE', - }); + await TitoRequest( + `/rsvp_lists/${rsvpListSlug}/release_invitations/${foundSlug}`, + { + method: 'DELETE', + } + ); console.log(`[Tito] Deleted invitation for ${email}`); return { ok: true, error: null }; diff --git a/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts b/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts index b3256c4a4..6f240954e 100644 --- a/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts +++ b/app/(api)/_actions/tito/getOrCreateTitoInvitation.ts @@ -39,21 +39,32 @@ export default async function getOrCreateTitoInvitation( } } - console.warn(`[Tito] No usable URL found, deleting and recreating for ${email}`); + console.warn( + `[Tito] No usable URL found, deleting and recreating for ${email}` + ); const deleteRes = await deleteRsvpInvitationByEmail(rsvpListSlug, email); if (!deleteRes.ok) { - return { ok: false, error: `Duplicate recovery failed (delete): ${deleteRes.error}` }; + return { + ok: false, + error: `Duplicate recovery failed (delete): ${deleteRes.error}`, + }; } titoResponse = await createRsvpInvitation(data); } if (!titoResponse.ok || !titoResponse.body) { - return { ok: false, error: titoResponse.error ?? 'Failed to create Tito invitation' }; + return { + ok: false, + error: titoResponse.error ?? 'Failed to create Tito invitation', + }; } const titoUrl = titoResponse.body.unique_url ?? titoResponse.body.url; if (!titoUrl) { - return { ok: false, error: 'Tito invitation created but no URL was returned' }; + return { + ok: false, + error: 'Tito invitation created but no URL was returned', + }; } return { ok: true, titoUrl }; diff --git a/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts b/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts index 2f169dbf7..1a5788c95 100644 --- a/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts +++ b/app/(api)/_actions/tito/getRsvpInvitationByEmail.ts @@ -14,10 +14,13 @@ export default async function getRsvpInvitationByEmail( const pageSize = 1000; let page = 1; + let hasMorePages = true; - while (true) { + while (hasMorePages) { const url = `/rsvp_lists/${rsvpListSlug}/release_invitations?page[size]=${pageSize}&page[number]=${page}`; - const data = await TitoRequest<{ release_invitations: ReleaseInvitation[] }>(url); + const data = await TitoRequest<{ + release_invitations: ReleaseInvitation[]; + }>(url); const invitations = data.release_invitations ?? []; const match = invitations.find( @@ -25,11 +28,18 @@ export default async function getRsvpInvitationByEmail( ); if (match) return { ok: true, body: match, error: null }; - if (invitations.length < pageSize) break; - page++; + if (invitations.length < pageSize) { + hasMorePages = false; + } else { + page++; + } } - return { ok: false, body: null, error: 'No existing invitation found for this email' }; + return { + ok: false, + body: null, + error: 'No existing invitation found for this email', + }; } catch (e) { const error = e instanceof Error ? e.message : 'Unknown error'; console.error('[Tito] getRsvpInvitationByEmail failed:', error); diff --git a/app/(api)/_actions/tito/getRsvpLists.ts b/app/(api)/_actions/tito/getRsvpLists.ts index 4b06b3b2a..027ebcc80 100644 --- a/app/(api)/_actions/tito/getRsvpLists.ts +++ b/app/(api)/_actions/tito/getRsvpLists.ts @@ -3,7 +3,9 @@ import { RsvpList, TitoResponse } from '@typeDefs/tito'; import { TitoRequest } from './titoClient'; -export default async function getRsvpLists(): Promise> { +export default async function getRsvpLists(): Promise< + TitoResponse +> { try { const start = Date.now(); const data = await TitoRequest<{ rsvp_lists: RsvpList[] }>('/rsvp_lists'); diff --git a/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx b/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx index b086c70f3..a082489bf 100644 --- a/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx +++ b/app/(pages)/admin/_components/MentorInvites/MentorBulkInviteForm.tsx @@ -13,13 +13,18 @@ import { generateInviteResultsCSV } from '../../_utils/generateInviteResultsCSV' function previewCSV( text: string ): { ok: true; rows: MentorInviteData[] } | { ok: false; error: string } { - const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean); + const lines = text + .split(/\r?\n/) + .map((l) => l.trim()) + .filter(Boolean); if (lines.length === 0) return { ok: false, error: 'CSV is empty.' }; const firstCells = lines[0].toLowerCase(); - const hasHeader = firstCells.includes('first') || firstCells.includes('email'); + const hasHeader = + firstCells.includes('first') || firstCells.includes('email'); const dataLines = hasHeader ? lines.slice(1) : lines; - if (dataLines.length === 0) return { ok: false, error: 'No data rows found.' }; + if (dataLines.length === 0) + return { ok: false, error: 'No data rows found.' }; const rows: MentorInviteData[] = []; for (let i = 0; i < dataLines.length; i++) { @@ -27,7 +32,9 @@ function previewCSV( if (cols.length < 3) { return { ok: false, - error: `Row ${hasHeader ? i + 2 : i + 1}: expected 3 columns, got ${cols.length}.`, + error: `Row ${hasHeader ? i + 2 : i + 1}: expected 3 columns, got ${ + cols.length + }.`, }; } rows.push({ firstName: cols[0], lastName: cols[1], email: cols[2] }); @@ -48,7 +55,9 @@ export default function MentorBulkInviteForm({ rsvpLists, releases }: Props) { const [preview, setPreview] = useState([]); const [parseError, setParseError] = useState(''); const [result, setResult] = useState(null); - const [selectedListSlug, setSelectedListSlug] = useState(rsvpLists[0]?.slug ?? ''); + const [selectedListSlug, setSelectedListSlug] = useState( + rsvpLists[0]?.slug ?? '' + ); const [selectedReleases, setSelectedReleases] = useState([]); const [configError, setConfigError] = useState(''); @@ -122,7 +131,9 @@ export default function MentorBulkInviteForm({ rsvpLists, releases }: Props) { const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; - link.download = `mentor-invites-${new Date().toISOString().split('T')[0]}.csv`; + link.download = `mentor-invites-${ + new Date().toISOString().split('T')[0] + }.csv`; link.click(); URL.revokeObjectURL(url); }; @@ -160,7 +171,9 @@ export default function MentorBulkInviteForm({ rsvpLists, releases }: Props) { {parseError && (

CSV errors:

-
{parseError}
+
+            {parseError}
+          
)} @@ -191,10 +204,19 @@ export default function MentorBulkInviteForm({ rsvpLists, releases }: Props) { {preview.map((mentor, i) => ( - - {mentor.firstName} - {mentor.lastName} - {mentor.email} + + + {mentor.firstName} + + + {mentor.lastName} + + + {mentor.email} + ))} @@ -204,7 +226,9 @@ export default function MentorBulkInviteForm({ rsvpLists, releases }: Props) { {/* RSVP List */}
- + - {selectedReleases.length === releases.length ? 'Deselect all' : 'Select all'} + {selectedReleases.length === releases.length + ? 'Deselect all' + : 'Select all'}
@@ -138,7 +144,9 @@ export default function MentorSingleInviteForm({ rsvpLists, releases }: Props) { className="w-4 h-4 accent-[#005271]" /> {release.title} - {release.id} + + {release.id} + ))}
diff --git a/app/(pages)/admin/_utils/generateInviteResultsCSV.ts b/app/(pages)/admin/_utils/generateInviteResultsCSV.ts index 42a913ed4..401ec3a77 100644 --- a/app/(pages)/admin/_utils/generateInviteResultsCSV.ts +++ b/app/(pages)/admin/_utils/generateInviteResultsCSV.ts @@ -39,7 +39,7 @@ export function generateInviteResultsCSV( row.titoUrl ?? '', ...(includeHub ? [row.hubUrl ?? ''] : []), row.success ? 'TRUE' : 'FALSE', - row.success ? '' : (row.error ?? 'Unknown error'), + row.success ? '' : row.error ?? 'Unknown error', ]; return cells.map(escapeCell).join(','); });