diff --git a/package-lock.json b/package-lock.json
index 34eb7304..ba314f56 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "www-new",
+ "name": "website",
"version": "0.1.0",
"lockfileVersion": 2,
"requires": true,
diff --git a/pages/events/[year]/[term]/[event].tsx b/pages/events/[year]/[term]/[event].tsx
new file mode 100644
index 00000000..21bfce26
--- /dev/null
+++ b/pages/events/[year]/[term]/[event].tsx
@@ -0,0 +1,69 @@
+import { ParsedUrlQuery } from "querystring";
+
+import { GetStaticPaths, GetStaticProps } from "next";
+import { MDXRemote } from "next-mdx-remote";
+import React from "react";
+
+import { EventCard } from "@/components/EventCard";
+import {
+ Event,
+ getEventYears,
+ getEventTermsByYear,
+ getEventsByTerm,
+ getEventBySlug,
+} from "@/lib/events";
+
+export default function EventInfoPage(props: Props) {
+ return (
+
+
+
+ );
+}
+
+interface Props {
+ event: Event;
+}
+
+interface Params extends ParsedUrlQuery {
+ year: string;
+ term: string;
+ event: string;
+}
+
+export const getStaticProps: GetStaticProps = async (
+ context
+) => {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const { year, term, event } = context.params!;
+ return { props: { event: await getEventBySlug(year, term, event) } };
+};
+
+export const getStaticPaths: GetStaticPaths = async () => {
+ const years = await getEventYears();
+ const events = (
+ await Promise.all(
+ years.map(async (year) => {
+ const termsInYear = await getEventTermsByYear(year);
+ return await Promise.all(
+ termsInYear.map(async (term) => {
+ const eventsInTerm = await getEventsByTerm(year, term);
+ return eventsInTerm.map((event) => ({
+ year,
+ term,
+ event,
+ }));
+ })
+ );
+ })
+ )
+ ).flat(2);
+
+ return {
+ paths: events.map((params) => ({ params })),
+ fallback: false,
+ };
+};