diff --git a/pages/news/archive.module.css b/components/ArchivePage.module.css
similarity index 54%
rename from pages/news/archive.module.css
rename to components/ArchivePage.module.css
index a05f7b45..88b5b58e 100644
--- a/pages/news/archive.module.css
+++ b/components/ArchivePage.module.css
@@ -2,6 +2,11 @@
margin-bottom: calc(40rem / 16);
}
+.page > h1 {
+ border-bottom: calc(1rem / 16) solid var(--primary-heading);
+ padding-bottom: 1rem;
+}
+
.list {
list-style: none;
padding: 0;
diff --git a/components/ArchivePage.tsx b/components/ArchivePage.tsx
new file mode 100644
index 00000000..bc1e1be7
--- /dev/null
+++ b/components/ArchivePage.tsx
@@ -0,0 +1,44 @@
+import React from "react";
+
+import { Link } from "@/components/Link";
+import {
+ ShapesConfig,
+ GetShapesConfig,
+ defaultGetShapesConfig,
+} from "@/components/ShapesBackground";
+import { capitalize } from "@/utils";
+
+import styles from "./ArchivePage.module.css";
+
+export interface Props {
+ type: "news" | "events";
+ items: {
+ year: string;
+ terms: string[];
+ }[];
+}
+
+export function ArchivePage({ items, type }: Props) {
+ return (
+
+
{capitalize(type)} Archive
+
+ {items.map(({ year, terms }) =>
+ terms.map((term) => (
+ -
+
+ {capitalize(term)} {year}
+
+
+ ))
+ )}
+
+
+ );
+}
+
+ArchivePage.getShapesConfig = ((width, height) => {
+ return window.innerWidth <= 768
+ ? ({} as ShapesConfig)
+ : defaultGetShapesConfig(width, height);
+}) as GetShapesConfig;
diff --git a/pages/events/[year]/[term]/index.tsx b/pages/events/[year]/[term]/index.tsx
index f8b9f1fd..6387d779 100644
--- a/pages/events/[year]/[term]/index.tsx
+++ b/pages/events/[year]/[term]/index.tsx
@@ -13,6 +13,7 @@ import {
getEventYears,
getEventTermsByYear,
} from "@/lib/events";
+import { capitalize } from "@/utils";
import styles from "./index.module.css";
@@ -154,7 +155,3 @@ export const getStaticPaths: GetStaticPaths = async () => {
fallback: false,
};
};
-
-function capitalize(str: string) {
- return str.slice(0, 1).toUpperCase() + str.slice(1);
-}
diff --git a/pages/events/archive.tsx b/pages/events/archive.tsx
new file mode 100644
index 00000000..9ae08a0d
--- /dev/null
+++ b/pages/events/archive.tsx
@@ -0,0 +1,18 @@
+import { GetStaticProps } from "next";
+
+import { ArchivePage, Props } from "@/components/ArchivePage";
+import { getEventTermsByYear, getEventYears } from "@/lib/events";
+
+export default ArchivePage;
+
+export const getStaticProps: GetStaticProps = async () => {
+ const years = (await getEventYears()).reverse();
+ const yearsWithTerms = await Promise.all(
+ years.map(async (year) => ({
+ year,
+ terms: (await getEventTermsByYear(year)).reverse(),
+ }))
+ );
+
+ return { props: { items: yearsWithTerms, type: "events" } };
+};
diff --git a/pages/news/[year]/[term].tsx b/pages/news/[year]/[term].tsx
index 203165d1..b7f5ce8a 100644
--- a/pages/news/[year]/[term].tsx
+++ b/pages/news/[year]/[term].tsx
@@ -17,6 +17,7 @@ import {
getNewsYears,
News,
} from "@/lib/news";
+import { capitalize } from "@/utils";
import styles from "./[term].module.css";
@@ -89,7 +90,3 @@ export const getStaticPaths: GetStaticPaths = async () => {
fallback: false,
};
};
-
-function capitalize(str: string) {
- return str.slice(0, 1).toUpperCase() + str.slice(1);
-}
diff --git a/pages/news/archive.tsx b/pages/news/archive.tsx
index 9857618a..e7dcf63e 100644
--- a/pages/news/archive.tsx
+++ b/pages/news/archive.tsx
@@ -1,47 +1,9 @@
-import { getNewsTermsByYear, getNewsYears } from "lib/news";
import { GetStaticProps } from "next";
-import React from "react";
-import { Link } from "@/components/Link";
-import {
- ShapesConfig,
- GetShapesConfig,
- defaultGetShapesConfig,
-} from "@/components/ShapesBackground";
+import { ArchivePage, Props } from "@/components/ArchivePage";
+import { getNewsTermsByYear, getNewsYears } from "@/lib/news";
-import styles from "./archive.module.css";
-
-interface Props {
- items: {
- year: string;
- terms: string[];
- }[];
-}
-
-export default function NewsArchive({ items }: Props) {
- return (
-
-
News Archive
-
- {items.map(({ year, terms }) =>
- terms.map((term) => (
- -
-
- {capitalize(term)} {year}
-
-
- ))
- )}
-
-
- );
-}
-
-NewsArchive.getShapesConfig = ((width, height) => {
- return window.innerWidth <= 768
- ? ({} as ShapesConfig)
- : defaultGetShapesConfig(width, height);
-}) as GetShapesConfig;
+export default ArchivePage;
export const getStaticProps: GetStaticProps = async () => {
const years = (await getNewsYears()).reverse();
@@ -52,9 +14,5 @@ export const getStaticProps: GetStaticProps = async () => {
}))
);
- return { props: { items: yearsWithTerms } };
+ return { props: { items: yearsWithTerms, type: "news" } };
};
-
-function capitalize(str: string) {
- return str.slice(0, 1).toUpperCase() + str.slice(1);
-}
diff --git a/tsconfig.json b/tsconfig.json
index d886e684..ea06f1e2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -23,7 +23,8 @@
"paths": {
"@/components/*": ["components/*"],
"@/lib/*": ["lib/*"],
- "@/hooks/*": ["hooks/*"]
+ "@/hooks/*": ["hooks/*"],
+ "@/utils": ["utils"]
}
},
"include": ["next-env.d.ts", "types.d.ts", "**/*.ts", "**/*.tsx"],
diff --git a/utils.ts b/utils.ts
new file mode 100644
index 00000000..40ef05aa
--- /dev/null
+++ b/utils.ts
@@ -0,0 +1,3 @@
+export function capitalize(str: string) {
+ return str.slice(0, 1).toUpperCase() + str.slice(1);
+}