mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-27 07:58:31 -06:00
add previous and next buttons (lectures are separate from assignments/quizzes/pages)
This commit is contained in:
83
src/app/course/[courseName]/hooks/navigationLogic.ts
Normal file
83
src/app/course/[courseName]/hooks/navigationLogic.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import { CalendarItemsInterface } from "../context/calendarItemsContext";
|
||||
import { getLectureUrl, getModuleItemUrl } from "@/services/urlUtils";
|
||||
|
||||
export type CourseItemType = "assignment" | "quiz" | "page" | "lecture";
|
||||
|
||||
export interface OrderedCourseItem {
|
||||
type: CourseItemType;
|
||||
name: string;
|
||||
moduleName?: string;
|
||||
date: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export function getOrderedItems(
|
||||
courseName: string,
|
||||
...calendars: CalendarItemsInterface[]
|
||||
): OrderedCourseItem[] {
|
||||
const itemTypes = [
|
||||
{ key: "assignments" as const, type: "assignment" as const },
|
||||
{ key: "quizzes" as const, type: "quiz" as const },
|
||||
{ key: "pages" as const, type: "page" as const },
|
||||
];
|
||||
|
||||
return calendars
|
||||
.flatMap((calendar) =>
|
||||
Object.entries(calendar).flatMap(([date, modules]) =>
|
||||
Object.entries(modules).flatMap(([moduleName, moduleData]) =>
|
||||
itemTypes.flatMap(({ key, type }) =>
|
||||
(moduleData[key] || []).map((item) => ({
|
||||
type,
|
||||
name: item.name,
|
||||
moduleName,
|
||||
date,
|
||||
url: getModuleItemUrl(courseName, moduleName, type, item.name),
|
||||
}))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
.sort((a, b) => {
|
||||
const dateCompare = a.date.localeCompare(b.date);
|
||||
if (dateCompare !== 0) return dateCompare;
|
||||
return a.name.localeCompare(b.name);
|
||||
});
|
||||
}
|
||||
|
||||
export function getOrderedLectures(
|
||||
weeks: { lectures: { date: string }[] }[],
|
||||
courseName: string
|
||||
): OrderedCourseItem[] {
|
||||
return weeks
|
||||
.flatMap((week) => week.lectures)
|
||||
.map((lecture) => ({
|
||||
type: "lecture",
|
||||
name: lecture.date,
|
||||
date: lecture.date,
|
||||
url: getLectureUrl(courseName, lecture.date),
|
||||
}));
|
||||
}
|
||||
|
||||
export function getNavigationLinks(
|
||||
list: OrderedCourseItem[],
|
||||
type: CourseItemType,
|
||||
name: string,
|
||||
moduleName?: string
|
||||
) {
|
||||
const index = list.findIndex((item) => {
|
||||
if (type === "lecture") return item.date === name;
|
||||
return (
|
||||
item.name === name && item.type === type && item.moduleName === moduleName
|
||||
);
|
||||
});
|
||||
|
||||
if (index === -1) return { previousUrl: null, nextUrl: null };
|
||||
|
||||
const previousIndex = (index - 1 + list.length) % list.length;
|
||||
const nextIndex = (index + 1) % list.length;
|
||||
|
||||
return {
|
||||
previousUrl: list[previousIndex].url,
|
||||
nextUrl: list[nextIndex].url,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user