import { format } from 'date-fns' import _ from 'lodash' import { useEffect, useRef, useState } from 'preact/hooks' import { prettyCourseName, WEEK_DAYS } from '../../utils.jsx' export const Course = ({ events, selection, setSelection, hideOtherCourses }) => { const selectionSet = new Set(selection) const visibleEvents = !hideOtherCourses ? events : events.filter(e => selectionSet.has(e.id)) const eventsByCourse = _.groupBy(_.sortBy(visibleEvents, 'id'), 'id') const profsPerCourse = _.mapValues(eventsByCourse, events => _.uniq(events.flatMap(event => event.docenti)) ) const [currentlyHovered, setCurrentlyHovered] = useState(null) const element = useRef() useEffect(() => { if (element.current) { const l = e => { const isMobile = window.matchMedia('(pointer: coarse)').matches const $course = e.target.closest('.course') if ($course && !isMobile) { setCurrentlyHovered($course.dataset.courseId) } else { setCurrentlyHovered(null) } } element.current.addEventListener('mousemove', l) element.current.addEventListener('mouseleave', l) return () => { element.current.removeEventListener('mousemove', l) element.current.removeEventListener('mouseleave', l) } } }, [element.current]) return (
{Object.entries(eventsByCourse).map(([id, courseEvents]) => (
{ if (!selectionSet.has(id)) setSelection([...selection, id]) else setSelection(selection.filter(selId => selId !== id)) }} >
{prettyCourseName(courseEvents[0].name)}
{profsPerCourse[id].join(', ')}
{courseEvents.map(course => (
{WEEK_DAYS[course.start.getDay()]}{' '} {format(course.start, 'H:mm')}– {format(course.end, 'H:mm')} {course.aule.join(', ')}
))}
))}
) }