@@ -7,13 +7,21 @@ import {
77 Course ,
88 CourseId ,
99 CurrentAuditProgress ,
10+ RequirementRule ,
1011 StringSemester ,
1112} from "@/lib/general-types" ;
1213import { createContext , useContext , useEffect , useMemo , useState } from "react" ;
1314import LoadingPage from "../components/loading-page" ;
1415
1516// Context for sharing audit data betw sidebar and main
1617type SemesterInfo = Record < StringSemester , Course [ ] > ;
18+ type RequirementRuleLike = Omit < RequirementRule , "courses" > & {
19+ courses ?: Array < CourseId | Course > ;
20+ } ;
21+ type AuditRequirementLike = Omit < AuditRequirement , "rule" > & {
22+ rule ?: RequirementRuleLike [ ] ;
23+ rules ?: RequirementRuleLike [ ] ;
24+ } ;
1725
1826interface AuditContextType {
1927 sections : AuditRequirement [ ] ;
@@ -35,6 +43,44 @@ interface AuditContextType {
3543
3644const AuditContext = createContext < AuditContextType | null > ( null ) ;
3745
46+ function normalizeCourseDict (
47+ courses : Record < CourseId , Course > | Course [ ] | null | undefined ,
48+ ) : Record < CourseId , Course > {
49+ if ( ! courses ) {
50+ return { } ;
51+ }
52+
53+ if ( Array . isArray ( courses ) ) {
54+ return courses . reduce (
55+ ( acc , course ) => ( {
56+ ...acc ,
57+ [ course . id ] : course ,
58+ } ) ,
59+ { } as Record < CourseId , Course > ,
60+ ) ;
61+ }
62+
63+ return courses ;
64+ }
65+
66+ function normalizeRequirements (
67+ requirements : AuditRequirementLike [ ] ,
68+ ) : AuditRequirement [ ] {
69+ return requirements . map ( ( section ) => ( {
70+ ...section ,
71+ rule : ( section . rule ?? section . rules ?? [ ] ) . map ( ( rule ) => ( {
72+ ...rule ,
73+ courses : ( rule . courses ?? [ ] )
74+ . map ( ( courseRef ) =>
75+ typeof courseRef === "object" && courseRef !== null
76+ ? courseRef . id
77+ : courseRef ,
78+ )
79+ . filter ( Boolean ) as CourseId [ ] ,
80+ } ) ) ,
81+ } ) ) ;
82+ }
83+
3884export const AuditContextProvider = ( {
3985 children,
4086} : {
@@ -106,17 +152,10 @@ export const AuditContextProvider = ({
106152 // Load requirements from cache
107153 const cached = await getAuditData ( currentAuditId ! ) ;
108154 if ( cached ) {
109- setSections (
110- cached . requirements . map ( ( section ) => ( {
111- ...section ,
112- rules : section . rule . map ( ( rule ) => ( {
113- ...rule ,
114- courses : rule . courses ,
115- } ) ) ,
116- } ) ) ,
117- ) ;
155+ const normalizedCourses = normalizeCourseDict ( cached . courses ) ;
156+ setSections ( normalizeRequirements ( cached . requirements ) ) ;
118157 console . log ( "[Main] courses" , cached . courses ) ;
119- setCourseDict ( cached . courses ) ;
158+ setCourseDict ( normalizedCourses ) ;
120159 } else console . warn ( `[Main] Audit ${ currentAuditId } not in cache.` ) ;
121160
122161 setLoaded ( true ) ;
0 commit comments