diff --git a/lib/events.ts b/lib/events.ts index 886b6954..0a0e9aab 100644 --- a/lib/events.ts +++ b/lib/events.ts @@ -62,3 +62,38 @@ export async function getEventsByTerm( .filter((name) => name.endsWith(".md")) .map((name) => name.slice(0, -".md".length)); } + +export async function getUpcomingEvents(): Promise { + const today = new Date(); + const currentYear = today.getFullYear(); + const currentTerm = Math.trunc(today.getMonth() / 4); + const nextYear = currentTerm < 2 ? currentYear : currentYear + 1; + const nextTerm = (currentTerm + 1) % 3; + + const events: Event[] = ( + await Promise.all( + [ + { year: currentYear.toString(), term: currentTerm }, + { year: nextYear.toString(), term: nextTerm }, + ].map(async ({ year, term }) => { + try { + const eventsInTerm = await getEventsByTerm(year, TERMS[term]); + return await Promise.all( + eventsInTerm.map((slug) => getEventBySlug(year, TERMS[term], slug)) + ); + } catch (error) { + return []; + } + }) + ) + ).flat(); + + return events + .filter((ev) => new Date(ev.metadata.date).getTime() >= Date.now()) + .sort((a, b) => { + return ( + new Date(a.metadata.date).getTime() - + new Date(b.metadata.date).getTime() + ); + }); +} diff --git a/lib/news.ts b/lib/news.ts index 0d9b8bdd..a5ce2bc7 100644 --- a/lib/news.ts +++ b/lib/news.ts @@ -65,3 +65,38 @@ export async function getNewsBySlug( metadata: metadata as Metadata, }; } + +export async function getRecentNews(): Promise { + const today = new Date(); + const currentYear = today.getFullYear(); + const currentTerm = Math.trunc(today.getMonth() / 4); + const prevYear = currentTerm > 0 ? currentYear : currentYear - 1; + const prevTerm = (currentTerm - 1 + 3) % 3; + + const news: News[] = ( + await Promise.all( + [ + { year: currentYear.toString(), term: currentTerm }, + { year: prevYear.toString(), term: prevTerm }, + ].map(async ({ year, term }) => { + try { + const newsInTerm = await getNewsByTerm(year, TERMS[term]); + return await Promise.all( + newsInTerm.map((slug) => getNewsBySlug(year, TERMS[term], slug)) + ); + } catch (error) { + return []; + } + }) + ) + ).flat(); + + return news + .filter((news) => new Date(news.metadata.date).getTime() <= Date.now()) + .sort((a, b) => { + return ( + new Date(b.metadata.date).getTime() - + new Date(a.metadata.date).getTime() + ); + }); +} diff --git a/pages/index.module.css b/pages/index.module.css index a68520e4..3d098dc4 100644 --- a/pages/index.module.css +++ b/pages/index.module.css @@ -119,6 +119,7 @@ } .cards > section { + width: calc(540rem / 16); max-width: calc(540rem / 16); } } @@ -171,13 +172,14 @@ .cards { flex-direction: column; justify-content: flex-start; - align-items: center; + align-items: stretch; gap: calc(8rem / 16); padding: calc(36rem / 16) calc(20rem / 16) calc(20rem / 16); } .cards > section { + width: unset; max-width: unset; } diff --git a/pages/index.tsx b/pages/index.tsx index 2d6c2b98..7b9556c6 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,3 +1,5 @@ +import { GetStaticProps } from "next"; +import { MDXRemote } from "next-mdx-remote"; import React from "react"; import { ConnectWithUs } from "@/components/ConnectWithUs"; @@ -5,29 +7,21 @@ import { DefaultLayout } from "@/components/DefaultLayout"; import { EmailSignup } from "@/components/EmailSignup"; import { EventDescriptionCard } from "@/components/EventDescriptionCard"; import { Image } from "@/components/Image"; +import { Link } from "@/components/Link"; import { NewsCard } from "@/components/NewsCard"; import { SocialLinks } from "@/components/SocialLinks"; - -import AltTab, { - metadata as altTabEventMetadata, -} from "../content/playground/alt-tab.event.mdx"; -import OOTBReact, { - metadata as OOTBReactEventMetadata, -} from "../content/playground/ootb-react.event.mdx"; -import UnavailableContent, { - metadata as unavailableMetadata, -} from "../content/playground/unavailable.news.mdx"; +import { Event, getUpcomingEvents } from "@/lib/events"; +import { News, getRecentNews } from "@/lib/news"; import styles from "./index.module.css"; -// temporary event and news imports - -export default function Home() { - const events = [ - { Content: OOTBReact, metadata: OOTBReactEventMetadata }, - { Content: AltTab, metadata: altTabEventMetadata }, - ]; +interface Props { + moreEvents: boolean; // true if there are more than 2 upcoming events + events: Event[]; // array of 0 - 2 events + news: News; +} +export default function Home(props: Props) { return ( <> @@ -54,30 +48,58 @@ export default function Home() {
- {/* TODO: add links to past events and past news */}

Upcoming Events

-

See past events here

+

+ See past events{" "} + + here + +


+ {props.events.length === 0 ? ( +

+ There are no upcoming events right now. Please check back later! +

+ ) : null}
- {events.map(({ metadata }) => ( - - ))} + {props.events.length > 0 + ? props.events.map((event) => ( + + )) + : null}
+ {props.moreEvents ? ( +

+ See more upcoming events{" "} + + here + +

+ ) : null}

News

Updates from our execs!
- See past news here + See past news{" "} + + here +


- - - + { + + + + }
@@ -92,3 +114,15 @@ export default function Home() { Home.Layout = function HomeLayout(props: { children: React.ReactNode }) { return
{props.children}
; }; + +export const getStaticProps: GetStaticProps = async () => { + const upcomingEvents = await getUpcomingEvents(); + const recentNews = await getRecentNews(); + return { + props: { + moreEvents: upcomingEvents.length > 2, + events: upcomingEvents.slice(0, 2), + news: recentNews[0], + }, + }; +};