|
|
|
@ -5,6 +5,8 @@ import matter from "gray-matter"; |
|
|
|
|
import { MDXRemoteSerializeResult } from "next-mdx-remote"; |
|
|
|
|
import { serialize } from "next-mdx-remote/serialize"; |
|
|
|
|
|
|
|
|
|
import type { Props } from "@/pages/events/[year]/[term]/index"; |
|
|
|
|
|
|
|
|
|
const EVENTS_PATH = path.join("content", "events"); |
|
|
|
|
export const TERMS = ["winter", "spring", "fall"]; |
|
|
|
|
|
|
|
|
@ -58,9 +60,15 @@ export async function getEventsByTerm( |
|
|
|
|
year: string, |
|
|
|
|
term: string |
|
|
|
|
): Promise<string[]> { |
|
|
|
|
return (await fs.readdir(path.join(EVENTS_PATH, year, term))) |
|
|
|
|
.filter((name) => name.endsWith(".md")) |
|
|
|
|
.map((name) => name.slice(0, -".md".length)); |
|
|
|
|
let retval: string[] = []; |
|
|
|
|
try { |
|
|
|
|
retval = (await fs.readdir(path.join(EVENTS_PATH, year, term))) |
|
|
|
|
.filter((name) => name.endsWith(".md")) |
|
|
|
|
.map((name) => name.slice(0, -".md".length)); |
|
|
|
|
} catch { |
|
|
|
|
return []; |
|
|
|
|
} |
|
|
|
|
return retval; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export async function getUpcomingEvents(): Promise<Event[]> { |
|
|
|
@ -97,3 +105,139 @@ export async function getUpcomingEvents(): Promise<Event[]> { |
|
|
|
|
); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export async function getProps( |
|
|
|
|
year: string, |
|
|
|
|
term: string |
|
|
|
|
): Promise<{ props: Props }> { |
|
|
|
|
const eventNames = await getEventsByTerm(year, term); |
|
|
|
|
|
|
|
|
|
const events: Event[] = ( |
|
|
|
|
await Promise.all( |
|
|
|
|
eventNames.map((file: string) => getEventBySlug(year, term, file)) |
|
|
|
|
) |
|
|
|
|
).sort( |
|
|
|
|
(a, b) => |
|
|
|
|
new Date(a.metadata.date).getTime() - new Date(b.metadata.date).getTime() |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
const pastEvents = events |
|
|
|
|
.filter((event) => new Date(event.metadata.date).getTime() < Date.now()) |
|
|
|
|
.reverse(); |
|
|
|
|
|
|
|
|
|
const futureEvents = events.filter( |
|
|
|
|
(event) => new Date(event.metadata.date).getTime() >= Date.now() |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
const current = getCurrentTerm(); |
|
|
|
|
|
|
|
|
|
const eventYears = await getEventYears(); |
|
|
|
|
|
|
|
|
|
const minYear = eventYears[0]; |
|
|
|
|
const pastTerms: { year: string; term: string }[] = []; |
|
|
|
|
let curPastYear = year; |
|
|
|
|
let curPastTerm = term; |
|
|
|
|
while (parseInt(curPastYear) >= parseInt(minYear) && pastTerms.length < 2) { |
|
|
|
|
const pastTerm = getPastTerm(curPastYear, curPastTerm); |
|
|
|
|
curPastYear = pastTerm.year; |
|
|
|
|
curPastTerm = pastTerm.term; |
|
|
|
|
if ((await getEventsByTerm(curPastYear, curPastTerm)).length !== 0) { |
|
|
|
|
pastTerms.push(pastTerm); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const maxYear = eventYears[eventYears.length - 1]; |
|
|
|
|
const futureTerms: { year: string; term: string }[] = []; |
|
|
|
|
let curFutureYear = year; |
|
|
|
|
let curFutureTerm = term; |
|
|
|
|
while ( |
|
|
|
|
parseInt(curFutureYear) <= parseInt(maxYear) && |
|
|
|
|
futureTerms.length < 2 |
|
|
|
|
) { |
|
|
|
|
const futureTerm = getFutureTerm(curFutureYear, curFutureTerm); |
|
|
|
|
curFutureYear = futureTerm.year; |
|
|
|
|
curFutureTerm = futureTerm.term; |
|
|
|
|
if ((await getEventsByTerm(curFutureYear, curFutureTerm)).length !== 0) { |
|
|
|
|
futureTerms.push(futureTerm); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
props: { |
|
|
|
|
year: year, |
|
|
|
|
term: term, |
|
|
|
|
pastEvents: pastEvents, |
|
|
|
|
futureEvents: futureEvents, |
|
|
|
|
isCurrentTerm: term === current.term && year === current.year, |
|
|
|
|
pastTerms: pastTerms, |
|
|
|
|
futureTerms: futureTerms, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function getCurrentTerm(): { year: string; term: string } { |
|
|
|
|
const date = new Date(); |
|
|
|
|
let term = ""; |
|
|
|
|
const year = date.getUTCFullYear().toString(); |
|
|
|
|
|
|
|
|
|
if ( |
|
|
|
|
new Date(`${year}-01-01`).getTime() <= date.getTime() && |
|
|
|
|
date.getTime() <= new Date(`${year}-04-30`).getTime() |
|
|
|
|
) { |
|
|
|
|
term = "winter"; |
|
|
|
|
} else if ( |
|
|
|
|
new Date(`${year}-05-01`).getTime() <= date.getTime() && |
|
|
|
|
date.getTime() <= new Date(`${year}-08-31`).getTime() |
|
|
|
|
) { |
|
|
|
|
term = "spring"; |
|
|
|
|
} else if ( |
|
|
|
|
new Date(`${year}-09-01`).getTime() <= date.getTime() && |
|
|
|
|
date.getTime() <= new Date(`${year}-12-31`).getTime() |
|
|
|
|
) { |
|
|
|
|
term = "fall"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return { year, term }; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function getPastTerm( |
|
|
|
|
year: string, |
|
|
|
|
term: string |
|
|
|
|
): { year: string; term: string } { |
|
|
|
|
const index = TERMS.indexOf(term); |
|
|
|
|
if (index === -1) { |
|
|
|
|
console.error("Not a valid term"); |
|
|
|
|
return { year: "", term: "" }; |
|
|
|
|
} else if (index === 0) { |
|
|
|
|
return { |
|
|
|
|
year: (parseInt(year) - 1).toString(), |
|
|
|
|
term: TERMS[TERMS.length - 1], |
|
|
|
|
}; |
|
|
|
|
} else { |
|
|
|
|
return { |
|
|
|
|
year: year, |
|
|
|
|
term: TERMS[index - 1], |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function getFutureTerm( |
|
|
|
|
year: string, |
|
|
|
|
term: string |
|
|
|
|
): { year: string; term: string } { |
|
|
|
|
const index = TERMS.indexOf(term); |
|
|
|
|
if (index === -1) { |
|
|
|
|
console.error("Not a valid term"); |
|
|
|
|
return { year: "", term: "" }; |
|
|
|
|
} else if (index === TERMS.length - 1) { |
|
|
|
|
return { |
|
|
|
|
year: (parseInt(year) + 1).toString(), |
|
|
|
|
term: TERMS[0], |
|
|
|
|
}; |
|
|
|
|
} else { |
|
|
|
|
return { |
|
|
|
|
year: year, |
|
|
|
|
term: TERMS[index + 1], |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|