Fix usage of useRef as memoization

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
Michael Telatynski 2024-12-05 12:57:39 +00:00
parent 6c2334c029
commit 9443426edb
No known key found for this signature in database
GPG key ID: A2B008A5F49F5D0D
5 changed files with 17 additions and 17 deletions

View file

@ -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(() => {

View file

@ -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}

View file

@ -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} />}

View file

@ -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} />

View file

@ -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 {