fix: resolve useEffect memory leaks in header title component

pull/2971/head
William Grant 2 years ago
parent c067ac9fc4
commit 48b1dd4d95

@ -1,5 +1,5 @@
import { isNumber } from 'lodash'; import { isNumber } from 'lodash';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { useConversationUsername } from '../../../hooks/useParamSelector'; import { useConversationUsername } from '../../../hooks/useParamSelector';
import { closeRightPanel, openRightPanel } from '../../../state/ducks/conversations'; import { closeRightPanel, openRightPanel } from '../../../state/ducks/conversations';
@ -57,39 +57,47 @@ export const ConversationHeaderTitle = () => {
const { i18n } = window; const { i18n } = window;
const notificationSubtitle = notificationSetting const notificationSubtitle = useMemo(
? i18n('notificationSubtitle', [notificationSetting]) () => (notificationSetting ? i18n('notificationSubtitle', [notificationSetting]) : null),
: null; [i18n, notificationSetting]
);
let memberCount = 0; const memberCountSubtitle = useMemo(() => {
if (isGroup) { let memberCount = 0;
if (isPublic) { if (isGroup) {
memberCount = subscriberCount || 0; if (isPublic) {
} else { memberCount = subscriberCount || 0;
memberCount = members.length; } else {
memberCount = members.length;
}
} }
}
if (isGroup && memberCount > 0 && !isKickedFromGroup) {
let memberCountSubtitle: string | null = null; const count = String(memberCount);
if (isGroup && memberCount > 0 && !isKickedFromGroup) { return isPublic ? i18n('activeMembers', [count]) : i18n('members', [count]);
const count = String(memberCount); }
memberCountSubtitle = isPublic ? i18n('activeMembers', [count]) : i18n('members', [count]);
} return null;
}, [i18n, isGroup, isKickedFromGroup, isPublic, members.length, subscriberCount]);
const disappearingMessageSettingText =
expirationType === 'deleteAfterRead' const disappearingMessageSubtitle = useMemo(() => {
? window.i18n('disappearingMessagesModeAfterRead') const disappearingMessageSettingText =
: expirationType === 'deleteAfterSend' expirationType === 'deleteAfterRead'
? window.i18n('disappearingMessagesModeAfterSend') ? window.i18n('disappearingMessagesModeAfterRead')
: expirationType === 'deleteAfterSend'
? window.i18n('disappearingMessagesModeAfterSend')
: null;
const abbreviatedExpireTime = isNumber(expireTimer)
? ExpirationTimerOptions.getAbbreviated(expireTimer)
: null;
return disappearingMessageSettingText
? `${disappearingMessageSettingText}${
abbreviatedExpireTime ? ` - ${abbreviatedExpireTime}` : ''
}`
: null; : null;
const abbreviatedExpireTime = isNumber(expireTimer) }, [expirationType, expireTimer]);
? ExpirationTimerOptions.getAbbreviated(expireTimer)
: null;
const disappearingMessageSubtitle = disappearingMessageSettingText
? `${disappearingMessageSettingText}${
abbreviatedExpireTime ? ` - ${abbreviatedExpireTime}` : ''
}`
: null;
const handleRightPanelToggle = () => { const handleRightPanelToggle = () => {
if (isRightPanelOn) { if (isRightPanelOn) {
@ -105,7 +113,11 @@ export const ConversationHeaderTitle = () => {
}; };
useEffect(() => { useEffect(() => {
setVisibleSubtitle('notifications'); if (visibleSubtitle !== 'notifications') {
setVisibleSubtitle('notifications');
}
// We only want this to change when a new conversation is selected
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [convoName]); }, [convoName]);
useEffect(() => { useEffect(() => {
@ -133,13 +145,7 @@ export const ConversationHeaderTitle = () => {
setSubtitleStrings(newSubtitlesStrings); setSubtitleStrings(newSubtitlesStrings);
setSubtitleArray(newSubtitlesArray); setSubtitleArray(newSubtitlesArray);
}, [ }, [disappearingMessageSubtitle, memberCountSubtitle, notificationSubtitle, visibleSubtitle]);
disappearingMessageSubtitle,
memberCountSubtitle,
notificationSubtitle,
subtitleStrings,
visibleSubtitle,
]);
return ( return (
<div className="module-conversation-header__title-container"> <div className="module-conversation-header__title-container">

Loading…
Cancel
Save