import { useState, useEffect, useRef, Fragment } from 'react'; import dayjs from 'dayjs'; import localeData from 'dayjs/plugin/localeData'; import customParseFormat from 'dayjs/plugin/customParseFormat'; import { useSettingsStore } from 'stores'; import { Legend, Center } from 'components'; import { Wrapper, ScrollWrapper, Container, Date, Times, DateLabel, DayLabel, Time, Spacer, Tooltip, TooltipTitle, TooltipDate, TooltipContent, TooltipPerson, TimeLabels, TimeLabel, TimeSpace, People, Person, StyledMain, } from './availabilityViewerStyle'; dayjs.extend(localeData); dayjs.extend(customParseFormat); const AvailabilityViewer = ({ times, timeLabels, dates, isSpecificDates, people = [], min = 0, max = 0, ...props }) => { const [tooltip, setTooltip] = useState(null); const timeFormat = useSettingsStore(state => state.timeFormat); const [filteredPeople, setFilteredPeople] = useState([]); const [touched, setTouched] = useState(false); const [tempFocus, setTempFocus] = useState(null); const [focusCount, setFocusCount] = useState(null); const wrapper = useRef(); useEffect(() => { setFilteredPeople(people.map(p => p.name)); setTouched(people.length <= 1); }, [people]); return ( <> p.availability.length > 0).length} onSegmentFocus={count => setFocusCount(count)} />
Hover or tap the calendar below to see who is available
{people.length > 1 && ( <>
Click the names below to view people individually
{people.map((person, i) => { setTempFocus(null); if (filteredPeople.includes(person.name)) { if (!touched) { setTouched(true); setFilteredPeople([person.name]); } else { setFilteredPeople(filteredPeople.filter(n => n !== person.name)); } } else { setFilteredPeople([...filteredPeople, person.name]); } }} onMouseOver={() => setTempFocus(person.name)} onMouseOut={() => setTempFocus(null)} >{person.name} )} )}
{!!timeLabels.length && timeLabels.map((label, i) => {label.label?.length !== '' && {label.label}} )} {dates.map((date, i) => { const parsedDate = isSpecificDates ? dayjs(date, 'DDMMYYYY') : dayjs().day(date); const last = dates.length === i+1 || (isSpecificDates ? dayjs(dates[i+1], 'DDMMYYYY') : dayjs().day(dates[i+1])).diff(parsedDate, 'day') > 1; return ( {isSpecificDates && {parsedDate.format('MMM D')}} {parsedDate.format('ddd')} {timeLabels.map((timeLabel, i) => { if (!timeLabel.time) return null; if (!times.includes(`${timeLabel.time}-${date}`)) { return ( ); } const time = `${timeLabel.time}-${date}`; const peopleHere = tempFocus !== null ? people.filter(person => person.availability.includes(time) && tempFocus === person.name).map(person => person.name) : people.filter(person => person.availability.includes(time) && filteredPeople.includes(person.name)).map(person => person.name); return ( {last && dates.length !== i+1 && ( )} ); })} {tooltip && ( {tooltip.available} {tooltip.date} {!!filteredPeople.length && ( {tooltip.people.map(person => {person} )} {filteredPeople.filter(p => !tooltip.people.includes(p)).map(person => {person} )} )} )} ); }; export default AvailabilityViewer;