From 73424886895659f3628997c050ccc24db11aaf27 Mon Sep 17 00:00:00 2001 From: William Grant Date: Fri, 11 Aug 2023 11:22:54 +1000 Subject: [PATCH] fix: conversation header subtitles rerender on every loop --- .../header/ConversationHeaderTitle.tsx | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/ts/components/conversation/header/ConversationHeaderTitle.tsx b/ts/components/conversation/header/ConversationHeaderTitle.tsx index 0892b2085..794627eac 100644 --- a/ts/components/conversation/header/ConversationHeaderTitle.tsx +++ b/ts/components/conversation/header/ConversationHeaderTitle.tsx @@ -1,5 +1,5 @@ import { isNumber } from 'lodash'; -import React, { useEffect, useState, useMemo } from 'react'; +import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useConversationUsername } from '../../../hooks/useParamSelector'; import { closeRightPanel, openRightPanel } from '../../../state/ducks/conversations'; @@ -52,34 +52,14 @@ export const ConversationHeaderTitle = () => { const [visibleSubtitle, setVisibleSubtitle] = useState('notifications'); - const subtitleStrings: SubtitleStrings = {}; - const subtitleArray: Array = useMemo(() => { - return []; - }, []); + const [subtitleStrings, setSubtitleStrings] = useState({}); + const [subtitleArray, setSubtitleArray] = useState>([]); const { i18n } = window; const notificationSubtitle = notificationSetting ? i18n('notificationSubtitle', [notificationSetting]) : null; - if (notificationSubtitle) { - subtitleStrings.notifications = notificationSubtitle; - subtitleArray.push('notifications'); - } - - useEffect(() => { - setVisibleSubtitle('notifications'); - }, [convoName]); - - useEffect(() => { - if (subtitleArray.indexOf(visibleSubtitle) < 0) { - setVisibleSubtitle('notifications'); - } - }, [subtitleArray, visibleSubtitle]); - - if (!selectedConvoKey) { - return null; - } let memberCount = 0; if (isGroup) { @@ -90,15 +70,11 @@ export const ConversationHeaderTitle = () => { } } - let memberCountSubtitle = null; + let memberCountSubtitle: string | null = null; if (isGroup && memberCount > 0 && !isKickedFromGroup) { const count = String(memberCount); memberCountSubtitle = isPublic ? i18n('activeMembers', [count]) : i18n('members', [count]); } - if (memberCountSubtitle) { - subtitleStrings.members = memberCountSubtitle; - subtitleArray.push('members'); - } const disappearingMessageSettingText = expirationType === 'off' @@ -119,10 +95,6 @@ export const ConversationHeaderTitle = () => { abbreviatedExpireTime ? ` - ${abbreviatedExpireTime}` : '' }` : null; - if (disappearingMessageSubtitle) { - subtitleStrings.disappearingMessages = disappearingMessageSubtitle; - subtitleArray.push('disappearingMessages'); - } const handleRightPanelToggle = () => { if (isRightPanelOn) { @@ -137,6 +109,43 @@ export const ConversationHeaderTitle = () => { } }; + useEffect(() => { + setVisibleSubtitle('notifications'); + }, [convoName]); + + useEffect(() => { + const newSubtitlesArray: any = []; + const newSubtitlesStrings: any = {}; + + if (notificationSubtitle) { + newSubtitlesStrings.notifications = notificationSubtitle; + newSubtitlesArray.push('notifications'); + } + + if (memberCountSubtitle) { + newSubtitlesStrings.members = memberCountSubtitle; + newSubtitlesArray.push('members'); + } + + if (disappearingMessageSubtitle) { + newSubtitlesStrings.disappearingMessages = disappearingMessageSubtitle; + newSubtitlesArray.push('disappearingMessages'); + } + + if (newSubtitlesArray.indexOf(visibleSubtitle) < 0) { + setVisibleSubtitle('notifications'); + } + + setSubtitleStrings(newSubtitlesStrings); + setSubtitleArray(newSubtitlesArray); + }, [ + disappearingMessageSubtitle, + memberCountSubtitle, + notificationSubtitle, + subtitleStrings, + visibleSubtitle, + ]); + return (