import React from "react"; import DatetimeBar from "./DatetimeBar"; import DatetimeSquare from "./DatetimeSquare"; import DatetimeStar from "./DatetimeStar"; import DatetimeTriangle from "./DatetimeTriangle"; import DatetimePentagon from "./DatetimePentagon"; import Project from "./Project"; import ColoredMarkers from "../../atoms/ColoredMarkers"; import hash from "object-hash"; import { calcOpacity, getEventCategories, zipColorsToPercentages, calculateColorPercentages, isLatitude, isLongitude, } from "../../../common/utilities"; import { AVAILABLE_SHAPES } from "../../../common/constants"; function renderDot(event, styles, props) { const colorPercentages = calculateColorPercentages( [event], props.coloringSet ); return ( ); } function renderBar(event, styles, props) { const fillOpacity = props.features.GRAPH_NONLOCATED ? event.projectOffset >= 0 ? styles.opacity : 0.5 : calcOpacity(1); return ( ); } function renderDiamond(event, styles, props) { return ( ); } function renderSquare(event, styles, props) { return ( ); } function renderTriangle(event, styles, props) { return ( ); } function renderPentagon(event, styles, props) { return ( ); } function renderStar(event, styles, props) { return ( ); } const TimelineEvents = ({ events, projects, categories, narrative, getDatetimeX, getY, getCategoryColor, getHighlights, onSelect, transitionDuration, dims, features, setLoading, setNotLoading, eventRadius, filterColors, coloringSet, }) => { const narIds = narrative ? narrative.steps.map((s) => s.id) : []; function renderEvent(acc, event) { if (narrative) { if (!narIds.includes(event.id)) { return null; } } const isDot = (isLatitude(event.latitude) && isLongitude(event.longitude)) || (features.GRAPH_NONLOCATED && event.projectOffset !== -1); const { shape: eventShape } = event; let renderShape = isDot ? renderDot : renderBar; if (eventShape && eventShape.shape) { if (eventShape.shape === AVAILABLE_SHAPES.BAR) { renderShape = renderBar; } else if (eventShape.shape === AVAILABLE_SHAPES.DIAMOND) { renderShape = renderDiamond; } else if (eventShape.shape === AVAILABLE_SHAPES.STAR) { renderShape = renderStar; } else if (eventShape.shape === AVAILABLE_SHAPES.TRIANGLE) { renderShape = renderTriangle; } else if (eventShape.shape === AVAILABLE_SHAPES.PENTAGON) { renderShape = renderPentagon; } else if (eventShape.shape === AVAILABLE_SHAPES.SQUARE) { renderShape = renderSquare; } else { renderShape = renderDot; } } // if an event has multiple categories, it should be rendered on each of // those timelines: so we create as many event 'shadows' as there are // categories const evShadows = getEventCategories(event, categories).map((cat) => { const y = getY({ ...event, category: cat }); const colour = event.colour ? event.colour : getCategoryColor(cat.title); const styles = { fill: colour, fillOpacity: y > 0 ? calcOpacity(1) : 0, transition: `transform ${transitionDuration / 1000}s ease`, }; return { y, styles }; }); function getRender(y, styles) { return renderShape(event, styles, { x: getDatetimeX(event.datetime), y, eventRadius, onSelect: () => onSelect(event), dims, highlights: features.HIGHLIGHT_GROUPS ? getHighlights( event.filters[ features.HIGHLIGHT_GROUPS.filterIndexIndicatingGroup ] ) : [], features, filterColors, coloringSet, }); } if (evShadows.length === 0) { acc.push(getRender(getY(event), { fill: getCategoryColor(null) })); } else { evShadows.forEach((evShadow) => { acc.push(getRender(evShadow.y, evShadow.styles)); }); } return acc; } let renderProjects = () => null; if (features.GRAPH_NONLOCATED) { renderProjects = function () { return ( <> {Object.values(projects).map((project) => ( console.log(project)} getX={getDatetimeX} dims={dims} colour={getCategoryColor(project.category)} /> ))} ); }; } return ( {renderProjects()} {events.reduce(renderEvent, [])} ); }; export default TimelineEvents;