Skip to content

Commit 59f024d

Browse files
authored
[WIKI-849] feat: debounce for mention search (#8380)
1 parent ba7b2a3 commit 59f024d

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

packages/editor/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"@tiptap/react": "^2.22.3",
6363
"@tiptap/starter-kit": "^2.22.3",
6464
"@tiptap/suggestion": "^2.22.3",
65+
"lodash-es": "catalog:",
6566
"buffer": "^6.0.3",
6667
"emoji-regex": "^10.3.0",
6768
"highlight.js": "^11.8.0",
@@ -85,6 +86,7 @@
8586
"@types/node": "catalog:",
8687
"@types/react": "catalog:",
8788
"@types/react-dom": "catalog:",
89+
"@types/lodash-es": "catalog:",
8890
"postcss": "^8.4.38",
8991
"tsdown": "catalog:",
9092
"typescript": "catalog:"

packages/editor/src/core/extensions/mentions/mentions-list-dropdown.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { FloatingOverlay } from "@floating-ui/react";
22
import type { SuggestionProps } from "@tiptap/suggestion";
33
import { forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from "react";
44
import { v4 as uuidv4 } from "uuid";
5+
import { debounce } from "lodash-es";
56
// plane utils
67
import { useOutsideClickDetector } from "@plane/hooks";
78
import { cn } from "@plane/utils";
@@ -75,12 +76,12 @@ export const MentionsListDropdown = forwardRef(function MentionsListDropdown(pro
7576
});
7677
}, [sections]);
7778

78-
// fetch mention sections based on query
79-
useEffect(() => {
80-
const fetchSuggestions = async () => {
79+
// debounced search callback
80+
const debouncedSearchCallback = useCallback(
81+
debounce(async (searchQuery: string) => {
8182
setIsLoading(true);
8283
try {
83-
const sectionsResponse = await searchCallback?.(query);
84+
const sectionsResponse = await searchCallback?.(searchQuery);
8485
if (sectionsResponse) {
8586
setSections(sectionsResponse);
8687
}
@@ -89,9 +90,24 @@ export const MentionsListDropdown = forwardRef(function MentionsListDropdown(pro
8990
} finally {
9091
setIsLoading(false);
9192
}
92-
};
93-
fetchSuggestions();
94-
}, [query, searchCallback]);
93+
}, 300),
94+
[searchCallback]
95+
);
96+
97+
// trigger debounced search when query changes
98+
useEffect(() => {
99+
if (query) {
100+
void debouncedSearchCallback(query);
101+
}
102+
}, [query, debouncedSearchCallback]);
103+
104+
// cancel pending debounced calls on unmount
105+
useEffect(
106+
() => () => {
107+
debouncedSearchCallback.cancel();
108+
},
109+
[debouncedSearchCallback]
110+
);
95111

96112
// scroll to the dropdown item when navigating via keyboard
97113
useLayoutEffect(() => {

pnpm-lock.yaml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)