fix: Flickering suggestion menu selection in Safari
This commit is contained in:
@@ -78,6 +78,10 @@ function SuggestionsMenu<T extends MenuItem>(props: Props<T>) {
|
|||||||
const { view, commands } = useEditor();
|
const { view, commands } = useEditor();
|
||||||
const dictionary = useDictionary();
|
const dictionary = useDictionary();
|
||||||
const hasActivated = React.useRef(false);
|
const hasActivated = React.useRef(false);
|
||||||
|
const pointerRef = React.useRef<{ clientX: number; clientY: number }>({
|
||||||
|
clientX: 0,
|
||||||
|
clientY: 0,
|
||||||
|
});
|
||||||
const menuRef = React.useRef<HTMLDivElement>(null);
|
const menuRef = React.useRef<HTMLDivElement>(null);
|
||||||
const inputRef = React.useRef<HTMLInputElement>(null);
|
const inputRef = React.useRef<HTMLInputElement>(null);
|
||||||
const [position, setPosition] = React.useState<Position>(defaultPosition);
|
const [position, setPosition] = React.useState<Position>(defaultPosition);
|
||||||
@@ -576,7 +580,23 @@ function SuggestionsMenu<T extends MenuItem>(props: Props<T>) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const handlePointer = () => {
|
const handlePointerMove = (ev: React.PointerEvent) => {
|
||||||
|
if (
|
||||||
|
selectedIndex !== index &&
|
||||||
|
// Safari triggers pointermove with identical coordinates when the pointer has not moved.
|
||||||
|
// This causes the menu selection to flicker when the pointer is over the menu but not moving.
|
||||||
|
(pointerRef.current.clientX !== ev.clientX ||
|
||||||
|
pointerRef.current.clientY !== ev.clientY)
|
||||||
|
) {
|
||||||
|
setSelectedIndex(index);
|
||||||
|
}
|
||||||
|
pointerRef.current = {
|
||||||
|
clientX: ev.clientX,
|
||||||
|
clientY: ev.clientY,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const handlePointerDown = () => {
|
||||||
if (selectedIndex !== index) {
|
if (selectedIndex !== index) {
|
||||||
setSelectedIndex(index);
|
setSelectedIndex(index);
|
||||||
}
|
}
|
||||||
@@ -585,8 +605,8 @@ function SuggestionsMenu<T extends MenuItem>(props: Props<T>) {
|
|||||||
return (
|
return (
|
||||||
<ListItem
|
<ListItem
|
||||||
key={index}
|
key={index}
|
||||||
onPointerMove={handlePointer}
|
onPointerMove={handlePointerMove}
|
||||||
onPointerDown={handlePointer}
|
onPointerDown={handlePointerDown}
|
||||||
>
|
>
|
||||||
{props.renderMenuItem(item as any, index, {
|
{props.renderMenuItem(item as any, index, {
|
||||||
selected: index === selectedIndex,
|
selected: index === selectedIndex,
|
||||||
|
|||||||
Reference in New Issue
Block a user