// Copyright 2022 The Parca Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {useEffect, useMemo, useRef, useState} from 'react';
import {Icon} from '@iconify/react';
import cx from 'classnames';
import * as d3 from 'd3';
import {NumberDuo} from '../../../utils';
export interface DataPoint {
timestamp: number;
value: number;
sampleCount?: number;
}
interface DragState {
stripIndex: number;
startX: number;
currentX: number;
}
interface Props {
width: number;
height: number;
marginLeft?: number;
marginRight?: number;
marginTop?: number;
marginBottom?: number;
fill?: string;
data: DataPoint[];
selectionBounds?: NumberDuo | undefined;
setSelectionBounds: (newBounds: NumberDuo | undefined) => void;
stepMs: number;
onDragStart?: (startX: number) => void;
dragState?: DragState;
isAnyDragActive?: boolean;
timeBounds?: NumberDuo;
}
const DraggingWindow = ({
dragStart,
currentX,
}: {
dragStart: number | undefined;
currentX: number | undefined;
}): JSX.Element | null => {
const start = useMemo(() => Math.min(dragStart ?? 0, currentX ?? 0), [dragStart, currentX]);
const width = useMemo(() => Math.abs((dragStart ?? 0) - (currentX ?? 0)), [dragStart, currentX]);
if (dragStart === undefined || currentX === undefined) {
return null;
}
return (