diff --git a/app/assignments/assessment/[slug]/page.tsx b/app/assignments/assessment/[slug]/page.tsx index ec30701..35d0964 100644 --- a/app/assignments/assessment/[slug]/page.tsx +++ b/app/assignments/assessment/[slug]/page.tsx @@ -1,4 +1,4 @@ -import { allAssessments } from 'contentlayer/generated' +import { Assessment, allAssessments } from 'contentlayer/generated' import { notFound } from 'next/navigation' import { useMDXComponent } from 'next-contentlayer/hooks' import { mdxComponents } from '@/components/mdx' @@ -13,12 +13,18 @@ export async function generateStaticParams() { })) } +function AssessmentContent({ page }: { page: Assessment }) { + const MDXContent = useMDXComponent(page.body.code) + return +} + export default function Assessment({ params }: { params: { slug: string } }) { const page = allAssessments.find(page => page.slug === params.slug) if (!page) notFound() - const MDXContent = useMDXComponent(page.body.code) - const content = + const content = page.body ? + : + "This assignment hasn't been released yet." return {page.title}}> diff --git a/app/assignments/hw/[slug]/page.tsx b/app/assignments/hw/[slug]/page.tsx index d7c9a2f..2a1fdbe 100644 --- a/app/assignments/hw/[slug]/page.tsx +++ b/app/assignments/hw/[slug]/page.tsx @@ -1,9 +1,9 @@ -import { allHomework } from 'contentlayer/generated' import { notFound } from 'next/navigation' import { useMDXComponent } from 'next-contentlayer/hooks' import { mdxComponents } from '@/components/mdx' import { Card } from '@/components/Card' import { Prose } from '@/components/Prose' +import { Homework, allHomework } from 'contentlayer/generated' export async function generateStaticParams() { if (!allHomework.length) return [{ slug: "dummy" }] @@ -13,12 +13,18 @@ export async function generateStaticParams() { })) } +function HomeworkContent({ page }: { page: Homework }) { + const MDXContent = useMDXComponent(page.body.code) + return +} + export default function Homework({ params }: { params: { slug: string } }) { const page = allHomework.find(page => page.slug === params.slug) if (!page) notFound() - const MDXContent = useMDXComponent(page.body.code) - const content = + const content = page.body ? + : + "This assignment hasn't been released yet." return {page.title}}> diff --git a/app/assignments/page.tsx b/app/assignments/page.tsx index 3f422fe..07a0782 100644 --- a/app/assignments/page.tsx +++ b/app/assignments/page.tsx @@ -1,102 +1,8 @@ -import { allHomework, allAssessments } from 'contentlayer/generated' import { Card } from '@/components/Card' -import Link from 'next/link' -import { FormattedDate } from '@/components/FormattedDate' - -type Assignment = { - title: string - href: string - isReleased: boolean - releaseDate?: Date - dates: { - name: string - date: Date - specifyTime: boolean - }[] - sortDate: Date -} - -export const formattedHomework: Assignment[] = allHomework.map(hw => { - const due = new Date(hw.dueDate) - - return { - title: hw.title, - href: `/assignments/hw/${hw.slug}`, - isReleased: hw.isReleased, - releaseDate: hw.releaseDate && new Date(hw.releaseDate), - dates: [ - ...(hw.auxiliaryDates ?? []).map(aux => ({ - name: aux.name, - date: new Date(aux.date), - specifyTime: true, - })), - { - name: "Due", - date: due, - specifyTime: true, - } - ], - sortDate: new Date(hw.dueDate), - } -}) - -export const formattedAssessments = allAssessments.map(a => { - const date = new Date(a.assessmentDate) - - return { - title: a.title, - href: `/assignments/assessment/${a.slug}`, - isReleased: a.isReleased, - releaseDate: a.releaseDate && new Date(a.releaseDate), - dates: [ - { - name: "Scheduled", - date, - specifyTime: false, - } - ], - sortDate: date, - } -}) - -function AssignmentRow({ title, href, isReleased, releaseDate, dates }: Assignment) { - let className = "border-b border-neutral-300 dark:border-neutral-600 py-2 last:pb-0 last:border-0 block lg:table-row w-full" - if (!isReleased) { - className += " opacity-50" - } - - return - - {isReleased ? - {title} : - {title}{releaseDate && <> (available )}} - - - {dates.map((item, index) =>
- {item.name} -
)} - - -} - -export function AssignmentTable({ assignments: raw }: { assignments: Assignment[] }) { - const data = raw.toSorted((a, b) => a.sortDate.getTime() - b.sortDate.getTime()) - - return - - - - - - - - {data.map(assignment => )} - -
NameDate
-} +import { AssignmentTable, formattedAssessments, formattedHomework } from '@/components/AssignmentTable' export default function Assignments() { - if (!allHomework.length && !allAssessments.length) { + if (!formattedHomework.length && !formattedAssessments.length) { return There are currently no assignments for this class. @@ -104,10 +10,10 @@ export default function Assignments() { return
Here you'll find all assignments for this class.
- {allHomework.length > 0 && Homework} margin={allAssessments.length > 0}> + {formattedHomework.length > 0 && Homework} margin={formattedAssessments.length > 0}> } - {allAssessments.length > 0 && Assessments}> + {formattedAssessments.length > 0 && Assessments}> }
diff --git a/app/layout.tsx b/app/layout.tsx index 9045335..a71c900 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,10 +2,14 @@ import "@/styles/global.css" import "prism-themes/themes/prism-atom-dark.css" import { Menu, MenuContextProvider } from "./menu" import { TimezoneNotice } from "@/components/TimezoneNotice" +import { Metadata } from "next" -export const metadata = { - title: 'Next.js', - description: 'Generated by Next.js', +export const metadata: Metadata = { + title: { + default: "CIS 1951", + template: "%s | CIS 1951", + }, + description: "An intro to iOS development course at the University of Pennsylvania.", } export default function RootLayout({ diff --git a/app/schedule/content.tsx b/app/schedule/content.tsx index db1e996..04cd85d 100644 --- a/app/schedule/content.tsx +++ b/app/schedule/content.tsx @@ -25,17 +25,18 @@ export function SchedulePageContent() { return
Please choose a section:
- {sections.map(section => )} + {sections.map(section => )}
You can change this later.
} - const schedule = getSchedule(section) + const schedule = getSchedule(null) + const time = sections.find(s => s.id === section)?.time ?? "Unknown Section" return
- You're currently viewing the schedule for section {section}. diff --git a/components/AssignmentTable.tsx b/components/AssignmentTable.tsx new file mode 100644 index 0000000..cb143f7 --- /dev/null +++ b/components/AssignmentTable.tsx @@ -0,0 +1,95 @@ +import Link from "next/link" +import { FormattedDate } from "./FormattedDate" +import { allAssessments, allHomework } from "contentlayer/generated" + +export type Assignment = { + title: string + href: string + isReleased: boolean + releaseDate?: Date + dates: { + name: string + date: Date + specifyTime: boolean + }[] + sortDate: Date +} + +export const formattedHomework: Assignment[] = allHomework.map(hw => { + const due = new Date(hw.dueDate) + + return { + title: hw.title, + href: `/assignments/hw/${hw.slug}`, + isReleased: hw.isReleased, + releaseDate: hw.releaseDate && new Date(hw.releaseDate), + dates: [ + ...(hw.auxiliaryDates ?? []).map(aux => ({ + name: aux.name, + date: new Date(aux.date), + specifyTime: true, + })), + { + name: "Due", + date: due, + specifyTime: true, + } + ], + sortDate: new Date(hw.dueDate), + } +}) + +export const formattedAssessments = allAssessments.map(a => { + const date = new Date(a.assessmentDate) + + return { + title: a.title, + href: `/assignments/assessment/${a.slug}`, + isReleased: a.isReleased, + releaseDate: a.releaseDate && new Date(a.releaseDate), + dates: [ + { + name: "Scheduled", + date, + specifyTime: false, + } + ], + sortDate: date, + } +}) + +export function AssignmentRow({ title, href, isReleased, releaseDate, dates }: Assignment) { + let className = "border-b border-neutral-300 dark:border-neutral-600 py-2 last:pb-0 last:border-0 block lg:table-row w-full" + if (!isReleased) { + className += " opacity-50" + } + + return + + {isReleased ? + {title} : + {title}{releaseDate && <> (available )}} + + + {dates.map((item, index) =>
+ {item.name} +
)} + + +} + +export function AssignmentTable({ assignments: raw }: { assignments: Assignment[] }) { + const data = raw.toSorted((a, b) => a.sortDate.getTime() - b.sortDate.getTime()) + + return + + + + + + + + {data.map(assignment => )} + +
NameDate
+} \ No newline at end of file diff --git a/content/homework/hw1.mdx b/content/homework/hw1.mdx index 758c718..27b7336 100644 --- a/content/homework/hw1.mdx +++ b/content/homework/hw1.mdx @@ -3,4 +3,6 @@ title: HW1 - Basic Swift isReleased: false dueDate: 2024-01-23T23:59:00-05:00 releaseDate: 2024-01-24T23:59:00-05:00 ---- \ No newline at end of file +--- + +This content should not appear in the final export. \ No newline at end of file diff --git a/contentlayer.config.ts b/contentlayer.config.ts index 8625842..c2ac838 100644 --- a/contentlayer.config.ts +++ b/contentlayer.config.ts @@ -48,6 +48,13 @@ export const Homework = defineDocumentType(() => ({ }, computedFields: { slug: { type: 'string', resolve: page => page._raw.flattenedPath.slice("homework/".length) }, + body: { + type: 'mdx', + resolve(page) { + if (page.isReleased) return page.body + return undefined + }, + }, }, })) @@ -63,13 +70,20 @@ export const Assessment = defineDocumentType(() => ({ }, computedFields: { slug: { type: 'string', resolve: page => page._raw.flattenedPath.slice("assessments/".length) }, + body: { + type: 'mdx', + resolve(page) { + if (page.isReleased) return page.body + return undefined + }, + }, }, })) const LectureDates = defineNestedType(() => { const fields = {} sections.forEach(section => { - fields[section] = { type: 'date', required: false } + fields[section.id] = { type: 'date', required: false } }) return { diff --git a/sections.json b/sections.json index f8da1be..fb3e57d 100644 --- a/sections.json +++ b/sections.json @@ -1 +1,10 @@ -["201", "202"] \ No newline at end of file +[ + { + "id": "201", + "time": "Thursdays 7pm" + }, + { + "id": "202", + "time": "Mondays 5:15pm" + } +] \ No newline at end of file