Fix listeners cleaning on unmount
Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
@@ -6,7 +6,7 @@ import { autoUpdate, offset, useFloating } from "@floating-ui/react";
|
|||||||
import { CircleIcon, DotsThreeCircleVerticalIcon } from "@phosphor-icons/react";
|
import { CircleIcon, DotsThreeCircleVerticalIcon } from "@phosphor-icons/react";
|
||||||
import { cellAround, CellSelection, TableMap } from "@tiptap/pm/tables";
|
import { cellAround, CellSelection, TableMap } from "@tiptap/pm/tables";
|
||||||
import { type Editor } from "@tiptap/react";
|
import { type Editor } from "@tiptap/react";
|
||||||
import { useLayoutEffect, useRef, useState } from "react";
|
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
||||||
|
|
||||||
import { cellDomElement } from "../_lib/cellDomElement";
|
import { cellDomElement } from "../_lib/cellDomElement";
|
||||||
import { DRAG_THRESHOLD } from "../_lib/constants";
|
import { DRAG_THRESHOLD } from "../_lib/constants";
|
||||||
@@ -41,6 +41,13 @@ export function TableCellMenuTrigger({
|
|||||||
bottomRow: number;
|
bottomRow: number;
|
||||||
tableStart: number;
|
tableStart: number;
|
||||||
} | null>(null);
|
} | null>(null);
|
||||||
|
const dragCleanupRef = useRef<(() => void) | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
dragCleanupRef.current?.();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
refs: handleRefs,
|
refs: handleRefs,
|
||||||
@@ -196,6 +203,7 @@ export function TableCellMenuTrigger({
|
|||||||
const onMouseUp = () => {
|
const onMouseUp = () => {
|
||||||
document.removeEventListener("mousemove", onMouseMove);
|
document.removeEventListener("mousemove", onMouseMove);
|
||||||
document.removeEventListener("mouseup", onMouseUp);
|
document.removeEventListener("mouseup", onMouseUp);
|
||||||
|
dragCleanupRef.current = null;
|
||||||
|
|
||||||
if (!draggingRef.current) {
|
if (!draggingRef.current) {
|
||||||
setMenuOpen(prev => !prev);
|
setMenuOpen(prev => !prev);
|
||||||
@@ -208,6 +216,10 @@ export function TableCellMenuTrigger({
|
|||||||
|
|
||||||
document.addEventListener("mousemove", onMouseMove);
|
document.addEventListener("mousemove", onMouseMove);
|
||||||
document.addEventListener("mouseup", onMouseUp);
|
document.addEventListener("mouseup", onMouseUp);
|
||||||
|
dragCleanupRef.current = () => {
|
||||||
|
document.removeEventListener("mousemove", onMouseMove);
|
||||||
|
document.removeEventListener("mouseup", onMouseUp);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -102,8 +102,6 @@ export function TableColumnMenu({ editor }: TableColumnMenuProps) {
|
|||||||
|
|
||||||
const [hoveredCol, setHoveredCol] = useState<HoveredColumn | null>(null);
|
const [hoveredCol, setHoveredCol] = useState<HoveredColumn | null>(null);
|
||||||
|
|
||||||
if (!hoveredCol && !menuOpen) return null;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TableColumnMenuTrigger
|
<TableColumnMenuTrigger
|
||||||
|
|||||||
@@ -207,9 +207,9 @@ export function TableColumnMenuContent({
|
|||||||
if (!table) return;
|
if (!table) return;
|
||||||
|
|
||||||
const map = TableMap.get(table);
|
const map = TableMap.get(table);
|
||||||
const firstCellPos = map.map[colIndex] + tableStart;
|
const firstCellPos = map.map[colIndex] + tableStart + 1;
|
||||||
const lastCellPos
|
const lastCellPos
|
||||||
= map.map[(map.height - 1) * map.width + colIndex] + tableStart;
|
= map.map[(map.height - 1) * map.width + colIndex] + tableStart + 1;
|
||||||
|
|
||||||
const $anchor = editor.state.doc.resolve(firstCellPos);
|
const $anchor = editor.state.doc.resolve(firstCellPos);
|
||||||
const $head = editor.state.doc.resolve(lastCellPos);
|
const $head = editor.state.doc.resolve(lastCellPos);
|
||||||
|
|||||||
@@ -45,11 +45,18 @@ export function TableColumnMenuTrigger({
|
|||||||
const dragStartPos = useRef({ x: 0, y: 0 });
|
const dragStartPos = useRef({ x: 0, y: 0 });
|
||||||
const rafId = useRef<number | null>(null);
|
const rafId = useRef<number | null>(null);
|
||||||
const hoveredColRef = useRef<HoveredColumn | null>(null);
|
const hoveredColRef = useRef<HoveredColumn | null>(null);
|
||||||
|
const dragCleanupRef = useRef<(() => void) | null>(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
hoveredColRef.current = hoveredCol;
|
hoveredColRef.current = hoveredCol;
|
||||||
}, [hoveredCol]);
|
}, [hoveredCol]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
dragCleanupRef.current?.();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (editor.isDestroyed || !editor.isEditable) return;
|
if (editor.isDestroyed || !editor.isEditable) return;
|
||||||
|
|
||||||
@@ -285,6 +292,7 @@ export function TableColumnMenuTrigger({
|
|||||||
const onMouseUp = (ev: MouseEvent) => {
|
const onMouseUp = (ev: MouseEvent) => {
|
||||||
document.removeEventListener("mousemove", onMouseMove);
|
document.removeEventListener("mousemove", onMouseMove);
|
||||||
document.removeEventListener("mouseup", onMouseUp);
|
document.removeEventListener("mouseup", onMouseUp);
|
||||||
|
dragCleanupRef.current = null;
|
||||||
|
|
||||||
if (draggingRef.current) {
|
if (draggingRef.current) {
|
||||||
setDragIndicator(null);
|
setDragIndicator(null);
|
||||||
@@ -327,6 +335,10 @@ export function TableColumnMenuTrigger({
|
|||||||
|
|
||||||
document.addEventListener("mousemove", onMouseMove);
|
document.addEventListener("mousemove", onMouseMove);
|
||||||
document.addEventListener("mouseup", onMouseUp);
|
document.addEventListener("mouseup", onMouseUp);
|
||||||
|
dragCleanupRef.current = () => {
|
||||||
|
document.removeEventListener("mousemove", onMouseMove);
|
||||||
|
document.removeEventListener("mouseup", onMouseUp);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -98,8 +98,6 @@ export function TableRowMenu({ editor }: TableRowMenuProps) {
|
|||||||
|
|
||||||
const [hoveredRow, setHoveredRow] = useState<HoveredRow | null>(null);
|
const [hoveredRow, setHoveredRow] = useState<HoveredRow | null>(null);
|
||||||
|
|
||||||
if (!hoveredRow && !menuOpen) return null;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TableRowMenuTrigger
|
<TableRowMenuTrigger
|
||||||
|
|||||||
@@ -45,11 +45,18 @@ export function TableRowMenuTrigger({
|
|||||||
const dragStartPos = useRef({ x: 0, y: 0 });
|
const dragStartPos = useRef({ x: 0, y: 0 });
|
||||||
const rafId = useRef<number | null>(null);
|
const rafId = useRef<number | null>(null);
|
||||||
const hoveredRowRef = useRef<HoveredRow | null>(null);
|
const hoveredRowRef = useRef<HoveredRow | null>(null);
|
||||||
|
const dragCleanupRef = useRef<(() => void) | null>(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
hoveredRowRef.current = hoveredRow;
|
hoveredRowRef.current = hoveredRow;
|
||||||
}, [hoveredRow]);
|
}, [hoveredRow]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
dragCleanupRef.current?.();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (editor.isDestroyed || !editor.isEditable) return;
|
if (editor.isDestroyed || !editor.isEditable) return;
|
||||||
|
|
||||||
@@ -285,6 +292,7 @@ export function TableRowMenuTrigger({
|
|||||||
const onMouseUp = (ev: MouseEvent) => {
|
const onMouseUp = (ev: MouseEvent) => {
|
||||||
document.removeEventListener("mousemove", onMouseMove);
|
document.removeEventListener("mousemove", onMouseMove);
|
||||||
document.removeEventListener("mouseup", onMouseUp);
|
document.removeEventListener("mouseup", onMouseUp);
|
||||||
|
dragCleanupRef.current = null;
|
||||||
|
|
||||||
if (draggingRef.current) {
|
if (draggingRef.current) {
|
||||||
setDragIndicator(null);
|
setDragIndicator(null);
|
||||||
@@ -327,6 +335,10 @@ export function TableRowMenuTrigger({
|
|||||||
|
|
||||||
document.addEventListener("mousemove", onMouseMove);
|
document.addEventListener("mousemove", onMouseMove);
|
||||||
document.addEventListener("mouseup", onMouseUp);
|
document.addEventListener("mouseup", onMouseUp);
|
||||||
|
dragCleanupRef.current = () => {
|
||||||
|
document.removeEventListener("mousemove", onMouseMove);
|
||||||
|
document.removeEventListener("mouseup", onMouseUp);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user