import { Box, Flex, Text } from '@theme-ui/components' import { differenceInCalendarDays, differenceInCalendarWeeks, format, } from 'date-fns' import { times } from 'ramda' import { useMemo, MouseEventHandler } from 'react' export interface GanttChartItem { id: string row: number duration: [string, string] label: React.ReactNode onClick?: MouseEventHandler } interface GanttChartProps { startDate: string endDate: string today: string items: GanttChartItem[] } const GanttChart = ({ startDate: startDateString, endDate: endDateString, today: todayDateString, items, }: GanttChartProps) => { const startDate = new Date(startDateString) const endDate = new Date(endDateString) const todayDate = new Date(todayDateString) const totalDays = differenceInCalendarDays(endDate, startDate) const totalWeeks = differenceInCalendarWeeks(endDate, startDate) const totalRow = useMemo(() => { return items.reduce((max, item) => { return item.row > max ? item.row : max }, 1) }, []) return ( {times((index) => { const weekNumber = index + 1 return ( Week {weekNumber} ) }, totalWeeks)} {times((index) => { return ( ) }, totalDays)} Today ({format(todayDate, 'P')}) {items.map((item) => { const offset = differenceInCalendarDays(new Date(item.duration[0]), startDate) * 40 const length = differenceInCalendarDays( new Date(item.duration[1]), new Date(item.duration[0]) ) * 40 return ( {item.label} ) })} ) } export default GanttChart