Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 1x 1x 1x | /* * Copyright 2021 Harness Inc. All rights reserved. * Use of this source code is governed by the PolyForm Shield 1.0.0 license * that can be found in the licenses directory at the root of this repository, also available at * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt. */ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react' import css from './TimeBasedShadedRegion.module.scss' export interface TimeBasedShadedRegionProps { top?: number leftOffset?: number parentRef?: HTMLDivElement | null height: number | string startTime: number endTime: number shadedRegionStartTime: number shadedRegionEndTime: number } function computeWidth( shadedRegionStartTime: number, shadedRegionEndTime: number, startTime: number, endTime: number, leftOffset?: number, parentRef?: HTMLDivElement | null ): { width: number; left: number } | undefined { if (!parentRef) { return } const parentContainerWidth = parentRef.getBoundingClientRect()?.width const totalTimeDiff = endTime - startTime const leftPlacement = parentContainerWidth * ((shadedRegionStartTime - startTime) / totalTimeDiff) + (leftOffset ?? 0) const rightPlacement = parentContainerWidth * ((shadedRegionEndTime - startTime) / totalTimeDiff) + (leftOffset ?? 0) return { width: rightPlacement - leftPlacement, left: leftPlacement } } export function TimeBasedShadedRegion(props: TimeBasedShadedRegionProps): JSX.Element | null { const { startTime, endTime, top, height, leftOffset, shadedRegionEndTime, shadedRegionStartTime, parentRef } = props const ref = useRef<HTMLDivElement>(null) const [info, setInfo] = useState( computeWidth(shadedRegionStartTime, shadedRegionEndTime, startTime, endTime, leftOffset, parentRef) ) const onResize = () => { if (ref.current) { setInfo(computeWidth(shadedRegionStartTime, shadedRegionEndTime, startTime, endTime, leftOffset, parentRef)) } } useLayoutEffect(() => { window.addEventListener('resize', onResize) return () => window.removeEventListener('resize', onResize) }, []) useEffect(() => { setInfo(computeWidth(shadedRegionStartTime, shadedRegionEndTime, startTime, endTime, leftOffset, parentRef)) }, [shadedRegionStartTime, shadedRegionEndTime, startTime, leftOffset, endTime, parentRef]) return parentRef && info ? <div className={css.main} ref={ref} style={{ ...info, top: top ?? 0, height }} /> : null } |