diff --git a/ts/components/CompositionInput.tsx b/ts/components/CompositionInput.tsx index aca43719b..4a6df0403 100644 --- a/ts/components/CompositionInput.tsx +++ b/ts/components/CompositionInput.tsx @@ -27,7 +27,7 @@ import { search, } from './emoji/lib'; import { LocalizerType } from '../types/Util'; -import { mergeRefs } from './_util'; +import { createRefMerger } from './_util'; const MAX_LENGTH = 64 * 1024; const colonsRegex = /(?:^|\s):[a-z0-9-_+]+:?/gi; @@ -237,6 +237,7 @@ export const CompositionInput = ({ const focusRef = React.useRef(false); const editorStateRef = React.useRef(editorRenderState); const rootElRef = React.useRef(); + const rootElRefMerger = React.useMemo(createRefMerger, []); // This function sets editorState and also keeps a reference to the newly set // state so we can reference the state in effects and callbacks without @@ -757,7 +758,7 @@ export const CompositionInput = ({ {({ measureRef }) => (
(...refs: Array>) { - return (t: T) => { - refs.forEach(r => { - if (isFunction(r)) { - r(t); - } else if (r) { - // @ts-ignore: React's typings for ref objects is annoying - r.current = t; - } - }); - }; -} +export const createRefMerger = () => + memoizee( + (...refs: Array>) => { + return (t: T) => { + refs.forEach(r => { + if (isFunction(r)) { + r(t); + } else if (r) { + // @ts-ignore: React's typings for ref objects is annoying + r.current = t; + } + }); + }; + }, + { length: false, max: 1 } + ); diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 1ae954ca1..c04647ab5 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -40,7 +40,7 @@ import { ContactType } from '../../types/Contact'; import { getIncrement } from '../../util/timer'; import { isFileDangerous } from '../../util/isFileDangerous'; import { ColorType, LocalizerType } from '../../types/Util'; -import { mergeRefs } from '../_util'; +import { createRefMerger } from '../_util'; import { ContextMenu, ContextMenuTrigger, MenuItem } from 'react-contextmenu'; interface Trigger { @@ -181,6 +181,7 @@ export class Message extends React.PureComponent { public reactionsContainerRef: React.RefObject< HTMLDivElement > = React.createRef(); + public reactionsContainerRefMerger = createRefMerger(); public wideMl: MediaQueryList; @@ -1572,7 +1573,10 @@ export class Message extends React.PureComponent { {({ ref: popperRef }) => (