Skip to content

Commit ef462df

Browse files
committed
Icon and email subject
1 parent f9d185d commit ef462df

2 files changed

Lines changed: 46 additions & 25 deletions

File tree

app/api/invitations/route.ts

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,39 @@ async function sendInviteEmail(params: {
2121
console.log("\n📬 [DEV] Invitation email (not sent)");
2222
console.log(` To: ${params.to}`);
2323
console.log(` Link: ${params.invitationLink}`);
24-
console.log(` Inviter: ${params.inviterFirstName} ${params.inviterLastName} <${params.inviterEmail}>\n`);
24+
console.log(
25+
` Inviter: ${params.inviterFirstName} ${params.inviterLastName} <${params.inviterEmail}>\n`,
26+
);
2527
return;
26-
}
27-
const resend = new Resend(process.env.RESEND_API_KEY);
28-
await resend.emails.send({
29-
from: "AppDev Alumni <noreply@alumni.cornellappdev.com>",
30-
to: params.to,
31-
subject: "You're invited to join the AppDev Alumni Network",
32-
template: {
33-
id: "invitation-email",
34-
variables: {
35-
firstName: params.firstName,
36-
invitationLink: params.invitationLink,
37-
inviterEmail: params.inviterEmail,
38-
inviterFirstName: params.inviterFirstName,
39-
inviterLastName: params.inviterLastName,
28+
} else {
29+
const resend = new Resend(process.env.RESEND_API_KEY);
30+
await resend.emails.send({
31+
from: "AppDev Alumni <noreply@alumni.cornellappdev.com>",
32+
to: params.to,
33+
template: {
34+
id: "invitation-email",
35+
variables: {
36+
firstName: params.firstName,
37+
invitationLink: params.invitationLink,
38+
inviterEmail: params.inviterEmail,
39+
inviterFirstName: params.inviterFirstName,
40+
inviterLastName: params.inviterLastName,
41+
},
4042
},
41-
},
42-
});
43+
});
44+
}
4345
}
4446

4547
export async function GET(request: NextRequest) {
4648
try {
4749
const tokens = await getTokens(request.cookies, authConfig);
48-
if (!tokens) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
50+
if (!tokens)
51+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
4952

50-
const inviterDoc = await adminDb.collection("users").doc(tokens.decodedToken.uid).get();
53+
const inviterDoc = await adminDb
54+
.collection("users")
55+
.doc(tokens.decodedToken.uid)
56+
.get();
5157
if (inviterDoc.data()?.role !== "admin") {
5258
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
5359
}
@@ -56,24 +62,34 @@ export async function GET(request: NextRequest) {
5662
return NextResponse.json(invitations);
5763
} catch (error) {
5864
console.error("List invitations error:", error);
59-
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
65+
return NextResponse.json(
66+
{ error: "Internal server error" },
67+
{ status: 500 },
68+
);
6069
}
6170
}
6271

6372
export async function POST(request: NextRequest) {
6473
try {
6574
const tokens = await getTokens(request.cookies, authConfig);
66-
if (!tokens) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
75+
if (!tokens)
76+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
6777

68-
const inviterDoc = await adminDb.collection("users").doc(tokens.decodedToken.uid).get();
78+
const inviterDoc = await adminDb
79+
.collection("users")
80+
.doc(tokens.decodedToken.uid)
81+
.get();
6982
const inviterData = inviterDoc.data();
7083
if (inviterData?.role !== "admin") {
7184
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
7285
}
7386

7487
const { email, firstName, lastName } = await request.json();
7588
if (!email || !firstName || !lastName) {
76-
return NextResponse.json({ error: "Email, firstName, and lastName are required" }, { status: 400 });
89+
return NextResponse.json(
90+
{ error: "Email, firstName, and lastName are required" },
91+
{ status: 400 },
92+
);
7793
}
7894

7995
const code = crypto.randomUUID();
@@ -100,6 +116,9 @@ export async function POST(request: NextRequest) {
100116
return NextResponse.json({ ok: true });
101117
} catch (error) {
102118
console.error("Invitation error:", error);
103-
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
119+
return NextResponse.json(
120+
{ error: "Internal server error" },
121+
{ status: 500 },
122+
);
104123
}
105124
}

components/layout/Header.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use client";
22

33
import Link from "next/link";
4+
import Image from "next/image";
45
import { useRouter, usePathname } from "next/navigation";
56
import { signOut } from "firebase/auth";
67
import { auth } from "@/lib/firebase/client";
@@ -48,7 +49,8 @@ export function Header() {
4849
<div className="mx-auto flex h-14 max-w-6xl items-center justify-between px-4">
4950
<div className="flex items-center gap-6">
5051
<MobileSidebar />
51-
<Link href="/feed" className="font-semibold text-sm">
52+
<Link href="/feed" className="flex items-center gap-2 font-semibold text-sm">
53+
<Image src="/appdev.svg" alt="AppDev" width={20} height={20} />
5254
AppDev Alumni
5355
</Link>
5456
<nav className="hidden md:flex items-center gap-1">

0 commit comments

Comments
 (0)