Fix usage of useRef as memoization
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
parent
6c2334c029
commit
9443426edb
5 changed files with 17 additions and 17 deletions
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
||||||
Please see LICENSE files in the repository root for full details.
|
Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { forwardRef, useCallback, useContext, useEffect, useRef, useState } from "react";
|
import React, { forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
||||||
import {
|
import {
|
||||||
ISearchResults,
|
ISearchResults,
|
||||||
IThreadBundledRelationship,
|
IThreadBundledRelationship,
|
||||||
|
@ -58,7 +58,7 @@ export const RoomSearchView = forwardRef<ScrollPanel, Props>(
|
||||||
const [results, setResults] = useState<ISearchResults | null>(null);
|
const [results, setResults] = useState<ISearchResults | null>(null);
|
||||||
const aborted = useRef(false);
|
const aborted = useRef(false);
|
||||||
// A map from room ID to permalink creator
|
// A map from room ID to permalink creator
|
||||||
const permalinkCreators = useRef(new Map<string, RoomPermalinkCreator>()).current;
|
const permalinkCreators = useMemo(() => new Map<string, RoomPermalinkCreator>(), []);
|
||||||
const innerRef = useRef<ScrollPanel | null>();
|
const innerRef = useRef<ScrollPanel | null>();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
||||||
Please see LICENSE files in the repository root for full details.
|
Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { ForwardedRef, forwardRef, MutableRefObject, useRef } from "react";
|
import React, { ForwardedRef, forwardRef, MutableRefObject, useMemo } from "react";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
|
|
||||||
import EditorStateTransfer from "../../../../utils/EditorStateTransfer";
|
import EditorStateTransfer from "../../../../utils/EditorStateTransfer";
|
||||||
|
@ -44,7 +44,7 @@ export default function EditWysiwygComposer({
|
||||||
className,
|
className,
|
||||||
...props
|
...props
|
||||||
}: EditWysiwygComposerProps): JSX.Element {
|
}: EditWysiwygComposerProps): JSX.Element {
|
||||||
const defaultContextValue = useRef(getDefaultContextValue({ editorStateTransfer }));
|
const defaultContextValue = useMemo(() => getDefaultContextValue({ editorStateTransfer }), []);
|
||||||
const initialContent = useInitialContent(editorStateTransfer);
|
const initialContent = useInitialContent(editorStateTransfer);
|
||||||
const isReady = !editorStateTransfer || initialContent !== undefined;
|
const isReady = !editorStateTransfer || initialContent !== undefined;
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ export default function EditWysiwygComposer({
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ComposerContext.Provider value={defaultContextValue.current}>
|
<ComposerContext.Provider value={defaultContextValue}>
|
||||||
<WysiwygComposer
|
<WysiwygComposer
|
||||||
className={classNames("mx_EditWysiwygComposer", className)}
|
className={classNames("mx_EditWysiwygComposer", className)}
|
||||||
initialContent={initialContent}
|
initialContent={initialContent}
|
||||||
|
|
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
||||||
Please see LICENSE files in the repository root for full details.
|
Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { ForwardedRef, forwardRef, MutableRefObject, useRef } from "react";
|
import React, { ForwardedRef, forwardRef, MutableRefObject, useMemo } from "react";
|
||||||
import { IEventRelation } from "matrix-js-sdk/src/matrix";
|
import { IEventRelation } from "matrix-js-sdk/src/matrix";
|
||||||
|
|
||||||
import { useWysiwygSendActionHandler } from "./hooks/useWysiwygSendActionHandler";
|
import { useWysiwygSendActionHandler } from "./hooks/useWysiwygSendActionHandler";
|
||||||
|
@ -52,10 +52,10 @@ export default function SendWysiwygComposer({
|
||||||
...props
|
...props
|
||||||
}: SendWysiwygComposerProps): JSX.Element {
|
}: SendWysiwygComposerProps): JSX.Element {
|
||||||
const Composer = isRichTextEnabled ? WysiwygComposer : PlainTextComposer;
|
const Composer = isRichTextEnabled ? WysiwygComposer : PlainTextComposer;
|
||||||
const defaultContextValue = useRef(getDefaultContextValue({ eventRelation: props.eventRelation }));
|
const defaultContextValue = useMemo(() => getDefaultContextValue({ eventRelation: props.eventRelation }), []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ComposerContext.Provider value={defaultContextValue.current}>
|
<ComposerContext.Provider value={defaultContextValue}>
|
||||||
<Composer
|
<Composer
|
||||||
className="mx_SendWysiwygComposer"
|
className="mx_SendWysiwygComposer"
|
||||||
leftComponent={e2eStatus && <E2EIcon status={e2eStatus} />}
|
leftComponent={e2eStatus && <E2EIcon status={e2eStatus} />}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { ChangeEvent, JSX, useCallback, useMemo, useRef, useState } from "react";
|
import React, { ChangeEvent, JSX, useCallback, useMemo, useState } from "react";
|
||||||
import {
|
import {
|
||||||
InlineField,
|
InlineField,
|
||||||
ToggleControl,
|
ToggleControl,
|
||||||
|
@ -39,12 +39,12 @@ import { useSettingValue } from "../../../hooks/useSettings";
|
||||||
*/
|
*/
|
||||||
export function ThemeChoicePanel(): JSX.Element {
|
export function ThemeChoicePanel(): JSX.Element {
|
||||||
const themeState = useTheme();
|
const themeState = useTheme();
|
||||||
const themeWatcher = useRef(new ThemeWatcher());
|
const themeWatcher = useMemo(() => new ThemeWatcher(), []);
|
||||||
const customThemeEnabled = useSettingValue<boolean>("feature_custom_themes");
|
const customThemeEnabled = useSettingValue<boolean>("feature_custom_themes");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SettingsSubsection heading={_t("common|theme")} legacy={false} data-testid="themePanel">
|
<SettingsSubsection heading={_t("common|theme")} legacy={false} data-testid="themePanel">
|
||||||
{themeWatcher.current.isSystemThemeSupported() && (
|
{themeWatcher.isSystemThemeSupported() && (
|
||||||
<SystemTheme systemThemeActivated={themeState.systemThemeActivated} />
|
<SystemTheme systemThemeActivated={themeState.systemThemeActivated} />
|
||||||
)}
|
)}
|
||||||
<ThemeSelectors theme={themeState.theme} disabled={themeState.systemThemeActivated} />
|
<ThemeSelectors theme={themeState.theme} disabled={themeState.systemThemeActivated} />
|
||||||
|
|
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
||||||
Please see LICENSE files in the repository root for full details.
|
Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState } from "react";
|
import { ReactNode, createContext, useCallback, useContext, useEffect, useState, useMemo } from "react";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A ToastContext helps components display any kind of toast message and can be provided
|
* A ToastContext helps components display any kind of toast message and can be provided
|
||||||
|
@ -33,19 +33,19 @@ export function useToastContext(): ToastRack {
|
||||||
* the ToastRack object that should be provided to the context
|
* the ToastRack object that should be provided to the context
|
||||||
*/
|
*/
|
||||||
export function useActiveToast(): [ReactNode | undefined, ToastRack] {
|
export function useActiveToast(): [ReactNode | undefined, ToastRack] {
|
||||||
const toastRack = useRef(new ToastRack());
|
const toastRack = useMemo(() => new ToastRack(), []);
|
||||||
|
|
||||||
const [activeToast, setActiveToast] = useState<ReactNode | undefined>(toastRack.current.getActiveToast());
|
const [activeToast, setActiveToast] = useState<ReactNode | undefined>(toastRack.getActiveToast());
|
||||||
|
|
||||||
const updateCallback = useCallback(() => {
|
const updateCallback = useCallback(() => {
|
||||||
setActiveToast(toastRack.current.getActiveToast());
|
setActiveToast(toastRack.getActiveToast());
|
||||||
}, [setActiveToast, toastRack]);
|
}, [setActiveToast, toastRack]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
toastRack.current.setCallback(updateCallback);
|
toastRack.setCallback(updateCallback);
|
||||||
}, [toastRack, updateCallback]);
|
}, [toastRack, updateCallback]);
|
||||||
|
|
||||||
return [activeToast, toastRack.current];
|
return [activeToast, toastRack];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DisplayedToast {
|
interface DisplayedToast {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue