/** @jsxRuntime classic */ /** @jsx jsx */ import { useTheme } from '@emotion/react'; import { css, jsx } from '@emotion/react'; import dayjs from 'dayjs'; import React, { Dispatch, SetStateAction, useEffect, useState } from 'react'; import { BnIcon, Toggle } from '../../components'; import { WeekDay } from '../../components/DateInput/comp/Date'; import { useTypography } from '../../hooks/useTypography'; import { ResourceObj } from '../../types/entities/resources'; import { ResourcesToProduct } from '../../types/entities/resources-to-products'; import { Icons } from '../../types/theme'; import { DayCheck } from './dateCheck'; import { DayCheckBox } from './dayCheckbox'; import { dateContainerCss, emptySlot } from './style'; const strDayToNum = { Mon: 2, Tue: 3, Wed: 4, Thu: 5, Fri: 6, Sat: 7, Sun: 8, }; const DayOfWeek = (day: number) => { switch (day) { case 2: return 'Mon'; case 3: return 'Tue'; case 4: return 'Wed'; case 5: return 'Thu'; case 6: return 'Fri'; case 7: return 'Sat'; case 8: return 'Sun'; default: return ''; } }; interface IDateOption { title: string; subTitle: string; } interface IEventDetail { id: number; date: string; dayOfWeek: number; } interface IDateAddon { label: string; options: IDateOption[]; events: ResourcesToProduct; selected: number[]; setSelected: Dispatch>; clearTrigger: boolean; } interface IMax { index: number; value: number; } export const DateAddon = ({ label, options, events, selected: selectedEvents, setSelected: setSelectedEvents, clearTrigger, }: IDateAddon) => { const [filterDays, setFilterDays] = useState([]); const [isSelectAll, setSelectAll] = useState(false); const colors = useTheme(); const { typography } = useTypography(); const [monthMatrix, setMonth] = useState([]); const [relevantDays, setRelevantDays] = useState([]); const [max, setMax] = useState(); // const [selectedEvents, setSelectedEvents] = useState([]); const selectAll = () => { setSelectedEvents(events.resources.map((re) => re.id)); }; useEffect(() => { if (isSelectAll) { selectAll(); } else { setSelectedEvents([]); } }, [isSelectAll]); // eslint-disable-line react-hooks/exhaustive-deps const handleChange = (val: string) => { if (filterDays.includes(val)) { setFilterDays(filterDays.filter((x) => x !== val)); } else { setFilterDays([...filterDays, val]); } }; useEffect(() => { setFilterDays([]); setSelectAll(false); }, [clearTrigger]); useEffect(() => { const array = [...events.resources]; if (events?.resources?.length !== 0) { const fullMonth = []; const month = []; let week: number[] = []; let fullWeek: IEventDetail[] = []; let maxDays: IMax = { index: 0, value: 0 }; array .sort((a, b) => { return ( dayjs((a as ResourceObj).startDate).valueOf() - dayjs((b as ResourceObj).startDate).valueOf() ); }) .forEach((resource) => { const day: WeekDay = (dayjs( (resource as ResourceObj).startDateString ).format('ddd') as unknown) as WeekDay; const dayOfWeek = strDayToNum[String(day)]; if (week?.length !== 0 && dayOfWeek <= week[week?.length - 1]) { month.push(week); if (maxDays.value <= week?.length) { maxDays = { index: month?.length - 1, value: week?.length, }; } week = []; week.push(dayOfWeek); fullMonth.push(fullWeek); fullWeek = []; fullWeek.push({ id: resource.id, date: (resource as ResourceObj).startDateString, dayOfWeek: dayOfWeek, }); } else { week.push(dayOfWeek); fullWeek.push({ id: resource.id, date: (resource as ResourceObj).startDateString, dayOfWeek: dayOfWeek, }); } }); if (week?.length !== 0) { month.push(week); } if (fullWeek?.length !== 0) { fullMonth.push(fullWeek); } setMax(maxDays); setRelevantDays(month[maxDays.index]); setMonth(fullMonth); } }, [events]); // eslint-disable-line react-hooks/exhaustive-deps const handleChoose = (val: number) => { if (selectedEvents.includes(val)) { setSelectedEvents(selectedEvents.filter((event) => event !== val)); } else { setSelectedEvents([...selectedEvents, val]); } }; useEffect(() => { if (filterDays?.length !== 0) { const arr: number[] = []; monthMatrix.forEach((week) => { week.forEach((d) => { if (filterDays.includes(DayOfWeek(d.dayOfWeek))) { arr.push(d.id); } }); }); setSelectedEvents(arr); } else { setSelectedEvents([]); } }, [filterDays]); // eslint-disable-line react-hooks/exhaustive-deps const renderEmptySlots = (week: IEventDetail[], isTinyView: boolean) => { const arr = []; if (max) { if (relevantDays[0] !== week[0].dayOfWeek) { for (let i = 0; i < (max as IMax).value - week.length; i++) { arr.push(
); } } } return arr; }; return (
{options.map((scheduler, index) => { return (

{scheduler.title}

{scheduler.subTitle}

{relevantDays.map((day, j) => { return ( 5} isChecked={filterDays.includes(DayOfWeek(day))} handleChange={handleChange} /> ); })}
{monthMatrix.map((week, k) => { const isTiny = relevantDays?.length > 5; return (
{k === 0 && renderEmptySlots(week, isTiny)} {week.map((day, j) => { return ( handleChoose(day.id)} addon={day} chosen={selectedEvents.includes(day.id)} isTinyView={isTiny} /> ); })} {k !== 0 && renderEmptySlots(week, isTiny)}
); })}
); })}
); };