Add getRecentEvents()

This commit is contained in:
Amy 2021-08-19 01:47:25 -04:00
parent cb3408990d
commit eaf90b794d
3 changed files with 78 additions and 36 deletions

View File

@ -73,18 +73,14 @@ export async function getUpcomingEvents(): Promise<Event[]> {
const events: Event[] = ( const events: Event[] = (
await Promise.all( await Promise.all(
[ [
{ year: currentYear, term: currentTerm }, { year: currentYear.toString(), term: currentTerm },
{ year: nextYear, term: nextTerm }, { year: nextYear.toString(), term: nextTerm },
].map(async ({ year, term }) => { ].map(async ({ year, term }) => {
try { try {
const eventsInTerm = await getEventsByTerm( const eventsInTerm = await getEventsByTerm(year, TERMS[term]);
year.toString(),
TERMS[term]
);
return await Promise.all( return await Promise.all(
eventsInTerm.map( eventsInTerm.map(
async (slug) => async (slug) => await getEventBySlug(year, TERMS[term], slug)
await getEventBySlug(year.toString(), TERMS[term], slug)
) )
); );
} catch (error) { } catch (error) {
@ -95,7 +91,7 @@ export async function getUpcomingEvents(): Promise<Event[]> {
).flat(); ).flat();
return events return events
.filter((ev) => new Date(ev.metadata.date).getTime() > Date.now()) .filter((ev) => new Date(ev.metadata.date).getTime() >= Date.now())
.sort((a, b) => { .sort((a, b) => {
return ( return (
new Date(a.metadata.date).getTime() - new Date(a.metadata.date).getTime() -

View File

@ -65,3 +65,40 @@ export async function getNewsBySlug(
metadata: metadata as Metadata, metadata: metadata as Metadata,
}; };
} }
export async function getRecentNews(): Promise<News[]> {
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(
async (slug) => await 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()
);
});
}

View File

@ -1,6 +1,7 @@
import { ParsedUrlQuery } from "querystring"; import { ParsedUrlQuery } from "querystring";
import { GetStaticProps } from "next"; import { GetStaticProps } from "next";
import { MDXRemote } from "next-mdx-remote";
import React from "react"; import React from "react";
import { ConnectWithUs } from "@/components/ConnectWithUs"; import { ConnectWithUs } from "@/components/ConnectWithUs";
@ -11,15 +12,13 @@ import { Image } from "@/components/Image";
import { NewsCard } from "@/components/NewsCard"; import { NewsCard } from "@/components/NewsCard";
import { SocialLinks } from "@/components/SocialLinks"; import { SocialLinks } from "@/components/SocialLinks";
import { Event, getUpcomingEvents } from "@/lib/events"; import { Event, getUpcomingEvents } from "@/lib/events";
import { News, getRecentNews } from "@/lib/news";
import UnavailableContent, {
metadata as unavailableMetadata,
} from "../content/playground/unavailable.news.mdx";
import styles from "./index.module.css"; import styles from "./index.module.css";
interface Props { interface Props {
events: Event[]; events: Event[];
news: News[];
} }
export default function Home(props: Props) { export default function Home(props: Props) {
@ -54,27 +53,29 @@ export default function Home(props: Props) {
<h1 className={styles.cardsHeading}>Upcoming Events</h1> <h1 className={styles.cardsHeading}>Upcoming Events</h1>
<p className={styles.cardsDescription}>See past events here</p> <p className={styles.cardsDescription}>See past events here</p>
<hr className={styles.cardsDividingLine} /> <hr className={styles.cardsDividingLine} />
{props.events.length == 0 ? (
<p>
There are no upcoming events right now. Please check back later!
</p>
) : null}
<div className={styles.eventCards}> <div className={styles.eventCards}>
{props.events.length > 0 ? ( {props.events.length > 0
props.events ? props.events
.slice(0, 2) .slice(0, 2)
.map((event) => ( .map((event) => (
<EventDescriptionCard <EventDescriptionCard
{...event.metadata} {...event.metadata}
date={new Date(event.metadata.date)} date={new Date(event.metadata.date)}
key={event.metadata.name + event.metadata.date.toString()} key={
/> event.metadata.name + event.metadata.date.toString()
)) }
) : ( />
<p> ))
There are no upcoming events right now. Please check back : null}
later!
</p>
)}
{props.events.length > 2 ? (
<p>See more upcoming events here</p>
) : null}
</div> </div>
{props.events.length > 2 ? (
<p>See more upcoming events here</p>
) : null}
</section> </section>
<section className={styles.news} id="news"> <section className={styles.news} id="news">
<h1 className={styles.cardsHeading}>News</h1> <h1 className={styles.cardsHeading}>News</h1>
@ -83,9 +84,16 @@ export default function Home(props: Props) {
See past news here See past news here
</p> </p>
<hr className={styles.cardsDividingLine} /> <hr className={styles.cardsDividingLine} />
<NewsCard {...unavailableMetadata}> {props.news.length > 0 ? (
<UnavailableContent /> <NewsCard
</NewsCard> {...props.news[0].metadata}
date={new Date(props.news[0].metadata.date)}
>
<MDXRemote {...props.news[0].content} />
</NewsCard>
) : (
<p>There is no news right now. Please check back later!</p>
)}
</section> </section>
</div> </div>
</div> </div>
@ -105,5 +113,6 @@ type Params = ParsedUrlQuery;
export const getStaticProps: GetStaticProps<Props, Params> = async () => { export const getStaticProps: GetStaticProps<Props, Params> = async () => {
const events = await getUpcomingEvents(); const events = await getUpcomingEvents();
return { props: { events } }; const news = await getRecentNews();
return { props: { events, news } };
}; };