|
|
|
@ -1,24 +1,27 @@ |
|
|
|
|
import { GetStaticProps } from "next"; |
|
|
|
|
import { MDXRemote, MDXRemoteSerializeResult } from "next-mdx-remote"; |
|
|
|
|
import React from "react"; |
|
|
|
|
|
|
|
|
|
import { Bubble } from "@/components/Bubble"; |
|
|
|
|
import { DefaultLayout } from "@/components/DefaultLayout"; |
|
|
|
|
import { Image } from "@/components/Image"; |
|
|
|
|
import { Link } from "@/components/Link"; |
|
|
|
|
import { TeamMember } from "@/components/TeamMember"; |
|
|
|
|
import { TeamMemberCard } from "@/components/TeamMemberCard"; |
|
|
|
|
import { |
|
|
|
|
getExec, |
|
|
|
|
getExecNames, |
|
|
|
|
Metadata, |
|
|
|
|
getMemberImagePath, |
|
|
|
|
} from "../../lib/team"; |
|
|
|
|
import { MDXRemote, MDXRemoteSerializeResult } from "next-mdx-remote"; |
|
|
|
|
import { GetStaticProps } from "next"; |
|
|
|
|
import { Image } from "../../components/Image"; |
|
|
|
|
import { TeamMemberCard } from "../../components/TeamMemberCard"; |
|
|
|
|
import { TeamMember } from "../../components/TeamMember"; |
|
|
|
|
import { Link } from "../../components/Link"; |
|
|
|
|
import { Bubble } from "../../components/Bubble"; |
|
|
|
|
} from "@/lib/team"; |
|
|
|
|
|
|
|
|
|
import programmeData from "../../content/meet-the-team/programme-committee.json"; |
|
|
|
|
import websiteData from "../../content/meet-the-team/website-committee.json"; |
|
|
|
|
import systemsData from "../../content/meet-the-team/systems-committee.json"; |
|
|
|
|
import websiteData from "../../content/meet-the-team/website-committee.json"; |
|
|
|
|
|
|
|
|
|
import styles from "./team.module.css"; |
|
|
|
|
|
|
|
|
|
// TODO: fix hotdog for elections
|
|
|
|
|
// change News link in elections to point to News page
|
|
|
|
|
// TODO: link News page in Elections
|
|
|
|
|
|
|
|
|
|
interface SerializedExec { |
|
|
|
|
content: MDXRemoteSerializeResult; |
|
|
|
@ -35,60 +38,66 @@ interface Props { |
|
|
|
|
export default function Team({ execs, programme, website, systems }: Props) { |
|
|
|
|
return ( |
|
|
|
|
<> |
|
|
|
|
<div className={styles.headerContainer}> |
|
|
|
|
<div className={styles.headerTextContainer}> |
|
|
|
|
<h1 className={styles.header}>Meet the Team!</h1> |
|
|
|
|
<div className={styles.nav}> |
|
|
|
|
<Link href="#execs">The Executives</Link> |
|
|
|
|
<Link href="#programme">Programme Committee</Link> |
|
|
|
|
<Link href="#website">Website Committee</Link> |
|
|
|
|
<Link href="#system">Systems Committee</Link> |
|
|
|
|
<DefaultLayout> |
|
|
|
|
<div className={styles.headerContainer}> |
|
|
|
|
<div className={styles.headerTextContainer}> |
|
|
|
|
<h1 className={styles.header}>Meet the Team!</h1> |
|
|
|
|
<div className={styles.nav}> |
|
|
|
|
<Link href="#execs">The Executives</Link> |
|
|
|
|
<Link href="#programme">Programme Committee</Link> |
|
|
|
|
<Link href="#website">Website Committee</Link> |
|
|
|
|
<Link href="#system">Systems Committee</Link> |
|
|
|
|
</div> |
|
|
|
|
<h2 |
|
|
|
|
className={styles.subheading} |
|
|
|
|
style={{ borderBottom: "none", margin: 0, padding: 0 }} |
|
|
|
|
> |
|
|
|
|
The Executives |
|
|
|
|
</h2> |
|
|
|
|
</div> |
|
|
|
|
<h2 |
|
|
|
|
className={styles.subheading} |
|
|
|
|
style={{ borderBottom: "none", margin: 0, padding: 0 }} |
|
|
|
|
> |
|
|
|
|
The Executives |
|
|
|
|
</h2> |
|
|
|
|
<Image src="images/team/team-codey.svg" className={styles.codey} /> |
|
|
|
|
</div> |
|
|
|
|
<Image src="images/team/team-codey.svg" className={styles.codey} /> |
|
|
|
|
</div> |
|
|
|
|
<div className={styles.execs} id="execs"> |
|
|
|
|
{execs.map((exec) => { |
|
|
|
|
return ( |
|
|
|
|
<div key={exec.metadata.name}> |
|
|
|
|
<TeamMemberCard {...exec.metadata}> |
|
|
|
|
<MDXRemote {...exec.content} /> |
|
|
|
|
</TeamMemberCard> |
|
|
|
|
</div> |
|
|
|
|
); |
|
|
|
|
})} |
|
|
|
|
</div> |
|
|
|
|
<div id="programme"> |
|
|
|
|
<h2 className={styles.subheading}>Programme Committee</h2> |
|
|
|
|
<MembersList team={programme} /> |
|
|
|
|
</div> |
|
|
|
|
<div id="website"> |
|
|
|
|
<h2 className={styles.subheading}>Website Committee</h2> |
|
|
|
|
<MembersList team={website} /> |
|
|
|
|
</div> |
|
|
|
|
<div id="system"> |
|
|
|
|
<h2 className={styles.subheading}>Systems Committee</h2> |
|
|
|
|
<MembersList team={systems} /> |
|
|
|
|
</div> |
|
|
|
|
<Bubble> |
|
|
|
|
<div className={styles.elections}> |
|
|
|
|
<div className={styles.execs} id="execs"> |
|
|
|
|
{execs.map((exec) => { |
|
|
|
|
return ( |
|
|
|
|
<div key={exec.metadata.name}> |
|
|
|
|
<TeamMemberCard {...exec.metadata}> |
|
|
|
|
<MDXRemote {...exec.content} /> |
|
|
|
|
</TeamMemberCard> |
|
|
|
|
</div> |
|
|
|
|
); |
|
|
|
|
})} |
|
|
|
|
</div> |
|
|
|
|
<div id="programme"> |
|
|
|
|
<h2 className={styles.subheading}>Programme Committee</h2> |
|
|
|
|
<MembersList team={programme} /> |
|
|
|
|
</div> |
|
|
|
|
<div id="website"> |
|
|
|
|
<h2 className={styles.subheading}>Website Committee</h2> |
|
|
|
|
<MembersList team={website} /> |
|
|
|
|
</div> |
|
|
|
|
<div id="system"> |
|
|
|
|
<h2 className={styles.subheading}>Systems Committee</h2> |
|
|
|
|
<MembersList team={systems} /> |
|
|
|
|
</div> |
|
|
|
|
</DefaultLayout> |
|
|
|
|
<div className={styles.elections}> |
|
|
|
|
<Bubble> |
|
|
|
|
<h2 className={styles.electionSubheading}>Elections</h2> |
|
|
|
|
To find out when and where the next elections will be held, keep an |
|
|
|
|
eye on on the <Link href="">News</Link>. <br /> |
|
|
|
|
For details on the elections, read our |
|
|
|
|
<Link href="/about/constitution"> Constitution</Link> |
|
|
|
|
</div> |
|
|
|
|
</Bubble> |
|
|
|
|
</Bubble> |
|
|
|
|
</div> |
|
|
|
|
</> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Team.Layout = function TeamLayout(props: { children: React.ReactNode }) { |
|
|
|
|
return <div>{props.children}</div>; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
interface MembersProps { |
|
|
|
|
team: Metadata[]; |
|
|
|
|
} |
|
|
|
@ -103,7 +112,7 @@ function MembersList(props: MembersProps) { |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function getMemberImage(team: Omit<Metadata, "image">[]) { |
|
|
|
|
async function getTeamWithImages(team: Omit<Metadata, "image">[]) { |
|
|
|
|
return await Promise.all( |
|
|
|
|
team.map(async (member) => { |
|
|
|
|
const image = await getMemberImagePath(member.name); |
|
|
|
@ -120,9 +129,11 @@ export const getStaticProps: GetStaticProps<Props> = async () => { |
|
|
|
|
const execs = (await Promise.all( |
|
|
|
|
execNames.map((name) => getExec(name)) |
|
|
|
|
)) as SerializedExec[]; |
|
|
|
|
const programme = await getMemberImage(programmeData); |
|
|
|
|
const website = await getMemberImage(websiteData); |
|
|
|
|
const systems = await getMemberImage(systemsData); |
|
|
|
|
const [programme, website, systems] = await Promise.all([ |
|
|
|
|
getTeamWithImages(programmeData), |
|
|
|
|
getTeamWithImages(websiteData), |
|
|
|
|
getTeamWithImages(systemsData), |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
props: { execs, programme, website, systems }, |
|
|
|
|