openreplay/frontend/app/components/Session_/Player/Controls/DraggableCircle.tsx
Delirium 4ebcff74e1
feat(ui): make ui able to load unprocessed session files (#652)
* feat(ui): make ui able to load unprocessed session files

* feat(ui): some lgos

* feat(ui): connect api, rewrite old code

* feat(ui): create testing ui functions

* feat(ui/player): add ability to jump back in time for assist

* feat(ui/player): rewrite for better readability

* fix(ui/player): small refactor for better readability

* fix(ui/player): fix private prop

* fix(ui/player): add tooltip

* feat(ui/player): create time calculating tooltip

* fix(player): fix message timestamp

* fix(ui/player): cleanup

* fix(ui/player): handle errors for unprocessed files as well

* fix(player): fix logged message

* fix(player): code review fixes

* fix(ui): fix circle color, fix button text

* fix(tracker): code review

* fix(player): small style fixes
2022-08-11 12:07:34 +02:00

69 lines
1.8 KiB
TypeScript

import React, { memo, FC, useEffect, useRef, CSSProperties } from 'react';
import type { DragSourceMonitor } from 'react-dnd'
import { useDrag } from 'react-dnd'
import { getEmptyImage } from 'react-dnd-html5-backend'
import Circle from './Circle'
function getStyles(
left: number,
isDragging: boolean,
): CSSProperties {
// const transform = `translate3d(${(left * 1161) / 100}px, -8px, 0)`
const leftPosition = left > 100 ? 100 : left
return {
position: 'absolute',
top: '-3px',
left: `${leftPosition}%`,
// transform,
// WebkitTransform: transform,
// IE fallback: hide the real node using CSS when dragging
// because IE will ignore our custom "empty image" drag preview.
opacity: isDragging ? 0 : 1,
height: isDragging ? 0 : '',
zIndex: 99,
cursor: 'move'
}
}
const ItemTypes = {
BOX: 'box',
}
interface Props {
left: number;
top: number;
onDrop?: (item, monitor) => void;
}
const DraggableCircle: FC<Props> = memo(function DraggableCircle(props) {
const { left, top } = props
const [{ isDragging, item }, dragRef, preview] = useDrag(
() => ({
type: ItemTypes.BOX,
item: { left, top },
end: props.onDrop,
collect: (monitor: DragSourceMonitor) => ({
isDragging: monitor.isDragging(),
item: monitor.getItem(),
}),
}),
[left, top],
)
useEffect(() => {
preview(getEmptyImage(), { captureDraggingState: true })
}, [])
return (
<div
ref={dragRef}
style={getStyles(left, isDragging)}
role="DraggableBox"
>
<Circle isGreen={left > 99} />
</div>
);
})
export default DraggableCircle