From 712c146dc23fc1829cd5d68cc6c6e63bcee25e9c Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Wed, 23 Sep 2026 17:06:48 -0500 Subject: [PATCH] Add muted icon in calls tab Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Co-authored-by: Backport Bot --- _locales/en/messages.json | 4 ++++ stylesheets/components/CallsTab.scss | 4 ---- ts/components/CallsList.dom.tsx | 30 ++++++++++++++++++++++++++-- ts/components/CallsTab.dom.tsx | 4 ++++ ts/state/smart/CallsTab.preload.tsx | 3 +++ 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 1f51e4fefd..60162b9180 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1378,6 +1378,10 @@ "messageformat": "Mute", "description": "Shown in a button when a conversation is unmuted and can be muted" }, + "icu:muted": { + "messageformat": "Muted", + "description": "Label for icon showing conversation is muted" + }, "icu:cannotUpdateDetail-v2": { "messageformat": "Signal couldn't update. Retry update or visit {url} to install it manually. Then, contact support about this problem", "description": "Shown if a general error happened while trying to install update package" diff --git a/stylesheets/components/CallsTab.scss b/stylesheets/components/CallsTab.scss index 676c687697..d7f5a28cc9 100644 --- a/stylesheets/components/CallsTab.scss +++ b/stylesheets/components/CallsTab.scss @@ -285,10 +285,6 @@ width: 60%; } -.CallsList__ItemTitle { - font-weight: bold; -} - // Override .ListTile__subtitle so ellipsis is correct color .CallsList__Item--missed .ListTile__subtitle, .CallsList__Item--declined .ListTile__subtitle { diff --git a/ts/components/CallsList.dom.tsx b/ts/components/CallsList.dom.tsx index cf142d7164..70fd2a3c0a 100644 --- a/ts/components/CallsList.dom.tsx +++ b/ts/components/CallsList.dom.tsx @@ -60,6 +60,13 @@ import { DAY, MINUTE, SECOND } from '../util/durations/index.std.ts'; import type { StartCallData } from './ConfirmLeaveCallModal.dom.tsx'; import { Button, ButtonVariant } from './Button.dom.tsx'; import type { ICUJSXMessageParamsByKeyType } from '../types/Util.std.ts'; +import { + getNotifyWhileMuted, + type NotifyWhileMuted, +} from '../util/notifyWhileMuted.std.ts'; +import { AxoSymbol } from '../axo/AxoSymbol.dom.tsx'; +import { tw } from '../axo/tw.dom.tsx'; +import { isConversationMuted } from '../util/isConversationMuted.std.ts'; const log = createLogger('CallsList'); @@ -134,6 +141,7 @@ type CallsListProps = Readonly<{ getCall: (id: string) => CallStateType | undefined; getCallLink: (id: string) => CallLinkType | undefined; getConversation: (id: string) => ConversationType | void; + globalNotifyWhileMuted: NotifyWhileMuted; hangUpActiveCall: (reason: string) => void; i18n: LocalizerType; selectedCallHistoryGroup: CallHistoryGroup | null; @@ -179,6 +187,7 @@ export function CallsList({ getCall, getCallLink, getConversation, + globalNotifyWhileMuted, i18n, selectedCallHistoryGroup, onCreateCallLink, @@ -891,6 +900,10 @@ export function CallsList({ /> ); + const isMutedForCalls = + isConversationMuted(conversation) && + !getNotifyWhileMuted(conversation, globalNotifyWhileMuted).calls; + return (
- + + + + + {isMutedForCalls ? ( + + + + ) : null} } subtitleMaxLines={1} @@ -973,6 +998,7 @@ export function CallsList({ getIsAnybodyInCall, getIsCallActive, getIsInCall, + globalNotifyWhileMuted, hasMissedCallFilter, hasSearchStateQuery, selectedCallHistoryGroup, diff --git a/ts/components/CallsTab.dom.tsx b/ts/components/CallsTab.dom.tsx index ef86511eca..974560b010 100644 --- a/ts/components/CallsTab.dom.tsx +++ b/ts/components/CallsTab.dom.tsx @@ -25,6 +25,7 @@ import { I18n } from './I18n.dom.tsx'; import { AxoDropdownMenu } from '../axo/AxoDropdownMenu.dom.tsx'; import type { SmartPropsType as SmartToastManagerPropsType } from '../state/smart/ToastManager.preload.tsx'; import { AxoConfirmDialog } from '../axo/AxoConfirmDialog.dom.tsx'; +import type { NotifyWhileMuted } from '../util/notifyWhileMuted.std.ts'; enum CallsTabSidebarView { CallsListView, @@ -48,6 +49,7 @@ type CallsTabProps = Readonly<{ getCallLink: (id: string) => CallLinkType | undefined; getCallIdFromEra: typeof getCallIdFromEra; getConversation: (id: string) => ConversationType | void; + globalNotifyWhileMuted: NotifyWhileMuted; hangUpActiveCall: (reason: string) => void; hasAnyAdminCallLinks: boolean; hasFailedStorySends: boolean; @@ -103,6 +105,7 @@ export function CallsTab({ getCall, getCallLink, getConversation, + globalNotifyWhileMuted, hangUpActiveCall, hasAnyAdminCallLinks, hasFailedStorySends, @@ -264,6 +267,7 @@ export function CallsTab({ getCallIdFromEra={getCallIdFromEra} getCallLink={getCallLink} getConversation={getConversation} + globalNotifyWhileMuted={globalNotifyWhileMuted} hangUpActiveCall={hangUpActiveCall} i18n={i18n} selectedCallHistoryGroup={selectedView?.callHistoryGroup ?? null} diff --git a/ts/state/smart/CallsTab.preload.tsx b/ts/state/smart/CallsTab.preload.tsx index 1901550cf6..b00b0d84e9 100644 --- a/ts/state/smart/CallsTab.preload.tsx +++ b/ts/state/smart/CallsTab.preload.tsx @@ -5,6 +5,7 @@ import { useSelector } from 'react-redux'; import { DataReader } from '../../sql/Client.preload.ts'; import { useItemsActions } from '../ducks/items.preload.ts'; import { + getGlobalNotifyWhileMuted, getNavTabsCollapsed, getPreferredLeftPaneWidth, } from '../selectors/items.dom.ts'; @@ -140,6 +141,7 @@ export const SmartCallsTab = memo(function SmartCallsTab() { const allCallLinks = useSelector(getAllCallLinks); const allConversations = useSelector(getAllConversations); + const globalNotifyWhileMuted = useSelector(getGlobalNotifyWhileMuted); const regionCode = useSelector(getRegionCode); const getConversation = useSelector(getConversationSelector); const getAdhocCall = useSelector(getAdhocCallSelector); @@ -232,6 +234,7 @@ export const SmartCallsTab = memo(function SmartCallsTab() { getCall={getCall} getCallLink={getCallLink} callHistoryEdition={callHistoryEdition} + globalNotifyWhileMuted={globalNotifyWhileMuted} hangUpActiveCall={hangUpActiveCall} hasAnyAdminCallLinks={hasAnyAdminCallLinks} hasFailedStorySends={hasFailedStorySends}