Skip to content

Commit efa3f2f

Browse files
committed
perf: fix rerenders of toolbar on every keydown
1 parent 2bbc465 commit efa3f2f

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

src/bundle/MarkupEditorView.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {memo} from 'react';
1+
import {memo, useCallback} from 'react';
22

33
import type {QAProps} from '@gravity-ui/uikit';
44

@@ -62,6 +62,8 @@ export const MarkupEditorView = memo<MarkupEditorViewProps>((props) => {
6262
});
6363
});
6464

65+
const toolbarFocus = useCallback(() => editor.focus(), [editor]);
66+
6567
return (
6668
<div className={b({toolbar: toolbarVisible}, [className])} data-qa={qa}>
6769
{toolbarVisible ? (
@@ -80,7 +82,7 @@ export const MarkupEditorView = memo<MarkupEditorViewProps>((props) => {
8082
hiddenActionsConfig={hiddenActionsConfig}
8183
stickyToolbar={stickyToolbar}
8284
toolbarConfig={toolbarConfig}
83-
toolbarFocus={() => editor.focus()}
85+
toolbarFocus={toolbarFocus}
8486
settingsVisible={settingsVisible}
8587
className={b('toolbar', [toolbarClassName])}
8688
toolbarDisplay={toolbarDisplay}

src/bundle/ToolbarView.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
import {useLayoutEffect, useRef} from 'react';
1+
import {memo, useCallback, useLayoutEffect, useRef} from 'react';
22

33
import type {QAProps} from '@gravity-ui/uikit';
44
import {useUpdate} from 'react-use';
55

66
import type {ClassNameProps} from '../classname';
77
import {i18n} from '../i18n/menubar';
88
import {useSticky} from '../react-utils/useSticky';
9-
import {FlexToolbar, type ToolbarData, type ToolbarDisplay, type ToolbarItemData} from '../toolbar';
9+
import {
10+
FlexToolbar as FlexToolbarExternal,
11+
type ToolbarData,
12+
type ToolbarDisplay,
13+
type ToolbarItemData,
14+
} from '../toolbar';
1015

1116
import type {EditorInt} from './Editor';
1217
import {stickyCn} from './sticky';
@@ -26,6 +31,8 @@ export type ToolbarViewProps<T> = ClassNameProps &
2631
toolbarDisplay?: ToolbarDisplay;
2732
};
2833

34+
const FlexToolbar = memo(FlexToolbarExternal) as typeof FlexToolbarExternal;
35+
2936
export function ToolbarView<T>({
3037
editor,
3138
editorMode,
@@ -53,6 +60,13 @@ export function ToolbarView<T>({
5360

5461
const mobile = editor.mobile;
5562

63+
const handleClick = useCallback(
64+
(id: string, attrs: {[key: string]: any} | undefined) => {
65+
editor.emit('toolbar-action', {id, attrs, editorMode});
66+
},
67+
[editor, editorMode],
68+
);
69+
5670
return (
5771
<div
5872
data-qa={qa}
@@ -72,7 +86,7 @@ export function ToolbarView<T>({
7286
editor={toolbarEditor}
7387
focus={toolbarFocus}
7488
dotsTitle={i18n('more_action')}
75-
onClick={(id, attrs) => editor.emit('toolbar-action', {id, attrs, editorMode})}
89+
onClick={handleClick}
7690
display={toolbarDisplay}
7791
disableTooltip={mobile}
7892
disableHotkey={mobile}

src/bundle/WysiwygEditorView.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {memo} from 'react';
1+
import {memo, useCallback} from 'react';
22

33
import type {QAProps} from '@gravity-ui/uikit';
44

@@ -59,6 +59,8 @@ export const WysiwygEditorView = memo<WysiwygEditorViewProps>((props) => {
5959
});
6060
});
6161

62+
const toolbarFocus = useCallback(() => editor.focus(), [editor]);
63+
6264
return (
6365
<div className={b({toolbar: toolbarVisible}, [className])} data-qa={qa}>
6466
{toolbarVisible ? (
@@ -69,7 +71,7 @@ export const WysiwygEditorView = memo<WysiwygEditorViewProps>((props) => {
6971
toolbarEditor={editor}
7072
stickyToolbar={stickyToolbar}
7173
toolbarConfig={toolbarConfig}
72-
toolbarFocus={() => editor.focus()}
74+
toolbarFocus={toolbarFocus}
7375
hiddenActionsConfig={hiddenActionsConfig}
7476
settingsVisible={settingsVisible}
7577
className={b('toolbar', [toolbarClassName])}

0 commit comments

Comments
 (0)