/** @jsxRuntime classic */ /** @jsx jsx */ import { FC, useMemo, useState, useEffect } from 'react'; import { jsx, useTheme } from '@emotion/react'; import { Droppable } from '../../Droppable'; import { IDayToDropProps, ISlot } from '../../../types'; import { useMiddlewareContext } from '../../../hooks/useMiddlewareContext'; import { collisionGroupContainerHorizontal, horizontalDayToDropContainer, moreItemsButtonHorizontal, moreModal, } from '../../styles'; import { calculateModalPosition } from '../../../utils'; import { BnClose } from '../../../../icons/BnClose'; import { DraggableHorizontal } from './DraggableHorizontal'; import { AddNewSlotButtons } from '../AddNewSlotButtons'; export const DayToDropHorizontal: FC = ({ id, EventComponent, onAddNewSlotClick, hiddenEvents, }) => { const { getEventsGroups, isResizing, day: daysCount, partialRanges, options, getPartialEvents, eventsToSpaces, } = useMiddlewareContext(); const { partialRendering } = options; const colors = useTheme(); const [hover, setHover] = useState(false); const eventsGroups = useMemo(() => { const events = hiddenEvents ? [] : ((Array.isArray(eventsToSpaces?.[id]) ? partialRendering ? getPartialEvents( eventsToSpaces[id], partialRanges.horizontal.from, partialRanges.horizontal.to ) : eventsToSpaces[id] : []) as ISlot[]); return getEventsGroups(events); }, [ eventsToSpaces, id, partialRanges.horizontal.from, partialRanges.horizontal.to, partialRendering, hiddenEvents, ]); const eventsFullGroups = useMemo(() => { const events = (Array.isArray(eventsToSpaces[id]) ? eventsToSpaces[id] : []) as ISlot[]; return getEventsGroups(events, true); }, [eventsToSpaces, id]); const [modals, setModals] = useState([]); useEffect(() => { setModals(Array(eventsGroups.length).fill(false)); }, [eventsGroups]); const handleToggleModal = (index: number) => { let newModals = modals.slice(); newModals[index] = !newModals[index]; setModals(newModals); }; const MAX_COUNT = 4; return (
setHover(true)} onMouseLeave={() => setHover(false)} css={horizontalDayToDropContainer(daysCount, colors)} > {eventsGroups.map((group, index) => { const withModal = (group.groups?.length || 0) > MAX_COUNT; if (Array.isArray(group.groups)) { const moreItemsCount = withModal ? group.groups .slice(3) .reduce((acc, events) => acc + events.length, 0) : 0; const element = document.querySelector(`#group-${index}`); const box = element as HTMLElement; const container = box?.parentElement; const boxW = container?.parentElement?.parentElement; const containerW = boxW?.parentElement; return (
{group.groups?.map((groupItems, index) => { return (
{groupItems.map((event) => ( ))}
); })} {withModal && ( )} {withModal && modals[index] && (
handleToggleModal(index)}>
{group.items.map((event) => (
))}
)}
); } else if (group.item) { return ( ); } else { return null; } })} {hover && !isResizing && ( )}
); };