import React, { useRef, useState } from 'react'; import classNames from 'classnames/bind'; import Button from '@webapp/ui/Button'; import { Popover, PopoverBody } from '@webapp/ui/Popover'; import { Portal } from '@webapp/ui/Portal'; import { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { Selection } from '@webapp/components/TimelineChart/markings'; import { getSelectionBoundaries } from '@webapp/components/TimelineChart/SyncTimelines/getSelectionBoundaries'; import { comparisonPeriods } from './periods'; import styles from './styles.module.scss'; const cx = classNames.bind(styles); type Boudaries = { from: string; until: string; leftFrom: string; leftTo: string; rightFrom: string; rightTo: string; }; interface SideTimelineComparatorProps { onCompare: (params: Boudaries) => void; selection: { left: Selection; right: Selection; from: string; until: string; }; comparisonMode: { active: boolean; period: { label: string; ms: number; }; }; setComparisonMode: ( params: SideTimelineComparatorProps['comparisonMode'] ) => void; } const getNewBoundaries = ({ selection, period, }: { selection: SideTimelineComparatorProps['selection']; period: SideTimelineComparatorProps['comparisonMode']['period']; }) => { const { from: comparisonSelectionFrom, to: comparisonSelectionTo } = getSelectionBoundaries(selection.right); const diff = comparisonSelectionTo - comparisonSelectionFrom; return { from: String(comparisonSelectionTo - period.ms - diff * 2), until: String(comparisonSelectionTo), leftFrom: String(comparisonSelectionTo - period.ms - diff), leftTo: String(comparisonSelectionTo - period.ms), rightFrom: String(comparisonSelectionFrom), rightTo: String(comparisonSelectionTo), }; }; export default function SideTimelineComparator({ onCompare, selection, setComparisonMode, comparisonMode, }: SideTimelineComparatorProps) { const [previousSelection, setPreviousSelection] = useState( null ); const refContainer = useRef(null); const [menuVisible, setMenuVisible] = useState(false); const { active, period } = comparisonMode; const { from: comparisonSelectionFrom, to: comparisonSelectionTo } = getSelectionBoundaries(selection.right); const diff = comparisonSelectionTo - comparisonSelectionFrom; const fullLength = comparisonSelectionTo - (comparisonSelectionTo - period.ms - diff * 2); const percent = fullLength ? (diff / fullLength) * 100 : null; const handleSelectPeriod = (period: { label: string; ms: number }) => { setComparisonMode({ ...comparisonMode, period, }); if (comparisonMode.active) { const newBoundaries = getNewBoundaries({ period, selection }); onCompare(newBoundaries); } }; const hanleToggleComparison = (e: React.ChangeEvent) => { const active = e.target.checked; if (active) { setPreviousSelection({ from: selection.from, until: selection.until, leftFrom: selection.left.from, leftTo: selection.left.to, rightFrom: selection.right.from, rightTo: selection.right.to, }); const newBoundaries = getNewBoundaries({ period, selection }); onCompare(newBoundaries); } else if (previousSelection) { onCompare(previousSelection); } setComparisonMode({ ...comparisonMode, active, }); }; const preview = percent ? (
{period.label}
) : (
Please set the period
); return (
  to comparison setMenuVisible(false)} className={cx({ [styles.menu]: true, [styles.hidden]: !menuVisible })} > {menuVisible ? ( <>
Set baseline  {period.label}  to comparison
{comparisonPeriods.map((arr, i) => { return (
{arr.map((b) => { return ( ); })}
); })}
Preview
{preview}
) : null}
); }