openreplay/frontend/app/components/Session_/Player/Controls/components/CustomDragLayer.tsx
Andrey Babushkin fd5c0c9747
Add lokalisation (#3092)
* applied eslint

* add locales and lint the project

* removed error boundary

* updated locales

* fix min files

* fix locales
2025-03-06 17:43:15 +01:00

82 lines
1.7 KiB
TypeScript

import React, { memo, useEffect } from 'react';
import type { CSSProperties, FC } from 'react';
import { useDragLayer, XYCoord } from 'react-dnd';
import Circle from './Circle';
const layerStyles: CSSProperties = {
position: 'fixed',
pointerEvents: 'none',
zIndex: 100,
left: 0,
top: 0,
width: '100%',
height: '100%',
};
function getItemStyles(
initialOffset: XYCoord | null,
currentOffset: XYCoord | null,
maxX: number,
minX: number,
) {
if (!initialOffset || !currentOffset) {
return {
display: 'none',
};
}
let { x } = currentOffset;
if (x > maxX) {
x = maxX;
}
if (x < minX) {
x = minX;
}
const transform = `translate(${x}px, ${initialOffset.y}px)`;
return {
transition: 'transform 0.1s ease-out',
transform,
WebkitTransform: transform,
};
}
export type OnDragCallback = (offset: XYCoord) => void;
interface Props {
onDrag: OnDragCallback;
maxX: number;
minX: number;
}
const CustomDragLayer: FC<Props> = memo(({ maxX, minX, onDrag }) => {
const {
isDragging,
initialOffset,
currentOffset, // might be null (why is it not captured by types?)
} = useDragLayer((monitor) => ({
initialOffset: monitor.getInitialSourceClientOffset(),
currentOffset: monitor.getSourceClientOffset(),
isDragging: monitor.isDragging(),
}));
useEffect(() => {
if (!isDragging || !currentOffset?.x) {
return;
}
onDrag(currentOffset);
}, [isDragging, currentOffset]);
if (!isDragging || !currentOffset) {
return null;
}
return (
<div id="drag-layer" style={layerStyles}>
<div style={getItemStyles(initialOffset, currentOffset, maxX, minX)}>
<Circle />
</div>
</div>
);
});
export default CustomDragLayer;