Settings Tab: When nav tabs collapsed, show toggle

This commit is contained in:
Scott Nonnenberg 2025-05-16 01:36:12 +10:00 committed by GitHub
parent a75a0f9143
commit f1350e4754
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 90 additions and 4 deletions

View file

@ -34,6 +34,19 @@ $secondary-text-color: light-dark(
} }
&__header { &__header {
display: flex;
flex-direction: row;
}
&__header__toggle {
flex-grow: 0;
min-width: 80px;
width: 80px;
margin-inline-end: -24px;
}
&__header__text {
flex-grow: 1;
margin-inline-start: 24px; margin-inline-start: 24px;
@include mixins.font-title-medium; @include mixins.font-title-medium;
line-height: 20px; line-height: 20px;

View file

@ -137,6 +137,7 @@ export default {
hasCallRingtoneNotification: false, hasCallRingtoneNotification: false,
hasContentProtection: false, hasContentProtection: false,
hasCountMutedConversations: false, hasCountMutedConversations: false,
hasFailedStorySends: false,
hasHideMenuBar: false, hasHideMenuBar: false,
hasIncomingCallNotifications: true, hasIncomingCallNotifications: true,
hasLinkPreviews: true, hasLinkPreviews: true,
@ -168,7 +169,13 @@ export default {
isUpdateDownloaded: false, isUpdateDownloaded: false,
lastSyncTime: Date.now(), lastSyncTime: Date.now(),
localeOverride: null, localeOverride: null,
navTabsCollapsed: false,
notificationContent: 'name', notificationContent: 'name',
otherTabsUnreadStats: {
unreadCount: 0,
unreadMentionsCount: 0,
markedUnread: false,
},
preferredSystemLocales: ['en'], preferredSystemLocales: ['en'],
resolvedLocale: 'en', resolvedLocale: 'en',
selectedCamera: selectedCamera:
@ -239,6 +246,7 @@ export default {
onStartUpdate: action('onStartUpdate'), onStartUpdate: action('onStartUpdate'),
onTextFormattingChange: action('onTextFormattingChange'), onTextFormattingChange: action('onTextFormattingChange'),
onThemeChange: action('onThemeChange'), onThemeChange: action('onThemeChange'),
onToggleNavTabsCollapse: action('onToggleNavTabsCollapse'),
onUniversalExpireTimerChange: action('onUniversalExpireTimerChange'), onUniversalExpireTimerChange: action('onUniversalExpireTimerChange'),
onWhoCanSeeMeChange: action('onWhoCanSeeMeChange'), onWhoCanSeeMeChange: action('onWhoCanSeeMeChange'),
onWhoCanFindMeChange: action('onWhoCanFindMeChange'), onWhoCanFindMeChange: action('onWhoCanFindMeChange'),
@ -386,3 +394,30 @@ export const UpdateDownloaded = Template.bind({});
UpdateDownloaded.args = { UpdateDownloaded.args = {
isUpdateDownloaded: true, isUpdateDownloaded: true,
}; };
export const NavTabsCollapsed = Template.bind({});
NavTabsCollapsed.args = {
navTabsCollapsed: true,
};
export const NavTabsCollapsedWithBadges = Template.bind({});
NavTabsCollapsedWithBadges.args = {
navTabsCollapsed: true,
hasFailedStorySends: false,
otherTabsUnreadStats: {
unreadCount: 1,
unreadMentionsCount: 2,
markedUnread: false,
},
};
export const NavTabsCollapsedWithExclamation = Template.bind({});
NavTabsCollapsedWithExclamation.args = {
navTabsCollapsed: true,
hasFailedStorySends: true,
otherTabsUnreadStats: {
unreadCount: 1,
unreadMentionsCount: 2,
markedUnread: true,
},
};

View file

@ -74,6 +74,8 @@ import { PreferencesBackups } from './PreferencesBackups';
import { PreferencesInternal } from './PreferencesInternal'; import { PreferencesInternal } from './PreferencesInternal';
import { FunEmojiLocalizationProvider } from './fun/FunEmojiLocalizationProvider'; import { FunEmojiLocalizationProvider } from './fun/FunEmojiLocalizationProvider';
import type { ValidateLocalBackupStructureResultType } from '../services/backups/util/localBackup'; import type { ValidateLocalBackupStructureResultType } from '../services/backups/util/localBackup';
import { NavTabsToggle } from './NavTabs';
import type { UnreadStats } from '../util/countUnreadStats';
type CheckboxChangeHandlerType = (value: boolean) => unknown; type CheckboxChangeHandlerType = (value: boolean) => unknown;
type SelectChangeHandlerType<T = string | number> = (value: T) => unknown; type SelectChangeHandlerType<T = string | number> = (value: T) => unknown;
@ -134,9 +136,12 @@ export type PropsDataType = {
resolvedLocale: string; resolvedLocale: string;
// Other props // Other props
hasFailedStorySends: boolean;
hasPendingUpdate: boolean; hasPendingUpdate: boolean;
initialSpellCheckSetting: boolean; initialSpellCheckSetting: boolean;
isUpdateDownloaded: boolean; isUpdateDownloaded: boolean;
navTabsCollapsed: boolean;
otherTabsUnreadStats: UnreadStats;
// Limited support features // Limited support features
isAutoDownloadUpdatesSupported: boolean; isAutoDownloadUpdatesSupported: boolean;
@ -220,6 +225,7 @@ type PropsFunctionType = {
onSpellCheckChange: CheckboxChangeHandlerType; onSpellCheckChange: CheckboxChangeHandlerType;
onTextFormattingChange: CheckboxChangeHandlerType; onTextFormattingChange: CheckboxChangeHandlerType;
onThemeChange: SelectChangeHandlerType<ThemeType>; onThemeChange: SelectChangeHandlerType<ThemeType>;
onToggleNavTabsCollapse: (navTabsCollapsed: boolean) => void;
onUniversalExpireTimerChange: SelectChangeHandlerType<number>; onUniversalExpireTimerChange: SelectChangeHandlerType<number>;
onWhoCanSeeMeChange: SelectChangeHandlerType<PhoneNumberSharingMode>; onWhoCanSeeMeChange: SelectChangeHandlerType<PhoneNumberSharingMode>;
onWhoCanFindMeChange: SelectChangeHandlerType<PhoneNumberDiscoverability>; onWhoCanFindMeChange: SelectChangeHandlerType<PhoneNumberDiscoverability>;
@ -305,6 +311,7 @@ export function Preferences({
hasCallRingtoneNotification, hasCallRingtoneNotification,
hasContentProtection, hasContentProtection,
hasCountMutedConversations, hasCountMutedConversations,
hasFailedStorySends,
hasHideMenuBar, hasHideMenuBar,
hasIncomingCallNotifications, hasIncomingCallNotifications,
hasLinkPreviews, hasLinkPreviews,
@ -339,6 +346,7 @@ export function Preferences({
isUpdateDownloaded, isUpdateDownloaded,
lastSyncTime, lastSyncTime,
makeSyncRequest, makeSyncRequest,
navTabsCollapsed,
notificationContent, notificationContent,
onAudioNotificationsChange, onAudioNotificationsChange,
onAutoConvertEmojiChange, onAutoConvertEmojiChange,
@ -371,10 +379,12 @@ export function Preferences({
onSpellCheckChange, onSpellCheckChange,
onTextFormattingChange, onTextFormattingChange,
onThemeChange, onThemeChange,
onToggleNavTabsCollapse,
onUniversalExpireTimerChange, onUniversalExpireTimerChange,
onWhoCanSeeMeChange, onWhoCanSeeMeChange,
onWhoCanFindMeChange, onWhoCanFindMeChange,
onZoomFactorChange, onZoomFactorChange,
otherTabsUnreadStats,
phoneNumber = '', phoneNumber = '',
preferredSystemLocales, preferredSystemLocales,
refreshCloudBackupStatus, refreshCloudBackupStatus,
@ -1837,9 +1847,23 @@ export function Preferences({
<div className="module-title-bar-drag-area" /> <div className="module-title-bar-drag-area" />
<div className="Preferences"> <div className="Preferences">
<div className="Preferences__page-selector"> <div className="Preferences__page-selector">
<h1 className="Preferences__header"> <div className="Preferences__header">
{i18n('icu:Preferences--header')} {navTabsCollapsed ? (
</h1> <div className="Preferences__header__toggle">
<NavTabsToggle
i18n={i18n}
onToggleNavTabsCollapse={onToggleNavTabsCollapse}
navTabsCollapsed
hasFailedStorySends={hasFailedStorySends}
otherTabsUnreadStats={otherTabsUnreadStats}
hasPendingUpdate={false}
/>
</div>
) : undefined}
<h1 className="Preferences__header__text">
{i18n('icu:Preferences--header')}
</h1>
</div>
{maybeUpdateDialog ? ( {maybeUpdateDialog ? (
<div className="module-left-pane__dialogs">{maybeUpdateDialog}</div> <div className="module-left-pane__dialogs">{maybeUpdateDialog}</div>
) : null} ) : null}

View file

@ -8,7 +8,11 @@ import type { AudioDevice } from '@signalapp/ringrtc';
import { useItemsActions } from '../ducks/items'; import { useItemsActions } from '../ducks/items';
import { useConversationsActions } from '../ducks/conversations'; import { useConversationsActions } from '../ducks/conversations';
import { getConversationsWithCustomColorSelector } from '../selectors/conversations'; import { getConversationsWithCustomColorSelector } from '../selectors/conversations';
import { getCustomColors, getItems } from '../selectors/items'; import {
getCustomColors,
getItems,
getNavTabsCollapsed,
} from '../selectors/items';
import { DEFAULT_AUTO_DOWNLOAD_ATTACHMENT } from '../../textsecure/Storage'; import { DEFAULT_AUTO_DOWNLOAD_ATTACHMENT } from '../../textsecure/Storage';
import { DEFAULT_CONVERSATION_COLOR } from '../../types/Colors'; import { DEFAULT_CONVERSATION_COLOR } from '../../types/Colors';
import { isBackupFeatureEnabledForRedux } from '../../util/isBackupEnabled'; import { isBackupFeatureEnabledForRedux } from '../../util/isBackupEnabled';
@ -49,6 +53,8 @@ import {
getHasPendingUpdate, getHasPendingUpdate,
isUpdateDownloaded as getIsUpdateDownloaded, isUpdateDownloaded as getIsUpdateDownloaded,
} from '../selectors/updates'; } from '../selectors/updates';
import { getHasAnyFailedStorySends } from '../selectors/stories';
import { getOtherTabsUnreadStats } from '../selectors/nav';
const DEFAULT_NOTIFICATION_SETTING = 'message'; const DEFAULT_NOTIFICATION_SETTING = 'message';
@ -94,6 +100,7 @@ export function SmartPreferences(): JSX.Element {
resetDefaultChatColor, resetDefaultChatColor,
setEmojiSkinToneDefault: onEmojiSkinToneDefaultChange, setEmojiSkinToneDefault: onEmojiSkinToneDefaultChange,
setGlobalDefaultConversationColor, setGlobalDefaultConversationColor,
toggleNavTabsCollapse,
} = useItemsActions(); } = useItemsActions();
const { removeCustomColorOnConversations, resetAllChatColors } = const { removeCustomColorOnConversations, resetAllChatColors } =
useConversationsActions(); useConversationsActions();
@ -109,6 +116,9 @@ export function SmartPreferences(): JSX.Element {
const i18n = useSelector(getIntl); const i18n = useSelector(getIntl);
const hasPendingUpdate = useSelector(getHasPendingUpdate); const hasPendingUpdate = useSelector(getHasPendingUpdate);
const isUpdateDownloaded = useSelector(getIsUpdateDownloaded); const isUpdateDownloaded = useSelector(getIsUpdateDownloaded);
const navTabsCollapsed = useSelector(getNavTabsCollapsed);
const hasFailedStorySends = useSelector(getHasAnyFailedStorySends);
const otherTabsUnreadStats = useSelector(getOtherTabsUnreadStats);
// The weird ones // The weird ones
@ -604,6 +614,7 @@ export function SmartPreferences(): JSX.Element {
hasCallRingtoneNotification={hasCallRingtoneNotification} hasCallRingtoneNotification={hasCallRingtoneNotification}
hasContentProtection={hasContentProtection} hasContentProtection={hasContentProtection}
hasCountMutedConversations={hasCountMutedConversations} hasCountMutedConversations={hasCountMutedConversations}
hasFailedStorySends={hasFailedStorySends}
hasHideMenuBar={hasHideMenuBar} hasHideMenuBar={hasHideMenuBar}
hasIncomingCallNotifications={hasIncomingCallNotifications} hasIncomingCallNotifications={hasIncomingCallNotifications}
hasLinkPreviews={hasLinkPreviews} hasLinkPreviews={hasLinkPreviews}
@ -640,6 +651,7 @@ export function SmartPreferences(): JSX.Element {
lastSyncTime={lastSyncTime} lastSyncTime={lastSyncTime}
localeOverride={localeOverride} localeOverride={localeOverride}
makeSyncRequest={makeSyncRequest} makeSyncRequest={makeSyncRequest}
navTabsCollapsed={navTabsCollapsed}
notificationContent={notificationContent} notificationContent={notificationContent}
onAudioNotificationsChange={onAudioNotificationsChange} onAudioNotificationsChange={onAudioNotificationsChange}
onAutoConvertEmojiChange={onAutoConvertEmojiChange} onAutoConvertEmojiChange={onAutoConvertEmojiChange}
@ -675,10 +687,12 @@ export function SmartPreferences(): JSX.Element {
onSpellCheckChange={onSpellCheckChange} onSpellCheckChange={onSpellCheckChange}
onTextFormattingChange={onTextFormattingChange} onTextFormattingChange={onTextFormattingChange}
onThemeChange={onThemeChange} onThemeChange={onThemeChange}
onToggleNavTabsCollapse={toggleNavTabsCollapse}
onUniversalExpireTimerChange={onUniversalExpireTimerChange} onUniversalExpireTimerChange={onUniversalExpireTimerChange}
onWhoCanFindMeChange={onWhoCanFindMeChange} onWhoCanFindMeChange={onWhoCanFindMeChange}
onWhoCanSeeMeChange={onWhoCanSeeMeChange} onWhoCanSeeMeChange={onWhoCanSeeMeChange}
onZoomFactorChange={onZoomFactorChange} onZoomFactorChange={onZoomFactorChange}
otherTabsUnreadStats={otherTabsUnreadStats}
preferredSystemLocales={preferredSystemLocales} preferredSystemLocales={preferredSystemLocales}
refreshCloudBackupStatus={refreshCloudBackupStatus} refreshCloudBackupStatus={refreshCloudBackupStatus}
refreshBackupSubscriptionStatus={refreshBackupSubscriptionStatus} refreshBackupSubscriptionStatus={refreshBackupSubscriptionStatus}