Files
ThreadNet-Web/src/components/views/elements/Draggable.tsx
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

72 lines
2.0 KiB
TypeScript
Raw Normal View History

2020-05-13 02:16:43 +01:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2020-05-13 02:16:43 +01:00
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2020-05-13 02:16:43 +01:00
*/
import React from "react";
2021-10-22 17:23:32 -05:00
2020-05-13 02:16:43 +01:00
interface IProps {
2020-06-18 14:32:43 +01:00
className: string;
dragFunc: (currentLocation: ILocationState, event: MouseEvent) => ILocationState;
onMouseUp: (event: MouseEvent) => void;
2020-05-13 02:16:43 +01:00
}
interface IState {
2020-06-18 14:32:43 +01:00
onMouseMove: (event: MouseEvent) => void;
onMouseUp: (event: MouseEvent) => void;
location: ILocationState;
2020-05-13 02:16:43 +01:00
}
export interface ILocationState {
2020-06-18 14:32:43 +01:00
currentX: number;
currentY: number;
2020-05-13 02:16:43 +01:00
}
export default class Draggable extends React.Component<IProps, IState> {
public constructor(props: IProps) {
2020-05-13 02:16:43 +01:00
super(props);
this.state = {
onMouseMove: this.onMouseMove.bind(this),
onMouseUp: this.onMouseUp.bind(this),
location: {
currentX: 0,
currentY: 0,
},
};
}
private onMouseDown = (event: React.MouseEvent): void => {
2020-05-13 02:16:43 +01:00
this.setState({
location: {
currentX: event.clientX,
currentY: event.clientY,
},
});
document.addEventListener("mousemove", this.state.onMouseMove);
document.addEventListener("mouseup", this.state.onMouseUp);
2020-06-18 14:32:43 +01:00
};
2020-05-13 02:16:43 +01:00
private onMouseUp = (event: MouseEvent): void => {
document.removeEventListener("mousemove", this.state.onMouseMove);
document.removeEventListener("mouseup", this.state.onMouseUp);
this.props.onMouseUp(event);
2020-06-18 14:32:43 +01:00
};
2020-05-13 02:16:43 +01:00
private onMouseMove(event: MouseEvent): void {
const newLocation = this.props.dragFunc(this.state.location, event);
this.setState({
location: newLocation,
});
}
public render(): React.ReactNode {
return <div className={this.props.className} onMouseDown={this.onMouseDown} />;
2020-05-13 02:16:43 +01:00
}
}