import Expander from "@/components/Expander"; import { Task } from "@/components/interfaces"; import GanttElasticContext from "@/GanttElasticContext"; import { emitEvent } from "@/GanttElasticEvents"; import React, { useCallback, useContext, useMemo } from "react"; import invariant from "ts-invariant"; import ProgressBar from "../ProgressBar"; import ChartText from "../Text"; export interface TaskProps { task: Task; } const ChartTask: React.FC = ({ task }) => { const { style, options } = useContext(GanttElasticContext); /** * Emit event * * @param {string} eventName * @param {Event} event */ const onEmitEvent = useCallback( event => { invariant.warn(event.type, task); emitEvent.emit(`chart-${task.type}-${event.type}`, { event, data: task }); task.events && task.events[event.type] && task.events[event.type](event, task); }, [task] ); return useMemo(() => { const points = `0,0 ${task.width},0 ${task.width},${task.height} 0,${task.height}`; const clipPathId = `gantt-elastic__project-clip-path-${task.id}`; const displayExpander = options.chart.expander.display || (options.chart.expander.displayIfTaskListHidden && !options.taskList.display); return ( {displayExpander && ( )} {options.chart.text.display && } ); }, [ onEmitEvent, options.chart.expander.display, options.chart.expander.displayIfTaskListHidden, options.chart.expander.offset, options.chart.expander.size, options.chart.expander.type, options.chart.text.display, options.row.height, options.taskList.display, style, task ]); }; export default ChartTask;