commitc46e4a51c9Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Mon Feb 19 21:37:46 2024 -0600 change from reducer pattern to state variables, remove chartData from state commit36bcdd2522Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Mon Feb 19 21:15:41 2024 -0600 change grade distribution colors to match updated figma commit11a50df88dMerge:c16b301b4c96a9Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Mon Feb 19 17:57:13 2024 -0600 Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup commitc16b301ff0Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Mon Feb 19 17:47:21 2024 -0600 Kinda complete the handlers commit1ac1d9095aAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sun Feb 18 17:36:59 2024 -0600 Bunch of renaming commit925829ad41Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sun Feb 18 17:24:53 2024 -0600 Fix syllabi url Remove unused variable and unnecessary args to url commitf2e5d51eb3Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sun Feb 18 17:24:22 2024 -0600 Add TODO replace current grade colors with a tailwind palette commit747ee44440Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sun Feb 18 01:26:51 2024 -0600 Minor tweaks change style in header commitddfe952a32Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sun Feb 18 01:26:38 2024 -0600 Add Grade Distribution Stuff commitc27bf3c390Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sun Feb 18 01:26:13 2024 -0600 Modify story to use proper course info commit7afdbac1b8Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 16:37:01 2024 -0600 description stuff done commit1a89432276Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 15:26:32 2024 -0600 Rename CoursePopup Old one to "Old", remove "2" from new one commit4c2b31e61aAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 15:23:01 2024 -0600 add todo for calendar button commit11b7a51dedAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 15:22:18 2024 -0600 add course button onclick handlers commitf2dfcec838Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 14:52:38 2024 -0600 some unocss updates commitf9f375514bAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 13:00:46 2024 -0600 Add rmp callback commit122fc6dbddAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 13:00:16 2024 -0600 Change test course to 314 commit19b124b3bdAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 12:19:21 2024 -0600 complete CourseHeaderAndActions Component added course buttons, using proper subcomponents now. commit2eea01fc74Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 11:22:12 2024 -0600 use chip component in header commit9cb13c8fd1Merge:a62b7189392085Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 11:21:12 2024 -0600 Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup commita62b718c43Merge:43d26757b7b858Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 10:57:24 2024 -0600 Merge branch 'hackathon' into abhinavchadaga/course-catalog-popup commit43d2675be5Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Sat Feb 17 10:54:49 2024 -0600 some work on course popup update the stories and create the header component commit31bcef3099Merge:874f8d5fa1d737Author: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Wed Feb 14 14:33:16 2024 -0600 Merge branch 'main' into abhinavchadaga/course-catalog-popup pulling from main commit874f8d56cbAuthor: Abhinav Chadaga <abhinav.chadaga@utexas.edu> Date: Wed Feb 14 14:30:24 2024 -0600 some work
92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
import { Course } from '@shared/types/Course';
|
|
import clsx from 'clsx';
|
|
import React, { useEffect, useState } from 'react';
|
|
import Spinner from '@views/components/common/Spinner/Spinner';
|
|
import Text from '@views/components/common/Text/Text';
|
|
import { CourseCatalogScraper } from '@views/lib/CourseCatalogScraper';
|
|
import { SiteSupport } from '@views/lib/getSiteSupport';
|
|
import Card from '../../../common/Card/Card';
|
|
import styles from './CourseDescription.module.scss';
|
|
|
|
type Props = {
|
|
course: Course;
|
|
};
|
|
|
|
enum LoadStatus {
|
|
LOADING = 'LOADING',
|
|
DONE = 'DONE',
|
|
ERROR = 'ERROR',
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
export default function CourseDescription({ course }: Props) {
|
|
const [description, setDescription] = useState<string[]>([]);
|
|
const [status, setStatus] = useState<LoadStatus>(LoadStatus.LOADING);
|
|
|
|
useEffect(() => {
|
|
fetchDescription(course)
|
|
.then(description => {
|
|
setStatus(LoadStatus.DONE);
|
|
setDescription(description);
|
|
})
|
|
.catch(() => {
|
|
setStatus(LoadStatus.ERROR);
|
|
});
|
|
}, [course]);
|
|
|
|
return (
|
|
<Card className={styles.container}>
|
|
{status === LoadStatus.ERROR && (
|
|
<Text color='speedway_brick' /* size='medium' weight='bold' align='center' */>
|
|
Please refresh the page and log back in using your UT EID and password
|
|
</Text>
|
|
)}
|
|
{status === LoadStatus.LOADING && <Spinner className={styles.spinner} />}
|
|
{status === LoadStatus.DONE && (
|
|
<ul className={styles.description}>
|
|
{description.map(paragraph => (
|
|
<li key={paragraph}>
|
|
<DescriptionLine line={paragraph} />
|
|
</li>
|
|
))}
|
|
</ul>
|
|
)}
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
interface LineProps {
|
|
line: string;
|
|
}
|
|
|
|
function DescriptionLine({ line }: LineProps) {
|
|
const lowerCaseLine = line.toLowerCase();
|
|
|
|
const className = clsx({
|
|
[styles.prerequisite]: lowerCaseLine.includes('prerequisite'),
|
|
[styles.onlyOne]:
|
|
lowerCaseLine.includes('may be') || lowerCaseLine.includes('only one') || lowerCaseLine.includes('may not'),
|
|
[styles.restriction]: lowerCaseLine.includes('restrict'),
|
|
});
|
|
|
|
return (
|
|
<Text className={className} /* size='medium' */>
|
|
{line}
|
|
</Text>
|
|
);
|
|
}
|
|
|
|
async function fetchDescription(course: Course): Promise<string[]> {
|
|
if (!course.description?.length) {
|
|
const response = await fetch(course.url);
|
|
const text = await response.text();
|
|
const doc = new DOMParser().parseFromString(text, 'text/html');
|
|
|
|
const scraper = new CourseCatalogScraper(SiteSupport.COURSE_CATALOG_DETAILS);
|
|
course.description = scraper.getDescription(doc);
|
|
}
|
|
return course.description;
|
|
}
|