From 682ec32dd205073ea1e596a1624b5121c4bb2a8e Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Mon, 17 Nov 2025 12:18:37 +0400 Subject: [PATCH] Folders: Support vertical sidebar display mode (#6280) By @kotevcode --- src/assets/font-icons/folder-tabs/bot.svg | 7 + src/assets/font-icons/folder-tabs/channel.svg | 4 + src/assets/font-icons/folder-tabs/chat.svg | 3 + src/assets/font-icons/folder-tabs/chats.svg | 4 + src/assets/font-icons/folder-tabs/folder.svg | 4 + src/assets/font-icons/folder-tabs/group.svg | 6 + src/assets/font-icons/folder-tabs/star.svg | 3 + src/assets/font-icons/folder-tabs/user.svg | 4 + src/assets/font-icons/menu.svg | 4 + src/assets/font-icons/tools.svg | 3 + src/assets/localization/fallback.strings | 6 +- src/components/common/FolderIcon.module.scss | 6 + src/components/common/FolderIcon.tsx | 41 ++ src/components/common/LinkField.tsx | 14 +- src/components/common/MainMenuDropdown.tsx | 85 ++++ src/components/common/StickerButton.tsx | 5 +- src/components/common/UiLoader.module.scss | 9 + src/components/common/UiLoader.tsx | 12 +- src/components/left/LeftColumn.scss | 20 +- src/components/left/LeftColumn.tsx | 3 + src/components/left/main/Archive.module.scss | 4 + src/components/left/main/Archive.tsx | 3 + src/components/left/main/Chat.tsx | 3 + src/components/left/main/ChatFolders.tsx | 172 +------ src/components/left/main/ChatList.tsx | 4 + src/components/left/main/ChatTags.tsx | 38 +- src/components/left/main/LeftMain.scss | 4 + src/components/left/main/LeftMain.tsx | 18 +- src/components/left/main/LeftMainHeader.scss | 35 +- src/components/left/main/LeftMainHeader.tsx | 136 ++---- .../settings/folders/FolderIconPickerMenu.tsx | 58 +++ .../settings/folders/SettingsFolders.scss | 45 +- .../left/settings/folders/SettingsFolders.tsx | 5 + .../settings/folders/SettingsFoldersEdit.tsx | 135 +++++- .../settings/folders/SettingsFoldersMain.tsx | 31 ++ .../main/FoldersSidebar.module.scss | 94 ++++ src/components/main/FoldersSidebar.tsx | 206 ++++++++ src/components/main/Main.scss | 13 + src/components/main/Main.tsx | 13 +- src/components/middle/MessageList.tsx | 8 +- .../modals/paidReaction/PaidReactionModal.tsx | 2 +- src/components/right/RightHeader.tsx | 2 +- src/components/story/Story.tsx | 4 +- .../story/helpers/ribbonAnimation.ts | 29 +- src/components/ui/Folder.module.scss | 115 +++++ src/components/ui/Folder.tsx | 131 +++++ src/components/ui/Tab.tsx | 3 + src/components/ui/TabList.tsx | 3 + src/config.ts | 4 + src/global/actions/ui/settings.ts | 6 +- src/global/cache.ts | 6 + src/global/initialState.ts | 2 + src/global/selectors/chats.ts | 5 + src/global/types/sharedState.ts | 3 +- src/hooks/reducers/useFoldersReducer.ts | 20 +- src/hooks/useFolderTabs.ts | 235 +++++++++ src/styles/_variables.scss | 2 + src/styles/icons.css | 446 ++++++++++-------- src/styles/icons.scss | 422 +++++++++-------- src/styles/icons.woff | Bin 37796 -> 38840 bytes src/styles/icons.woff2 | Bin 31628 -> 32396 bytes src/styles/themes.json | 7 +- src/types/icons/font.ts | 10 + src/types/index.ts | 1 + src/types/language.d.ts | 6 +- src/util/fallbackLangPack.ts | 3 + src/util/folderIconMap.ts | 20 + 67 files changed, 2004 insertions(+), 751 deletions(-) create mode 100644 src/assets/font-icons/folder-tabs/bot.svg create mode 100644 src/assets/font-icons/folder-tabs/channel.svg create mode 100644 src/assets/font-icons/folder-tabs/chat.svg create mode 100644 src/assets/font-icons/folder-tabs/chats.svg create mode 100644 src/assets/font-icons/folder-tabs/folder.svg create mode 100644 src/assets/font-icons/folder-tabs/group.svg create mode 100644 src/assets/font-icons/folder-tabs/star.svg create mode 100644 src/assets/font-icons/folder-tabs/user.svg create mode 100644 src/assets/font-icons/menu.svg create mode 100644 src/assets/font-icons/tools.svg create mode 100644 src/components/common/FolderIcon.module.scss create mode 100644 src/components/common/FolderIcon.tsx create mode 100644 src/components/common/MainMenuDropdown.tsx create mode 100644 src/components/left/settings/folders/FolderIconPickerMenu.tsx create mode 100644 src/components/main/FoldersSidebar.module.scss create mode 100644 src/components/main/FoldersSidebar.tsx create mode 100644 src/components/ui/Folder.module.scss create mode 100644 src/components/ui/Folder.tsx create mode 100644 src/hooks/useFolderTabs.ts create mode 100644 src/util/folderIconMap.ts diff --git a/src/assets/font-icons/folder-tabs/bot.svg b/src/assets/font-icons/folder-tabs/bot.svg new file mode 100644 index 000000000..a1770c135 --- /dev/null +++ b/src/assets/font-icons/folder-tabs/bot.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/font-icons/folder-tabs/channel.svg b/src/assets/font-icons/folder-tabs/channel.svg new file mode 100644 index 000000000..bd995d637 --- /dev/null +++ b/src/assets/font-icons/folder-tabs/channel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/font-icons/folder-tabs/chat.svg b/src/assets/font-icons/folder-tabs/chat.svg new file mode 100644 index 000000000..606f200af --- /dev/null +++ b/src/assets/font-icons/folder-tabs/chat.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/font-icons/folder-tabs/chats.svg b/src/assets/font-icons/folder-tabs/chats.svg new file mode 100644 index 000000000..d12c647f6 --- /dev/null +++ b/src/assets/font-icons/folder-tabs/chats.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/font-icons/folder-tabs/folder.svg b/src/assets/font-icons/folder-tabs/folder.svg new file mode 100644 index 000000000..719aca401 --- /dev/null +++ b/src/assets/font-icons/folder-tabs/folder.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/font-icons/folder-tabs/group.svg b/src/assets/font-icons/folder-tabs/group.svg new file mode 100644 index 000000000..a04bb3801 --- /dev/null +++ b/src/assets/font-icons/folder-tabs/group.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/font-icons/folder-tabs/star.svg b/src/assets/font-icons/folder-tabs/star.svg new file mode 100644 index 000000000..773271a07 --- /dev/null +++ b/src/assets/font-icons/folder-tabs/star.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/font-icons/folder-tabs/user.svg b/src/assets/font-icons/folder-tabs/user.svg new file mode 100644 index 000000000..8ea08c29f --- /dev/null +++ b/src/assets/font-icons/folder-tabs/user.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/font-icons/menu.svg b/src/assets/font-icons/menu.svg new file mode 100644 index 000000000..f1e0f08c2 --- /dev/null +++ b/src/assets/font-icons/menu.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/font-icons/tools.svg b/src/assets/font-icons/tools.svg new file mode 100644 index 000000000..ff6cd0a98 --- /dev/null +++ b/src/assets/font-icons/tools.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index 8a336fe4c..fa029c0d3 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -330,7 +330,8 @@ "ChatEmptyChat" = "No messages here yet"; "ChatListEmptyChatListEditFilter" = "Edit Folder"; "UpdateTelegram" = "Update Telegram"; -"AccDescrOpenMenu2" = "Open menu"; +"AriaLabelOpenMenu" = "Open menu"; +"AriaLabelBackChatList" = "Return to chat list"; "SettingsTipsUsername" = "TelegramTips"; "SearchFriends" = "Search contacts"; "Search" = "Search"; @@ -370,6 +371,9 @@ "FilterColorHint" = "This color will be used for the folder's tag in the chat list"; "ShowFolderTags" = "Show Folder Tags"; "ShowFolderTagsHint" = "Display folder names for each chat in the chat list."; +"TabsPosition" = "Tabs View"; +"TabsPositionLeft" = "Tabs on the left"; +"TabsPositionTop" = "Tabs at the top"; "FilterIncludeInfo" = "Choose chats or types of chats that will appear in this folder."; "FilterNameHint" = "Folder name"; "FilterInclude" = "Included Chats"; diff --git a/src/components/common/FolderIcon.module.scss b/src/components/common/FolderIcon.module.scss new file mode 100644 index 000000000..4c4d92d2a --- /dev/null +++ b/src/components/common/FolderIcon.module.scss @@ -0,0 +1,6 @@ +.emoji { + display: grid; + place-content: center; + width: 2rem; + height: 2rem; +} diff --git a/src/components/common/FolderIcon.tsx b/src/components/common/FolderIcon.tsx new file mode 100644 index 000000000..014ba7883 --- /dev/null +++ b/src/components/common/FolderIcon.tsx @@ -0,0 +1,41 @@ +import { memo } from '../../lib/teact/teact'; + +import { emojiToFolderIcon } from '../../util/folderIconMap'; +import { REM } from './helpers/mediaDimensions'; +import renderText from './helpers/renderText'; + +import CustomEmoji from './CustomEmoji'; +import Icon from './icons/Icon'; + +import styles from './FolderIcon.module.scss'; + +const ICON_SIZE = 2.25 * REM; + +const FolderIcon = ( + { + emoji, + customEmojiId, + shouldAnimate, + }: { + emoji?: string; + customEmojiId?: string; + shouldAnimate?: boolean; + }, +) => { + if (customEmojiId) { + return ; + } + + if (!emoji) { + return ; + } + + const iconName = emojiToFolderIcon(emoji); + if (iconName) { + return ; + } + + return
{renderText(emoji)}
; +}; + +export default memo(FolderIcon); diff --git a/src/components/common/LinkField.tsx b/src/components/common/LinkField.tsx index 49ce1e714..fb7598e3b 100644 --- a/src/components/common/LinkField.tsx +++ b/src/components/common/LinkField.tsx @@ -6,6 +6,7 @@ import buildClassName from '../../util/buildClassName'; import { copyTextToClipboard } from '../../util/clipboard'; import useAppLayout from '../../hooks/useAppLayout'; +import useLang from '../../hooks/useLang'; import useLastCallback from '../../hooks/useLastCallback'; import useOldLang from '../../hooks/useOldLang'; @@ -33,7 +34,8 @@ const InviteLink: FC = ({ withShare, onRevoke, }) => { - const lang = useOldLang(); + const lang = useLang(); + const oldLang = useOldLang(); const { showNotification, openChatWithDraft } = getActions(); const { isMobile } = useAppLayout(); @@ -67,7 +69,7 @@ const InviteLink: FC = ({ color="translucent" className={isOpen ? 'active' : ''} onClick={onTrigger} - ariaLabel={lang('AccDescrOpenMenu2')} + ariaLabel={lang('AriaLabelOpenMenu')} > @@ -77,7 +79,7 @@ const InviteLink: FC = ({ return (

- {lang(title || 'InviteLink.InviteLink')} + {oldLang(title || 'InviteLink.InviteLink')}

= ({ trigger={PrimaryLinkMenuButton} positionX="right" > - {lang('Copy')} + {oldLang('Copy')} {onRevoke && ( - {lang('RevokeButton')} + {oldLang('RevokeButton')} )} )} @@ -116,7 +118,7 @@ const InviteLink: FC = ({ onClick={handleShare} className={styles.share} > - {lang('FolderLinkScreen.LinkActionShare')} + {oldLang('FolderLinkScreen.LinkActionShare')} )}
diff --git a/src/components/common/MainMenuDropdown.tsx b/src/components/common/MainMenuDropdown.tsx new file mode 100644 index 000000000..68a4fc35d --- /dev/null +++ b/src/components/common/MainMenuDropdown.tsx @@ -0,0 +1,85 @@ +import { type FC, memo } from '@teact'; +import { getActions } from '../../global'; + +import { LeftColumnContent, SettingsScreens } from '../../types'; + +import { + APP_NAME, + DEBUG, + IS_BETA, +} from '../../config'; +import buildClassName from '../../util/buildClassName'; + +import useFlag from '../../hooks/useFlag'; +import useLang from '../../hooks/useLang'; +import useLastCallback from '../../hooks/useLastCallback'; +import useLeftHeaderButtonRtlForumTransition from '../left/main/hooks/useLeftHeaderButtonRtlForumTransition'; + +import LeftSideMenuItems from '../left/main/LeftSideMenuItems'; +import DropdownMenu from '../ui/DropdownMenu'; + +type OwnProps = { + trigger?: FC<{ onTrigger: () => void; isOpen?: boolean }>; + shouldHideSearch?: boolean; + className?: string; +}; + +const LeftSideMenuDropdown = ({ + trigger, + shouldHideSearch, + className, +}: OwnProps) => { + const { openLeftColumnContent, closeForumPanel, openSettingsScreen } = getActions(); + const [isBotMenuOpen, markBotMenuOpen, unmarkBotMenuOpen] = useFlag(); + const lang = useLang(); + + const versionString = IS_BETA ? `${APP_VERSION} Beta (${APP_REVISION})` : (DEBUG ? APP_REVISION : APP_VERSION); + + // Disable dropdown menu RTL animation for resize + const { + shouldDisableDropdownMenuTransitionRef, + handleDropdownMenuTransitionEnd, + } = useLeftHeaderButtonRtlForumTransition(shouldHideSearch); + + const handleSelectSettings = useLastCallback(() => { + openSettingsScreen({ screen: SettingsScreens.Main }); + }); + + const handleSelectContacts = useLastCallback(() => { + openLeftColumnContent({ contentKey: LeftColumnContent.Contacts }); + }); + + const handleSelectArchived = useLastCallback(() => { + openLeftColumnContent({ contentKey: LeftColumnContent.Archived }); + closeForumPanel(); + }); + + return ( + + + + ); +}; + +export default memo(LeftSideMenuDropdown); diff --git a/src/components/common/StickerButton.tsx b/src/components/common/StickerButton.tsx index 1bfe79398..77c1b6809 100644 --- a/src/components/common/StickerButton.tsx +++ b/src/components/common/StickerButton.tsx @@ -107,7 +107,7 @@ const StickerButton = & { isRightColumnShown?: boolean; leftColumnWidth?: number; + isFoldersSidebarShown?: boolean; }; const MAX_PRELOAD_DELAY = 700; @@ -104,6 +107,7 @@ const UiLoader: FC = ({ isRightColumnShown, shouldSkipHistoryAnimations, leftColumnWidth, + isFoldersSidebarShown, }) => { const { setIsUiReady } = getActions(); @@ -151,7 +155,8 @@ const UiLoader: FC = ({ {shouldRenderMask && !shouldSkipHistoryAnimations && Boolean(page) && (
{page === 'main' ? ( -
+
+ {isFoldersSidebarShown &&
}
( (global, { isMobile }): Complete => { const tabState = selectTabState(global); + const { tabsPosition } = selectSharedSettings(global); + return { shouldSkipHistoryAnimations: tabState.shouldSkipHistoryAnimations, uiReadyState: tabState.uiReadyState, isRightColumnShown: selectIsRightColumnShown(global, isMobile), leftColumnWidth: global.leftColumnWidth, + isFoldersSidebarShown: tabsPosition === TABS_POSITION_LEFT && !isMobile && selectAreFoldersPresent(global), }; }, )(UiLoader); diff --git a/src/components/left/LeftColumn.scss b/src/components/left/LeftColumn.scss index c469e4c7b..a0ccd7c9a 100644 --- a/src/components/left/LeftColumn.scss +++ b/src/components/left/LeftColumn.scss @@ -28,12 +28,7 @@ } .SearchInput { - max-width: calc(100% - 3.25rem); margin-left: 0.625rem; - - @media (max-width: 600px) { - max-width: calc(100% - 3rem); - } } .Button.smaller { @@ -45,19 +40,8 @@ } } - body.is-tauri.is-macos #Main:not(.is-fullscreen) &:not(#TopicListHeader) { - justify-content: space-between; - padding: 0.5rem 0.5rem 0.5rem var(--window-controls-width); - - .SearchInput { - max-width: calc(100% - 2.75rem); - margin-left: 0.5rem; - } - - .Menu.main-menu .bubble { - --offset-y: 100%; - --offset-x: -4.125rem; - } + body.is-tauri.is-macos #Main:not(.is-fullscreen):not(.tabs-sidebar-visible) &:not(#TopicListHeader) { + padding-left: var(--window-controls-width); } @media (max-width: 600px) { diff --git a/src/components/left/LeftColumn.tsx b/src/components/left/LeftColumn.tsx index 837bbf42b..db7950ce2 100644 --- a/src/components/left/LeftColumn.tsx +++ b/src/components/left/LeftColumn.tsx @@ -38,6 +38,7 @@ import './LeftColumn.scss'; interface OwnProps { ref: ElementRef; + isFoldersSidebarShown: boolean; } type StateProps = { @@ -96,6 +97,7 @@ function LeftColumn({ archiveSettings, isArchivedStoryRibbonShown, isAccountFrozen, + isFoldersSidebarShown, }: OwnProps & StateProps) { const { setGlobalSearchQuery, @@ -541,6 +543,7 @@ function LeftColumn({ isForumPanelOpen={isForumPanelOpen} onTopicSearch={handleTopicSearch} isAccountFrozen={isAccountFrozen} + isFoldersSidebarShown={isFoldersSidebarShown} /> ); } diff --git a/src/components/left/main/Archive.module.scss b/src/components/left/main/Archive.module.scss index 39d430e60..7c93da824 100644 --- a/src/components/left/main/Archive.module.scss +++ b/src/components/left/main/Archive.module.scss @@ -14,6 +14,10 @@ display: none; } + &.no-margin-top { + margin-top: 0 !important; + } + &:hover { opacity: 0.85; } diff --git a/src/components/left/main/Archive.tsx b/src/components/left/main/Archive.tsx index 24ab54145..f29f372ff 100644 --- a/src/components/left/main/Archive.tsx +++ b/src/components/left/main/Archive.tsx @@ -26,6 +26,7 @@ type OwnProps = { archiveSettings: GlobalState['archiveSettings']; onDragEnter?: NoneToVoidFunction; onClick?: NoneToVoidFunction; + isFoldersSidebarShown?: boolean; }; const PREVIEW_SLICE = 5; @@ -40,6 +41,7 @@ const Archive: FC = ({ archiveSettings, onDragEnter, onClick, + isFoldersSidebarShown, }) => { const { updateArchiveSettings } = getActions(); const lang = useLang(); @@ -158,6 +160,7 @@ const Archive: FC = ({ className={buildClassName( styles.root, archiveSettings.isMinimized && styles.minimized, + isFoldersSidebarShown && archiveSettings.isMinimized && styles.noMarginTop, 'chat-item-clickable', 'chat-item-archive', )} diff --git a/src/components/left/main/Chat.tsx b/src/components/left/main/Chat.tsx index e1ce015ce..d1ba75ea7 100644 --- a/src/components/left/main/Chat.tsx +++ b/src/components/left/main/Chat.tsx @@ -99,6 +99,7 @@ type OwnProps = { onDragEnter?: (chatId: string) => void; onDragLeave?: NoneToVoidFunction; onReorderAnimationEnd?: NoneToVoidFunction; + isFoldersSidebarShown?: boolean; }; type StateProps = { @@ -176,6 +177,7 @@ const Chat: FC = ({ areTagsEnabled, withTags, onReorderAnimationEnd, + isFoldersSidebarShown, }) => { const { openChat, @@ -491,6 +493,7 @@ const Chat: FC = ({ itemClassName="chat-tag" orderedFolderIds={tagFolderIds} chatFoldersById={chatFoldersById} + isFoldersSidebarShown={isFoldersSidebarShown} /> )}
diff --git a/src/components/left/main/ChatFolders.tsx b/src/components/left/main/ChatFolders.tsx index 50337e72d..df1a266d3 100644 --- a/src/components/left/main/ChatFolders.tsx +++ b/src/components/left/main/ChatFolders.tsx @@ -1,32 +1,24 @@ import type { FC } from '@teact'; -import { memo, useEffect, useMemo, useRef } from '@teact'; -import { getActions, getGlobal, withGlobal } from '../../../global'; +import { memo, useEffect, useRef } from '@teact'; +import { getActions, withGlobal } from '../../../global'; import type { ApiChatFolder, ApiChatlistExportedInvite, ApiSession } from '../../../api/types'; import type { GlobalState } from '../../../global/types'; import type { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer'; import type { AnimationLevel } from '../../../types'; -import type { MenuItemContextAction } from '../../ui/ListItem'; -import type { TabWithProperties } from '../../ui/TabList'; -import { SettingsScreens } from '../../../types'; import { ALL_FOLDER_ID } from '../../../config'; -import { selectCanShareFolder, selectIsCurrentUserFrozen, selectTabState } from '../../../global/selectors'; +import { selectIsCurrentUserFrozen, selectTabState } from '../../../global/selectors'; import { selectCurrentLimit } from '../../../global/selectors/limits'; import { selectSharedSettings } from '../../../global/selectors/sharedState'; import { IS_TOUCH_ENV } from '../../../util/browser/windowEnvironment'; import buildClassName from '../../../util/buildClassName'; import captureEscKeyListener from '../../../util/captureEscKeyListener'; import { captureEvents, SwipeDirection } from '../../../util/captureEvents'; -import { MEMO_EMPTY_ARRAY } from '../../../util/memo'; import { resolveTransitionName } from '../../../util/resolveTransitionName'; -import { renderTextWithEntities } from '../../common/helpers/renderTextWithEntities'; import useDerivedState from '../../../hooks/useDerivedState'; -import { - useFolderManagerForUnreadChatsByFolder, - useFolderManagerForUnreadCounters, -} from '../../../hooks/useFolderManager'; +import useFolderTabs from '../../../hooks/useFolderTabs'; import useHistoryBack from '../../../hooks/useHistoryBack'; import useLang from '../../../hooks/useLang'; import useLastCallback from '../../../hooks/useLastCallback'; @@ -41,6 +33,7 @@ type OwnProps = { foldersDispatch: FolderEditDispatch; shouldHideFolderTabs?: boolean; isForumPanelOpen?: boolean; + isFoldersSidebarShown?: boolean; }; type StateProps = { @@ -85,17 +78,12 @@ const ChatFolders: FC = ({ isStoryRibbonShown, sessions, isAccountFrozen, + isFoldersSidebarShown, }) => { const { loadChatFolders, setActiveChatFolder, openChat, - openShareChatFolderModal, - openDeleteChatFolderModal, - openEditChatFolder, - openLimitReachedModal, - markChatMessagesRead, - openSettingsScreen, } = getActions(); const transitionRef = useRef(); @@ -118,149 +106,27 @@ const ChatFolders: FC = ({ const isStoryRibbonClosing = useDerivedState(getIsStoryRibbonClosing); const scrollToTop = useLastCallback(() => { - const activeList = ref.current?.querySelector('.chat-list.Transition_slide-active'); + const activeList = ref.current?.querySelector('#LeftColumn .chat-list.Transition_slide-active'); activeList?.scrollTo({ top: 0, behavior: 'smooth', }); }); - const allChatsFolder: ApiChatFolder = useMemo(() => { - return { - id: ALL_FOLDER_ID, - title: { text: orderedFolderIds?.[0] === ALL_FOLDER_ID ? lang('FilterAllChatsShort') : lang('FilterAllChats') }, - includedChatIds: MEMO_EMPTY_ARRAY, - excludedChatIds: MEMO_EMPTY_ARRAY, - } satisfies ApiChatFolder; - }, [orderedFolderIds, lang]); - - const displayedFolders = useMemo(() => { - return orderedFolderIds - ? orderedFolderIds.map((id) => { - if (id === ALL_FOLDER_ID) { - return allChatsFolder; - } - - return chatFoldersById[id] || {}; - }).filter(Boolean) - : undefined; - }, [chatFoldersById, allChatsFolder, orderedFolderIds]); + const { displayedFolders, folderTabs } = useFolderTabs({ + sidebarMode: false, + orderedFolderIds, + chatFoldersById, + maxFolders, + maxChatLists, + folderInvitesById, + maxFolderInvites, + }); const allChatsFolderIndex = displayedFolders?.findIndex((folder) => folder.id === ALL_FOLDER_ID); const isInAllChatsFolder = allChatsFolderIndex === activeChatFolder; const isInFirstFolder = FIRST_FOLDER_INDEX === activeChatFolder; - const folderUnreadChatsCountersById = useFolderManagerForUnreadChatsByFolder(); - const handleReadAllChats = useLastCallback((folderId: number) => { - const unreadChatIds = folderUnreadChatsCountersById[folderId]; - if (!unreadChatIds?.length) return; - - unreadChatIds.forEach((chatId) => { - markChatMessagesRead({ id: chatId }); - }); - }); - - const folderCountersById = useFolderManagerForUnreadCounters(); - const folderTabs = useMemo(() => { - if (!displayedFolders || !displayedFolders.length) { - return undefined; - } - - return displayedFolders.map((folder, i) => { - const { id, title } = folder; - const isBlocked = id !== ALL_FOLDER_ID && i > maxFolders - 1; - const canShareFolder = selectCanShareFolder(getGlobal(), id); - const contextActions: MenuItemContextAction[] = []; - - if (canShareFolder) { - contextActions.push({ - title: lang('FilterShare'), - icon: 'link', - handler: () => { - const chatListCount = Object.values(chatFoldersById).reduce((acc, el) => acc + (el.isChatList ? 1 : 0), 0); - if (chatListCount >= maxChatLists && !folder.isChatList) { - openLimitReachedModal({ - limit: 'chatlistJoined', - }); - return; - } - - // Greater amount can be after premium downgrade - if (folderInvitesById[id]?.length >= maxFolderInvites) { - openLimitReachedModal({ - limit: 'chatlistInvites', - }); - return; - } - - openShareChatFolderModal({ - folderId: id, - }); - }, - }); - } - - if (id === ALL_FOLDER_ID) { - contextActions.push({ - title: lang('FilterEditFolders'), - icon: 'edit', - handler: () => { - openSettingsScreen({ screen: SettingsScreens.Folders }); - }, - }); - - if (folderUnreadChatsCountersById[id]?.length) { - contextActions.push({ - title: lang('ChatListMarkAllAsRead'), - icon: 'readchats', - handler: () => handleReadAllChats(folder.id), - }); - } - } else { - contextActions.push({ - title: lang('EditFolder'), - icon: 'edit', - handler: () => { - openEditChatFolder({ folderId: id }); - }, - }); - - if (folderUnreadChatsCountersById[id]?.length) { - contextActions.push({ - title: lang('ChatListMarkAllAsRead'), - icon: 'readchats', - handler: () => handleReadAllChats(folder.id), - }); - } - - contextActions.push({ - title: lang('FilterMenuDelete'), - icon: 'delete', - destructive: true, - handler: () => { - openDeleteChatFolderModal({ folderId: id }); - }, - }); - } - - return { - id, - title: renderTextWithEntities({ - text: title.text, - entities: title.entities, - noCustomEmojiPlayback: folder.noTitleAnimations, - }), - badgeCount: folderCountersById[id]?.chatsCount, - isBadgeActive: Boolean(folderCountersById[id]?.notificationsCount), - isBlocked, - contextActions: contextActions?.length ? contextActions : undefined, - } satisfies TabWithProperties; - }); - }, [ - displayedFolders, maxFolders, folderCountersById, lang, chatFoldersById, maxChatLists, folderInvitesById, - maxFolderInvites, folderUnreadChatsCountersById, openSettingsScreen, - ]); - const handleSwitchTab = useLastCallback((index: number) => { setActiveChatFolder({ activeChatFolder: index }, { forceOnHeavyAnimation: true }); if (activeChatFolder === index) { @@ -368,6 +234,7 @@ const ChatFolders: FC = ({ archiveSettings={archiveSettings} sessions={sessions} isAccountFrozen={isAccountFrozen} + isFoldersSidebarShown={isFoldersSidebarShown} isStoryRibbonShown={isStoryRibbonShown} withTags /> @@ -381,12 +248,13 @@ const ChatFolders: FC = ({ ref={ref} className={buildClassName( 'ChatFolders', - shouldRenderFolders && shouldHideFolderTabs && 'ChatFolders--tabs-hidden', + shouldRenderFolders && shouldHideFolderTabs && !isFoldersSidebarShown && 'ChatFolders--tabs-hidden', shouldRenderStoryRibbon && 'with-story-ribbon', + isFoldersSidebarShown && 'ChatFolders--tabs-sidebar-shown', )} > {shouldRenderStoryRibbon && } - {shouldRenderFolders ? ( + {shouldRenderFolders && !isFoldersSidebarShown ? ( = ({ isAccountFrozen, isMainList, withTags, + isFoldersSidebarShown, isStoryRibbonShown, foldersDispatch, }) => { @@ -234,6 +236,7 @@ const ChatList: FC = ({ onDragEnter={handleChatDragEnter} onDragLeave={onDragLeave} withTags={withTags} + isFoldersSidebarShown={isFoldersSidebarShown} /> ); }); @@ -269,6 +272,7 @@ const ChatList: FC = ({ archiveSettings={archiveSettings} onClick={handleArchivedClick} onDragEnter={handleArchivedDragEnter} + isFoldersSidebarShown={isFoldersSidebarShown} /> )} {viewportIds?.length ? ( diff --git a/src/components/left/main/ChatTags.tsx b/src/components/left/main/ChatTags.tsx index 883d3dc72..17689afa8 100644 --- a/src/components/left/main/ChatTags.tsx +++ b/src/components/left/main/ChatTags.tsx @@ -1,6 +1,6 @@ -import { memo } from '../../../lib/teact/teact'; +import { memo, useCallback } from '@teact'; -import type { ApiChatFolder } from '../../../api/types'; +import { type ApiChatFolder, ApiMessageEntityTypes } from '../../../api/types'; import buildClassName from '../../../util/buildClassName'; import { REM } from '../../common/helpers/mediaDimensions'; @@ -16,12 +16,14 @@ const CUSTOM_EMOJI_SIZE = 0.875 * REM; type OwnProps = { orderedFolderIds?: number[]; chatFoldersById?: Record; + isFoldersSidebarShown?: boolean; itemClassName?: string; }; const ChatTags = ({ orderedFolderIds, chatFoldersById, + isFoldersSidebarShown, itemClassName, }: OwnProps) => { if (!orderedFolderIds) { @@ -31,6 +33,31 @@ const ChatTags = ({ const visibleFolderIds = orderedFolderIds.slice(0, MAX_VISIBLE_TAGS); const remainingCount = orderedFolderIds.length - visibleFolderIds.length; + const getFolderTitle = useCallback((folder: ApiChatFolder) => { + let text = folder.title.text; + let entities = folder.title.entities; + + if (isFoldersSidebarShown) { + const currentCustomEmoji = folder.title.entities?.find( + (entity) => entity.type === ApiMessageEntityTypes.CustomEmoji && entity.offset === 0); + if (currentCustomEmoji) { + const { offset, length } = currentCustomEmoji; + + text = folder.title.text.replace(folder.title.text.substring(offset, offset + length), ''); + entities = folder.title.entities?.filter((entity) => entity.offset !== offset).map((entity) => ({ + ...entity, + offset: entity.offset - length, + })); + } + } + return renderTextWithEntities({ + text, + entities, + noCustomEmojiPlayback: folder.noTitleAnimations, + emojiSize: CUSTOM_EMOJI_SIZE, + }); + }, [isFoldersSidebarShown]); + return (
{visibleFolderIds.map((folderId) => { @@ -44,12 +71,7 @@ const ChatTags = ({ itemClassName, )} > - {renderTextWithEntities({ - text: folder.title.text, - entities: folder.title.entities, - noCustomEmojiPlayback: folder.noTitleAnimations, - emojiSize: CUSTOM_EMOJI_SIZE, - })} + {getFolderTitle(folder)}
); })} diff --git a/src/components/left/main/LeftMain.scss b/src/components/left/main/LeftMain.scss index 2351799f2..ef9477894 100644 --- a/src/components/left/main/LeftMain.scss +++ b/src/components/left/main/LeftMain.scss @@ -47,6 +47,10 @@ opacity: 0.25; } + &--tabs-sidebar-shown .chat-list { + padding-top: 0; + } + .Tab { flex: 0 0 auto; } diff --git a/src/components/left/main/LeftMain.tsx b/src/components/left/main/LeftMain.tsx index 84b0caef5..63c8699a9 100644 --- a/src/components/left/main/LeftMain.tsx +++ b/src/components/left/main/LeftMain.tsx @@ -44,6 +44,7 @@ type OwnProps = { onTopicSearch: NoneToVoidFunction; isAccountFrozen?: boolean; onReset: () => void; + isFoldersSidebarShown?: boolean; }; const TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2; @@ -66,8 +67,9 @@ const LeftMain: FC = ({ onReset, onTopicSearch, isAccountFrozen, + isFoldersSidebarShown, }) => { - const { closeForumPanel, openLeftColumnContent } = getActions(); + const { openLeftColumnContent } = getActions(); const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV); const [tauriUpdate, setTauriUpdate] = useState(); const [isTauriUpdateDownloading, setIsTauriUpdateDownloading] = useState(false); @@ -109,19 +111,10 @@ const LeftMain: FC = ({ }, BUTTON_CLOSE_DELAY_MS); }); - const handleSelectSettings = useLastCallback(() => { - openLeftColumnContent({ contentKey: LeftColumnContent.Settings }); - }); - const handleSelectContacts = useLastCallback(() => { openLeftColumnContent({ contentKey: LeftColumnContent.Contacts }); }); - const handleSelectArchived = useLastCallback(() => { - openLeftColumnContent({ contentKey: LeftColumnContent.Archived }); - closeForumPanel(); - }); - const handleUpdateClick = useLastCallback(async () => { if (tauriUpdate) { try { @@ -198,12 +191,10 @@ const LeftMain: FC = ({ content={content} contactsFilter={contactsFilter} onSearchQuery={onSearchQuery} - onSelectSettings={handleSelectSettings} - onSelectContacts={handleSelectContacts} - onSelectArchived={handleSelectArchived} onReset={onReset} shouldSkipTransition={shouldSkipTransition} isClosingSearch={isClosingSearch} + isFoldersSidebarShown={isFoldersSidebarShown} /> = ({ shouldHideFolderTabs={isForumPanelVisible} foldersDispatch={foldersDispatch} isForumPanelOpen={isForumPanelVisible} + isFoldersSidebarShown={isFoldersSidebarShown} /> ); case LeftColumnContent.GlobalSearch: diff --git a/src/components/left/main/LeftMainHeader.scss b/src/components/left/main/LeftMainHeader.scss index c424b31d1..daadb1de9 100644 --- a/src/components/left/main/LeftMainHeader.scss +++ b/src/components/left/main/LeftMainHeader.scss @@ -3,6 +3,12 @@ #LeftMainHeader { position: relative; + .main-menu { + width: 2.5rem; + /* stylelint-disable-next-line plugin/no-low-performance-animation-properties */ + transition: width var(--layer-transition); + } + .DropdownMenuFiller { width: 2.5rem; height: 2.5rem; @@ -85,6 +91,29 @@ } } + .hide-menu-button { + overflow: hidden; + width: 0; + visibility: hidden; + .animated-menu-icon { + &::before { + transform: rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem); + } + + &::after { + transform: rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem); + } + } + } + + .forum-search-button { + margin-left: 0.75rem; + } + + .SearchInput--no-left-margin { + margin-left: 0; + } + .MenuItem .Toggle { margin-inline-start: auto; } @@ -106,11 +135,7 @@ .extra-spacing { position: relative; - margin-left: 0.8125rem; - - body.is-tauri.is-macos #Main:not(.is-fullscreen) & { - margin-left: 0.5rem; - } + margin-left: 0.5rem; } .StatusButton { diff --git a/src/components/left/main/LeftMainHeader.tsx b/src/components/left/main/LeftMainHeader.tsx index f700a1f0d..908404c0d 100644 --- a/src/components/left/main/LeftMainHeader.tsx +++ b/src/components/left/main/LeftMainHeader.tsx @@ -8,15 +8,11 @@ import type { GlobalState } from '../../../global/types'; import type { ThemeKey } from '../../../types'; import { LeftColumnContent, SettingsScreens } from '../../../types'; -import { - APP_NAME, - DEBUG, - IS_BETA, -} from '../../../config'; import { selectCanSetPasscode, selectCurrentMessageList, selectIsCurrentUserPremium, + selectIsForumPanelOpen, selectTabState, selectTheme, } from '../../../global/selectors'; @@ -29,23 +25,19 @@ import { formatDateToString } from '../../../util/dates/dateFormat'; import useAppLayout from '../../../hooks/useAppLayout'; import useConnectionStatus from '../../../hooks/useConnectionStatus'; -import useFlag from '../../../hooks/useFlag'; import { useHotkeys } from '../../../hooks/useHotkeys'; import useLang from '../../../hooks/useLang'; import useLastCallback from '../../../hooks/useLastCallback'; import useOldLang from '../../../hooks/useOldLang'; -import { useFullscreenStatus } from '../../../hooks/window/useFullscreen'; -import useLeftHeaderButtonRtlForumTransition from './hooks/useLeftHeaderButtonRtlForumTransition'; import Icon from '../../common/icons/Icon'; +import MainMenuDropdown from '../../common/MainMenuDropdown'; import PeerChip from '../../common/PeerChip'; import StoryToggler from '../../story/StoryToggler'; import Button from '../../ui/Button'; -import DropdownMenu from '../../ui/DropdownMenu'; import SearchInput from '../../ui/SearchInput'; import ShowTransition from '../../ui/ShowTransition'; import ConnectionStatusOverlay from '../ConnectionStatusOverlay'; -import LeftSideMenuItems from './LeftSideMenuItems'; import StatusButton from './StatusButton'; import './LeftMainHeader.scss'; @@ -56,33 +48,32 @@ type OwnProps = { contactsFilter: string; isClosingSearch?: boolean; shouldSkipTransition?: boolean; + isFoldersSidebarShown?: boolean; onSearchQuery: (query: string) => void; - onSelectSettings: NoneToVoidFunction; - onSelectContacts: NoneToVoidFunction; - onSelectArchived: NoneToVoidFunction; onReset: NoneToVoidFunction; }; -type StateProps = - { - searchQuery?: string; - isLoading: boolean; - globalSearchChatId?: string; - searchDate?: number; - theme: ThemeKey; - isMessageListOpen: boolean; - isCurrentUserPremium?: boolean; - isConnectionStatusMinimized?: boolean; - areChatsLoaded?: boolean; - hasPasscode?: boolean; - canSetPasscode?: boolean; - } - & Pick; +type StateProps = { + searchQuery?: string; + isLoading: boolean; + globalSearchChatId?: string; + searchDate?: number; + theme: ThemeKey; + isMessageListOpen: boolean; + isCurrentUserPremium?: boolean; + isConnectionStatusMinimized?: boolean; + areChatsLoaded?: boolean; + hasPasscode?: boolean; + canSetPasscode?: boolean; + isForumPanelOpen?: boolean; +} & Pick; const CLEAR_DATE_SEARCH_PARAM = { date: undefined }; const CLEAR_CHAT_SEARCH_PARAM = { id: undefined }; -const LeftMainHeader: FC = ({ +const IS_WITH_WINDOW_BUTTONS = IS_TAURI && IS_MAC_OS; + +const LeftMainHeader = ({ shouldHideSearch, content, contactsFilter, @@ -102,12 +93,11 @@ const LeftMainHeader: FC = ({ areChatsLoaded, hasPasscode, canSetPasscode, + isFoldersSidebarShown, + isForumPanelOpen, onSearchQuery, - onSelectSettings, - onSelectContacts, - onSelectArchived, onReset, -}) => { +}: OwnProps & StateProps) => { const { setGlobalSearchDate, setSharedSettingOption, @@ -115,17 +105,18 @@ const LeftMainHeader: FC = ({ lockScreen, openSettingsScreen, searchMessagesGlobal, + closeForumPanel, } = getActions(); const oldLang = useOldLang(); const lang = useLang(); const { isMobile } = useAppLayout(); - const [isBotMenuOpen, markBotMenuOpen, unmarkBotMenuOpen] = useFlag(); - const areContactsVisible = content === LeftColumnContent.Contacts; const hasMenu = content === LeftColumnContent.ChatList; + const isSearchButton = isForumPanelOpen && isFoldersSidebarShown && !IS_WITH_WINDOW_BUTTONS; + const selectedSearchDate = useMemo(() => { return searchDate ? formatDateToString(new Date(searchDate * 1000)) @@ -151,6 +142,10 @@ const LeftMainHeader: FC = ({ } }); + const handleForumSearchClick = useLastCallback(() => { + closeForumPanel(); + }); + useHotkeys(useMemo(() => (canSetPasscode ? { 'Ctrl+Shift+L': handleLockScreenHotkey, 'Alt+Shift+L': handleLockScreenHotkey, @@ -165,20 +160,24 @@ const LeftMainHeader: FC = ({ ripple={hasMenu && !isMobile} size="smaller" color="translucent" - className={isOpen ? 'active' : ''} + className={buildClassName(isOpen && 'active')} - onClick={hasMenu ? onTrigger : () => onReset()} - ariaLabel={hasMenu ? oldLang('AccDescrOpenMenu2') : 'Return to chat list'} + onClick={isSearchButton ? handleForumSearchClick : hasMenu ? onTrigger : () => onReset()} + ariaLabel={hasMenu ? lang('AriaLabelOpenMenu') : lang('AriaLabelBackChatList')} > -
+ ) : ( +
)} - /> ); - }, [hasMenu, isMobile, oldLang, onReset, shouldSkipTransition]); + }, [hasMenu, isSearchButton, isMobile, lang, onReset, shouldSkipTransition]); const handleSearchFocus = useLastCallback(() => { if (!searchQuery) { @@ -215,16 +214,6 @@ const LeftMainHeader: FC = ({ ? lang('SearchFriends') : lang('Search'); - const versionString = IS_BETA ? `${APP_VERSION} Beta (${APP_REVISION})` : (DEBUG ? APP_REVISION : APP_VERSION); - - const isFullscreen = useFullscreenStatus(); - - // Disable dropdown menu RTL animation for resize - const { - shouldDisableDropdownMenuTransitionRef, - handleDropdownMenuTransitionEnd, - } = useLeftHeaderButtonRtlForumTransition(shouldHideSearch); - const withStoryToggler = !isSearchFocused && !selectedSearchDate && !globalSearchChatId && !areContactsVisible; const searchContent = useMemo(() => { @@ -256,53 +245,28 @@ const LeftMainHeader: FC = ({ ); }, [globalSearchChatId, selectedSearchDate]); - const version = useMemo(() => { - let fullVersion = ''; - if (IS_TAURI && window.tauri.version) { - fullVersion = `Tauri ${window.tauri.version} | `; - } - - fullVersion += `${APP_NAME} ${versionString}`; - - return fullVersion; - }, [versionString]); - return (
{lang.isRtl &&
} - - - + /> ( connectionState, isSyncing, isFetchingDifference, } = global; const { isConnectionStatusMinimized } = selectSharedSettings(global); + const isForumPanelOpen = selectIsForumPanelOpen(global); return { searchQuery, @@ -380,6 +345,7 @@ export default memo(withGlobal( areChatsLoaded: Boolean(global.chats.listIds.active), hasPasscode: Boolean(global.passcode.hasPasscode), canSetPasscode: selectCanSetPasscode(global), + isForumPanelOpen, }; }, )(LeftMainHeader)); diff --git a/src/components/left/settings/folders/FolderIconPickerMenu.tsx b/src/components/left/settings/folders/FolderIconPickerMenu.tsx new file mode 100644 index 000000000..5a51df7a3 --- /dev/null +++ b/src/components/left/settings/folders/FolderIconPickerMenu.tsx @@ -0,0 +1,58 @@ +import { memo, useCallback } from '@teact'; + +import type { ApiSticker } from '../../../../api/types'; + +import { folderIconMap } from '../../../../util/folderIconMap'; + +import CustomEmojiPicker from '../../../common/CustomEmojiPicker'; +import Icon from '../../../common/icons/Icon'; +import Menu from '../../../ui/Menu'; + +export type OwnProps = { + isOpen: boolean; + onEmojiSelect: (emoji: string | ApiSticker) => void; + onClose: () => void; +}; + +const FolderIconPickerMenu = ({ + isOpen, + onEmojiSelect, + onClose, +}: OwnProps) => { + const handleEmojiSelect = useCallback((sticker: string | ApiSticker) => { + onEmojiSelect(sticker); + onClose(); + }, [onClose, onEmojiSelect]); + + return ( + +
+
+ { + Object.keys(folderIconMap).map((emoji) => ( +
handleEmojiSelect(emoji)}> + +
+ )) + } +
+ handleEmojiSelect(emoji)} + onContextMenuClick={onClose} + onContextMenuClose={onClose} + /> +
+
+ ); +}; + +export default memo(FolderIconPickerMenu); diff --git a/src/components/left/settings/folders/SettingsFolders.scss b/src/components/left/settings/folders/SettingsFolders.scss index 1d7b54c10..7865332a0 100644 --- a/src/components/left/settings/folders/SettingsFolders.scss +++ b/src/components/left/settings/folders/SettingsFolders.scss @@ -99,7 +99,7 @@ } .settings-sortable-item .Button { - margin-right: -1rem; + margin-inline-end: -1rem; &:hover, &:active { background-color: transparent !important; @@ -148,7 +148,7 @@ } .color-picker-item { - cursor: pointer; + cursor: var(--custom-cursor, pointer); flex-shrink: 0; @@ -214,7 +214,7 @@ .settings-folders-color-circle { position: absolute; top: 50%; - right: 2.5rem; + inset-inline-end: 2.5rem; transform: translateY(-50%); width: 1.25rem; @@ -223,3 +223,42 @@ background-color: var(--accent-color); } + +.settings-folders-input-container { + position: relative; + display: flex; + align-items: center; + align-self: stretch; +} + +.settings-folders-input-with-icon .form-control { + padding-inline-end: 3rem; +} + +.settings-folders-icon-picker { + --custom-emoji-size: 2rem; + + position: absolute; + inset-inline-end: 0.5rem; + font-size: 2rem; + color: var(--color-text-secondary); +} + +.settings-folders-icon-picker-button { + cursor: var(--custom-cursor, pointer); + display: flex; + align-items: center; + justify-content: center; +} + +.settings-folders-icon-picker-menu .bubble { + --offset-y: 16rem !important; + --offset-x: 6rem; +} + +.settings-folders-icon-picker-menu-folders { + display: flex; + justify-content: space-between; + border-bottom: 1px solid var(--color-borders); + color: var(--color-text-secondary); +} diff --git a/src/components/left/settings/folders/SettingsFolders.tsx b/src/components/left/settings/folders/SettingsFolders.tsx index 87b57620a..0e7ef2aed 100644 --- a/src/components/left/settings/folders/SettingsFolders.tsx +++ b/src/components/left/settings/folders/SettingsFolders.tsx @@ -7,6 +7,7 @@ import type { FolderEditDispatch, FoldersState } from '../../../../hooks/reducer import { SettingsScreens } from '../../../../types'; import { selectChatFilters } from '../../../../hooks/reducers/useFoldersReducer'; +import useAppLayout from '../../../../hooks/useAppLayout'; import SettingsFoldersChatFilters from './SettingsFoldersChatFilters'; import SettingsFoldersEdit, { ERROR_NO_CHATS, ERROR_NO_TITLE } from './SettingsFoldersEdit'; @@ -34,6 +35,8 @@ const SettingsFolders: FC = ({ isActive, onReset, }) => { + const { isMobile } = useAppLayout(); + const { openShareChatFolderModal, editChatFolder, @@ -164,6 +167,7 @@ const SettingsFolders: FC = ({ SettingsScreens.FoldersExcludedChats, ].includes(shownScreen)} onReset={onReset} + isMobile={isMobile} /> ); case SettingsScreens.FoldersCreateFolder: @@ -186,6 +190,7 @@ const SettingsFolders: FC = ({ isOnlyInvites={currentScreen === SettingsScreens.FoldersEditFolderInvites} onBack={onReset} onSaveFolder={handleSaveFolder} + isMobile={isMobile} /> ); case SettingsScreens.FoldersIncludedChats: diff --git a/src/components/left/settings/folders/SettingsFoldersEdit.tsx b/src/components/left/settings/folders/SettingsFoldersEdit.tsx index 06225119b..867b54e10 100644 --- a/src/components/left/settings/folders/SettingsFoldersEdit.tsx +++ b/src/components/left/settings/folders/SettingsFoldersEdit.tsx @@ -5,14 +5,20 @@ import { } from '../../../../lib/teact/teact'; import { getActions, getGlobal, withGlobal } from '../../../../global'; -import type { ApiChatlistExportedInvite } from '../../../../api/types'; import type { FolderEditDispatch, FoldersState, } from '../../../../hooks/reducers/useFoldersReducer'; +import { + type ApiChatlistExportedInvite, + type ApiMessageEntity, + type ApiMessageEntityCustomEmoji, + ApiMessageEntityTypes, + type ApiSticker, +} from '../../../../api/types'; import { FOLDER_TITLE_MAX_LENGTH, STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config'; -import { selectCanShareFolder, selectIsCurrentUserPremium } from '../../../../global/selectors'; +import { selectCanShareFolder, selectCustomEmoji, selectIsCurrentUserPremium } from '../../../../global/selectors'; import { selectCurrentLimit } from '../../../../global/selectors/limits'; import buildClassName from '../../../../util/buildClassName'; import { isUserId } from '../../../../util/entities/ids'; @@ -24,16 +30,19 @@ import { renderTextWithEntities } from '../../../common/helpers/renderTextWithEn import { selectChatFilters } from '../../../../hooks/reducers/useFoldersReducer'; import useHistoryBack from '../../../../hooks/useHistoryBack'; +import useLastCallback from '../../../../hooks/useLastCallback'; import useOldLang from '../../../../hooks/useOldLang'; import { getPeerColorClass } from '../../../../hooks/usePeerColor'; import AnimatedIconWithPreview from '../../../common/AnimatedIconWithPreview'; +import FolderIcon from '../../../common/FolderIcon'; import GroupChatInfo from '../../../common/GroupChatInfo'; import Icon from '../../../common/icons/Icon'; import PrivateChatInfo from '../../../common/PrivateChatInfo'; import FloatingActionButton from '../../../ui/FloatingActionButton'; import InputText from '../../../ui/InputText'; import ListItem from '../../../ui/ListItem'; +import FolderIconPickerMenu from './FolderIconPickerMenu'; type OwnProps = { state: FoldersState; @@ -47,6 +56,7 @@ type OwnProps = { onReset: () => void; onBack: () => void; onSaveFolder: (cb?: VoidFunction) => void; + isMobile?: boolean; }; type StateProps = { @@ -69,6 +79,8 @@ const FOLDER_COLORS = [0, 1, 2, 3, 4, 5, 6]; export const ERROR_NO_TITLE = 'Please provide a title for this folder.'; export const ERROR_NO_CHATS = 'ChatList.Filter.Error.Empty'; +const DEFAULT_FOLDER_ICON = '🗂'; + const SettingsFoldersEdit: FC = ({ state, dispatch, @@ -89,6 +101,7 @@ const SettingsFoldersEdit: FC = ({ chatListCount, onSaveFolder, isCurrentUserPremium, + isMobile, }) => { const { loadChatlistInvites, @@ -102,6 +115,7 @@ const SettingsFoldersEdit: FC = ({ const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false); const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false); + const [isIconPickerMenuOpen, setIsIconPickerMenuOpen] = useState(false); useEffect(() => { if (isRemoved) { @@ -159,10 +173,65 @@ const SettingsFoldersEdit: FC = ({ onBack, }); + const currentCustomEmoji = useMemo(() => state.folder.title.entities?.find( + (entity): entity is ApiMessageEntityCustomEmoji => + entity.type === ApiMessageEntityTypes.CustomEmoji && entity.offset === 0, + ), [state.folder.title]); + + const folderTitleMaxLength = useMemo(() => { + return FOLDER_TITLE_MAX_LENGTH - (currentCustomEmoji ? currentCustomEmoji.length : 0); + }, [currentCustomEmoji]); + + const setEmoticon = useCallback((_emoticon: string | ApiSticker) => { + let text = state.folder.title.text; + const entities: ApiMessageEntity[] = []; + let emoticon = DEFAULT_FOLDER_ICON; + if (currentCustomEmoji) { + const { offset, length } = currentCustomEmoji; + text = text.replace(text.substring(offset, offset + length), ''); + } + if (typeof _emoticon === 'string') { + emoticon = _emoticon; + } else { + const { id, emoji } = _emoticon; + + entities.push({ + type: ApiMessageEntityTypes.CustomEmoji, + documentId: id, + offset: 0, + length: emoji?.length || 2, + }); + if (emoji) { + text = `${emoji}${text}`; + emoticon = emoji; + if (text.length > folderTitleMaxLength) { + text = text.slice(0, folderTitleMaxLength); + } + } + } + + dispatch({ type: 'setEmoticon', payload: emoticon }); + dispatch({ type: 'setTitle', payload: { + text, + entities, + } }); + }, [dispatch, currentCustomEmoji, state.folder.title, folderTitleMaxLength]); + const handleChange = useCallback((event: React.ChangeEvent) => { const { currentTarget } = event; - dispatch({ type: 'setTitle', payload: currentTarget.value.trim() }); - }, [dispatch]); + + let title = currentTarget.value; + + if (currentCustomEmoji) { + const { emoji } = selectCustomEmoji(getGlobal(), currentCustomEmoji.documentId); + title = `${emoji}${title}`; + } + + dispatch({ type: 'setTitle', payload: { + text: title, + entities: currentCustomEmoji ? [currentCustomEmoji] : [], + } }); + }, [dispatch, currentCustomEmoji]); const handleSubmit = useCallback(() => { dispatch({ type: 'setIsLoading', payload: true }); @@ -287,6 +356,27 @@ const SettingsFoldersEdit: FC = ({ ); } + const handleEmojiSelect = useLastCallback((emoji: string | ApiSticker) => { + setEmoticon(emoji); + }); + + const handleIconPickerClose = useLastCallback(() => { + setIsIconPickerMenuOpen(false); + }); + + const handleIconPickerOpen = useLastCallback(() => { + setIsIconPickerMenuOpen(true); + }); + + const titleText = useMemo(() => { + let title = state.folder.title.text; + if (currentCustomEmoji) { + const { offset, length } = currentCustomEmoji; + title = title.substring(offset + length, title.length); + } + return title; + }, [state.folder.title.text, currentCustomEmoji]); + return (
@@ -303,15 +393,36 @@ const SettingsFoldersEdit: FC = ({ {lang('FilterIncludeInfo')}

)} +
+ - + {!isMobile && ( +
+
+ +
+ +
+ )} +
{!isOnlyInvites && ( diff --git a/src/components/left/settings/folders/SettingsFoldersMain.tsx b/src/components/left/settings/folders/SettingsFoldersMain.tsx index e90bb3484..39dbb04fa 100644 --- a/src/components/left/settings/folders/SettingsFoldersMain.tsx +++ b/src/components/left/settings/folders/SettingsFoldersMain.tsx @@ -5,6 +5,7 @@ import { import { getActions, withGlobal } from '../../../../global'; import type { ApiChatFolder } from '../../../../api/types'; +import type { TabsPosition } from '../../../../types'; import { ALL_FOLDER_ID, STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config'; import { getFolderDescriptionText } from '../../../../global/helpers'; @@ -20,6 +21,7 @@ import { renderTextWithEntities } from '../../../common/helpers/renderTextWithEn import { useFolderManagerForChatsCount } from '../../../../hooks/useFolderManager'; import useHistoryBack from '../../../../hooks/useHistoryBack'; import useLang from '../../../../hooks/useLang'; +import useLastCallback from '../../../../hooks/useLastCallback'; import { getPeerColorClass } from '../../../../hooks/usePeerColor'; import usePreviousDeprecated from '../../../../hooks/usePreviousDeprecated'; @@ -30,12 +32,14 @@ import Checkbox from '../../../ui/Checkbox'; import Draggable from '../../../ui/Draggable'; import ListItem from '../../../ui/ListItem'; import Loading from '../../../ui/Loading'; +import RadioGroup from '../../../ui/RadioGroup'; type OwnProps = { isActive?: boolean; onCreateFolder: () => void; onEditFolder: (folder: ApiChatFolder) => void; onReset: () => void; + isMobile?: boolean; }; type StateProps = { @@ -45,6 +49,7 @@ type StateProps = { maxFolders: number; isPremium?: boolean; areTagsEnabled?: boolean; + tabsPosition: TabsPosition; }; type SortState = { @@ -67,6 +72,8 @@ const SettingsFoldersMain: FC = ({ recommendedChatFolders, maxFolders, areTagsEnabled, + tabsPosition, + isMobile, }) => { const { loadRecommendedChatFolders, @@ -76,6 +83,7 @@ const SettingsFoldersMain: FC = ({ sortChatFolders, toggleDialogFilterTags, openPremiumModal, + setSharedSettingOption, } = getActions(); const [state, setState] = useState({ @@ -207,6 +215,10 @@ const SettingsFoldersMain: FC = ({ }); }, [sortChatFolders]); + const handleTabsPositionChange = useLastCallback((value: string) => { + setSharedSettingOption({ tabsPosition: value as TabsPosition }); + }); + const canCreateNewFolder = useMemo(() => { return !isPremium || Object.keys(foldersById).length < maxFolders - 1; }, [foldersById, isPremium, maxFolders]); @@ -411,6 +423,24 @@ const SettingsFoldersMain: FC = ({ {!isPremium && }
+ {!isMobile && ( +
+

{lang('TabsPosition')}

+ + +
+ )}
); }; @@ -431,6 +461,7 @@ export default memo(withGlobal( recommendedChatFolders, maxFolders: selectCurrentLimit(global, 'dialogFilters'), areTagsEnabled, + tabsPosition: global.sharedState.settings.tabsPosition, }; }, )(SettingsFoldersMain)); diff --git a/src/components/main/FoldersSidebar.module.scss b/src/components/main/FoldersSidebar.module.scss new file mode 100644 index 000000000..7522d105a --- /dev/null +++ b/src/components/main/FoldersSidebar.module.scss @@ -0,0 +1,94 @@ +.root { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + + width: var(--tabs-sidebar-width); + height: 100%; + + background-color: var(--color-background-sidebar); + + :global { + .Menu .bubble { + --offset-y: 3.5rem; + --offset-x: 1rem; + + overflow-y: auto; + min-width: 17rem; + max-height: calc(100 * var(--vh) - 3.5rem); + } + .MenuItem .Toggle { + margin-inline-start: auto; + } + + .MenuItem.compact .Toggle { + transform: scale(0.75); + margin-inline-end: -0.125rem; + } + + .MenuItem.compact .Switcher { + transform: scale(0.75); + } + .account-menu-item { + --custom-emoji-size: 1rem; + + &-test { + position: absolute; + z-index: 1; + bottom: 0.0625rem; + left: 2.875rem; + + font-size: 0.5rem; + font-weight: var(--font-weight-medium); + color: var(--color-text-secondary); + } + + .account-avatar { + margin-inline: 0.375rem 1.125rem; + } + + .fullName { + margin: 0; + padding-top: 0.1875rem; + font-size: 1em; + line-height: 1; + } + } + } +} + +.tabs { + overflow-y: auto; + display: flex; + flex-direction: column; + flex-grow: 1; + + padding-inline: 0; + + font-size: 0.625rem; + line-height: 0.75rem; + + background-color: var(--color-background-sidebar); +} + +.icon { + font-size: 1.5rem; + color: var(--color-text-secondary); +} + +.menuButton { + width: var(--tabs-sidebar-width); + height: 3.5rem; + border-radius: 0; +} + +.divider { + width: 100%; + height: 1px; + background-color: var(--color-interactive-buffered); +} + +.hideMenuButton { + visibility: hidden; +} diff --git a/src/components/main/FoldersSidebar.tsx b/src/components/main/FoldersSidebar.tsx new file mode 100644 index 000000000..128aa7ae2 --- /dev/null +++ b/src/components/main/FoldersSidebar.tsx @@ -0,0 +1,206 @@ +import { memo, useEffect, useMemo, useRef } from '@teact'; +import { getActions, withGlobal } from '../../global'; + +import type { ApiChatFolder, ApiChatlistExportedInvite, ApiMessageEntityCustomEmoji } from '../../api/types'; +import { LeftColumnContent, SettingsScreens } from '../../types'; + +import { selectTabState } from '../../global/selectors'; +import { selectCurrentLimit } from '../../global/selectors/limits'; +import { IS_TAURI } from '../../util/browser/globalEnvironment'; +import { IS_MAC_OS } from '../../util/browser/windowEnvironment'; +import buildClassName from '../../util/buildClassName'; + +import useFolderTabs from '../../hooks/useFolderTabs'; +import useLang from '../../hooks/useLang'; +import useLastCallback from '../../hooks/useLastCallback'; +import useScrolledState from '../../hooks/useScrolledState'; + +import FolderIcon from '../common/FolderIcon'; +import Icon from '../common/icons/Icon'; +import MainMenuDropdown from '../common/MainMenuDropdown'; +import Button from '../ui/Button'; +import Folder from '../ui/Folder'; + +import styles from './FoldersSidebar.module.scss'; + +type StateProps = { + chatFoldersById: Record; + folderInvitesById: Record; + orderedFolderIds?: number[]; + activeChatFolder: number; + maxFolders: number; + maxChatLists: number; + maxFolderInvites: number; +}; + +type OwnProps = { + isActive: boolean; +}; + +const FIRST_FOLDER_INDEX = 0; + +const FoldersSidebar = ({ + chatFoldersById, + orderedFolderIds, + activeChatFolder, + maxFolders, + maxChatLists, + folderInvitesById, + maxFolderInvites, + isActive, +}: OwnProps & StateProps) => { + const { + loadChatFolders, + setActiveChatFolder, + openLeftColumnContent, + openSettingsScreen, + } = getActions(); + + const tabsRef = useRef(); + + useEffect(() => { + loadChatFolders(); + }, []); + + const scrollChatListToTop = useLastCallback(() => { + const activeList = document.querySelector('#LeftColumn .chat-list.Transition_slide-active'); + activeList?.scrollTo({ + top: 0, + behavior: 'smooth', + }); + }); + + const { folderTabs } = useFolderTabs({ + sidebarMode: true, + orderedFolderIds, + chatFoldersById, + maxFolders, + maxChatLists, + folderInvitesById, + maxFolderInvites, + }); + + const { + handleScroll, + isAtBeginning, + isAtEnd, + } = useScrolledState(); + + const lang = useLang(); + + const handleSwitchTab = useLastCallback((index: number) => { + openLeftColumnContent({ contentKey: LeftColumnContent.ChatList }); + openSettingsScreen({ screen: undefined }); + setActiveChatFolder({ activeChatFolder: index }, { forceOnHeavyAnimation: true }); + if (activeChatFolder === index) { + scrollChatListToTop(); + } + + tabsRef.current?.children[index]?.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }); + + const handleSettingsClick = useLastCallback(() => { + openLeftColumnContent({ contentKey: LeftColumnContent.Settings }); + openSettingsScreen({ screen: SettingsScreens.Folders }); + }); + + // Prevent `activeTab` pointing at non-existing folder after update + useEffect(() => { + if (!folderTabs?.length) { + return; + } + + if (activeChatFolder >= folderTabs.length) { + setActiveChatFolder({ activeChatFolder: FIRST_FOLDER_INDEX }); + } + }, [activeChatFolder, folderTabs, setActiveChatFolder]); + + const MainButton = useMemo(() => { + return ({ onTrigger, isOpen }: { onTrigger: () => void; isOpen?: boolean }) => ( + + ); + }, [lang]); + + if (!isActive) { + return undefined; + } + + return ( +
+ + {!isAtBeginning &&
} +
+ {folderTabs?.map((tab, i) => ( + + )} + /> + ))} +
+ {!isAtEnd &&
} + +
+ ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { + chatFolders: { + byId: chatFoldersById, + orderedIds: orderedFolderIds, + invites: folderInvitesById, + }, + } = global; + const { activeChatFolder } = selectTabState(global); + + return { + chatFoldersById, + folderInvitesById, + orderedFolderIds, + activeChatFolder, + maxFolders: selectCurrentLimit(global, 'dialogFilters'), + maxFolderInvites: selectCurrentLimit(global, 'chatlistInvites'), + maxChatLists: selectCurrentLimit(global, 'chatlistJoined'), + }; + }, +)(FoldersSidebar)); diff --git a/src/components/main/Main.scss b/src/components/main/Main.scss index f01cdb497..8c873cb09 100644 --- a/src/components/main/Main.scss +++ b/src/components/main/Main.scss @@ -3,6 +3,10 @@ height: 100%; text-align: left; + &.tabs-sidebar-visible { + grid-template-columns: auto auto 1fr; + } + @media (min-width: 1276px) { position: relative; } @@ -212,3 +216,12 @@ } } } + +@media (max-width: 925px) { + .tabs-sidebar-visible { + #LeftColumn { + left: var(--tabs-sidebar-width) !important; + width: 21.5rem !important; + } + } +} diff --git a/src/components/main/Main.tsx b/src/components/main/Main.tsx index 041d379a2..21d079e3f 100644 --- a/src/components/main/Main.tsx +++ b/src/components/main/Main.tsx @@ -11,9 +11,10 @@ import { getActions, getGlobal, withGlobal } from '../../global'; import type { ApiChatFolder, ApiLimitTypeWithModal, ApiUser } from '../../api/types'; import type { TabState } from '../../global/types'; -import { BASE_EMOJI_KEYWORD_LANG, DEBUG, INACTIVE_MARKER } from '../../config'; +import { BASE_EMOJI_KEYWORD_LANG, DEBUG, INACTIVE_MARKER, TABS_POSITION_LEFT } from '../../config'; import { requestNextMutation } from '../../lib/fasterdom/fasterdom'; import { + selectAreFoldersPresent, selectCanAnimateInterface, selectChatFolder, selectChatMessage, @@ -79,6 +80,7 @@ import DeleteFolderDialog from './DeleteFolderDialog.async'; import Dialogs from './Dialogs.async'; import DownloadManager from './DownloadManager'; import DraftRecipientPicker from './DraftRecipientPicker.async'; +import FoldersSidebar from './FoldersSidebar'; import ForwardRecipientPicker from './ForwardRecipientPicker.async'; import GameModal from './GameModal'; import HistoryCalendar from './HistoryCalendar.async'; @@ -145,6 +147,7 @@ type StateProps = { isSynced?: boolean; isAccountFrozen?: boolean; isAppConfigLoaded?: boolean; + isFoldersSidebarShown: boolean; }; const APP_OUTDATED_TIMEOUT_MS = 5 * 60 * 1000; // 5 min @@ -199,6 +202,7 @@ const Main = ({ currentUserId, isAccountFrozen, isAppConfigLoaded, + isFoldersSidebarShown, }: OwnProps & StateProps) => { const { initMain, @@ -518,6 +522,7 @@ const Main = ({ isNarrowMessageList && 'narrow-message-list', shouldSkipHistoryAnimations && 'history-animation-disabled', isFullscreen && 'is-fullscreen', + isFoldersSidebarShown && 'tabs-sidebar-visible', ); const handleBlur = useLastCallback(() => { @@ -549,7 +554,8 @@ const Main = ({ return (
- + + @@ -637,7 +643,7 @@ export default memo(withGlobal( deleteFolderDialogModal, } = selectTabState(global); - const { wasTimeFormatSetManually } = selectSharedSettings(global); + const { wasTimeFormatSetManually, tabsPosition } = selectSharedSettings(global); const gameMessage = openedGame && selectChatMessage(global, openedGame.chatId, openedGame.messageId); const gameTitle = gameMessage?.content.game?.title; @@ -694,6 +700,7 @@ export default memo(withGlobal( isSynced: global.isSynced, isAccountFrozen, isAppConfigLoaded: global.isAppConfigLoaded, + isFoldersSidebarShown: tabsPosition === TABS_POSITION_LEFT && !isMobile && selectAreFoldersPresent(global), }; }, )(Main)); diff --git a/src/components/middle/MessageList.tsx b/src/components/middle/MessageList.tsx index 74ee4db7a..340fae4ef 100644 --- a/src/components/middle/MessageList.tsx +++ b/src/components/middle/MessageList.tsx @@ -491,6 +491,7 @@ const MessageList = ({ }); } else { clearTimeout(scrollSnapDisabledTimerRef.current); + scrollSnapDisabledTimerRef.current = undefined; requestMutation(() => { removeExtraClass(container, BOTTOM_SNAP_CLASS); }); @@ -512,7 +513,10 @@ const MessageList = ({ updateStickyDates(container); } - updateBottomSnapClass(); + // Check if scroll should be snapped, but only if there's no new message animation in progress + if (scrollSnapDisabledTimerRef.current === undefined) { + updateBottomSnapClass(); + } runDebouncedForScroll(() => { const global = getGlobal(); @@ -658,12 +662,14 @@ const MessageList = ({ if (wasMessageAdded) { clearTimeout(scrollSnapDisabledTimerRef.current); + scrollSnapDisabledTimerRef.current = undefined; removeExtraClass(container, BOTTOM_SNAP_CLASS); scrollSnapDisabledTimerRef.current = window.setTimeout(() => { requestMutation(() => { addExtraClass(container, BOTTOM_SNAP_CLASS); + scrollSnapDisabledTimerRef.current = undefined; }); }, MESSAGE_ANIMATION_DURATION); } diff --git a/src/components/modals/paidReaction/PaidReactionModal.tsx b/src/components/modals/paidReaction/PaidReactionModal.tsx index d000443bd..e290de7b0 100644 --- a/src/components/modals/paidReaction/PaidReactionModal.tsx +++ b/src/components/modals/paidReaction/PaidReactionModal.tsx @@ -208,7 +208,7 @@ const PaidReactionModal = ({ color="translucent" className={buildClassName(styles.sendAsPeerMenuButton, isOpen ? 'active' : '')} onClick={onTrigger} - ariaLabel={lang('AccDescrOpenMenu2')} + ariaLabel={lang('AriaLabelOpenMenu')} > = ({ color="translucent" className={isOpen ? 'active' : ''} onClick={onTrigger} - ariaLabel={lang('AccDescrOpenMenu2')} + ariaLabel={lang('AriaLabelOpenMenu')} > diff --git a/src/components/story/Story.tsx b/src/components/story/Story.tsx index f10d23da4..a7374af70 100644 --- a/src/components/story/Story.tsx +++ b/src/components/story/Story.tsx @@ -571,13 +571,13 @@ function Story({ color="translucent-white" onClick={onTrigger} className={buildClassName(styles.button, isOpen && 'active')} - ariaLabel={oldLang('AccDescrOpenMenu2')} + ariaLabel={lang('AriaLabelOpenMenu')} > ); }; - }, [isMobile, oldLang]); + }, [isMobile, lang]); function renderStoriesTabs() { return ( diff --git a/src/components/story/helpers/ribbonAnimation.ts b/src/components/story/helpers/ribbonAnimation.ts index 2155082bd..b07815e42 100644 --- a/src/components/story/helpers/ribbonAnimation.ts +++ b/src/components/story/helpers/ribbonAnimation.ts @@ -19,7 +19,7 @@ export function animateOpening(isArchived?: boolean) { cancelDelayedCallbacks(); const { - container, toggler, leftMainHeader, ribbonPeers, toggleAvatars, + container, toggler, leftMainHeader, ribbonPeers, toggleAvatars, sidebar, } = getHTMLElements(isArchived); if (!toggler || !toggleAvatars || !ribbonPeers || !container || !leftMainHeader) { @@ -28,6 +28,7 @@ export function animateOpening(isArchived?: boolean) { const { bottom: headerBottom, right: headerRight } = leftMainHeader.getBoundingClientRect(); const toTop = headerBottom + RIBBON_OFFSET; + const sidebarWidth = sidebar ? sidebar.getBoundingClientRect().width : 0; // Toggle avatars are in the reverse order const lastToggleAvatar = toggleAvatars[0]; @@ -57,10 +58,11 @@ export function animateOpening(isArchived?: boolean) { width: fromWidth, } = toggleAvatar.getBoundingClientRect(); - const { - left: toLeft, - width: toWidth, - } = peer.getBoundingClientRect(); + fromLeft -= sidebarWidth; + + const peerBounds = peer.getBoundingClientRect(); + const toLeft = peerBounds.left - sidebarWidth; + const toWidth = peerBounds.width; if (toLeft > headerRight) { return; @@ -164,13 +166,14 @@ export function animateClosing(isArchived?: boolean) { toggleAvatars, ribbonPeers, leftMainHeader, + sidebar, } = getHTMLElements(isArchived); if (!toggler || !toggleAvatars || !ribbonPeers || !container || !leftMainHeader) { return; } const { right: headerRight } = leftMainHeader.getBoundingClientRect(); - + const sidebarWidth = sidebar ? sidebar.getBoundingClientRect().width : 0; // Toggle avatars are in the reverse order const lastToggleAvatar = toggleAvatars[0]; const firstToggleAvatar = toggleAvatars[toggleAvatars.length - 1]; @@ -192,11 +195,11 @@ export function animateClosing(isArchived?: boolean) { if (!toggleAvatar) return; - const { - top: fromTop, - left: fromLeft, - width: fromWidth, - } = peer.getBoundingClientRect(); + const peerBounds = peer.getBoundingClientRect(); + + const fromTop = peerBounds.top; + const fromLeft = peerBounds.left - sidebarWidth; + const fromWidth = peerBounds.width; let { left: toLeft, @@ -204,6 +207,8 @@ export function animateClosing(isArchived?: boolean) { top: toTop, } = toggleAvatar.getBoundingClientRect(); + toLeft -= sidebarWidth; + if (fromLeft > headerRight) { return; } @@ -306,6 +311,7 @@ function getHTMLElements(isArchived?: boolean) { const leftMainHeader = container.querySelector('.left-header'); const ribbonPeers = ribbon?.querySelectorAll(`.${ribbonStyles.peer}`); const toggleAvatars = toggler?.querySelectorAll('.Avatar'); + const sidebar = document.getElementById('FoldersSidebar'); return { container, @@ -313,6 +319,7 @@ function getHTMLElements(isArchived?: boolean) { leftMainHeader, ribbonPeers, toggleAvatars, + sidebar, }; } diff --git a/src/components/ui/Folder.module.scss b/src/components/ui/Folder.module.scss new file mode 100644 index 000000000..a448412a4 --- /dev/null +++ b/src/components/ui/Folder.module.scss @@ -0,0 +1,115 @@ +.folder { + cursor: var(--custom-cursor, pointer); + + position: relative; + + display: flex; + flex-direction: column; + flex-shrink: 0; + gap: 0.375rem; + align-items: center; + justify-content: center; + + width: var(--tabs-sidebar-width); + min-height: 4.5rem; + padding-right: 0.25rem; + padding-left: 0.375rem; + border-radius: 0; + + &::before { + content: ''; + + position: absolute; + top: 0.625rem; + bottom: 0.625rem; + left: 0; + transform: translateX(-0.375rem) scaleY(0.5); + + width: 0.3125rem; + border-start-end-radius: var(--border-radius-default); + border-end-end-radius: var(--border-radius-default); + + background: var(--color-primary); + + transition: transform var(--layer-transition); + + body.no-page-transitions & { + transition: none; + } + } + + .inner { + --emoji-size: 0.75rem; + --custom-emoji-size: 0.75rem; + + font-size: 0.625rem; + } + + .title { + overflow: hidden; + + font-weight: var(--font-weight-medium); + color: var(--color-text-secondary); + text-align: center; + overflow-wrap: anywhere; + } + + .icon { + --emoji-size: 2rem; + --custom-emoji-size: 2rem; + + position: relative; + font-size: 2.25rem; // Font icons are smaller than custom emojis + color: var(--color-text-secondary); + } + + .badge { + position: absolute; + z-index: 1; + top: -0.25rem; + left: 1.25rem; + + display: flex; + align-items: flex-start; + justify-content: center; + + padding: 0.125rem 0.375rem; + border: 2px solid var(--color-background-sidebar); + border-radius: 0.75rem; + + font-size: 0.75rem; + font-weight: var(--font-weight-semibold); + line-height: normal; + color: var(--color-white); + + background: var(--color-text-secondary); + + &-active { + color: var(--color-white); + background: var(--color-primary); + } + } + + .blocked { + vertical-align: middle; + } + + &:hover { + background: var(--color-interactive-element-hover); + } + + &.active { + &::before { + transform: translateX(0) scaleY(1); + } + + .icon, .title { + color: var(--color-primary); + } + + .badge { + color: var(--color-white); + background: var(--color-primary); + } + } +} diff --git a/src/components/ui/Folder.tsx b/src/components/ui/Folder.tsx new file mode 100644 index 000000000..fa9b5ad92 --- /dev/null +++ b/src/components/ui/Folder.tsx @@ -0,0 +1,131 @@ +import type { TeactNode } from '../../lib/teact/teact'; +import { useRef } from '../../lib/teact/teact'; + +import type { MenuItemContextAction } from './ListItem'; + +import { MouseButton } from '../../util/browser/windowEnvironment'; +import buildClassName from '../../util/buildClassName'; + +import useContextMenuHandlers from '../../hooks/useContextMenuHandlers'; +import { useFastClick } from '../../hooks/useFastClick'; +import useLastCallback from '../../hooks/useLastCallback'; + +import Icon from '../common/icons/Icon'; +import Menu from './Menu'; +import MenuItem from './MenuItem'; +import MenuSeparator from './MenuSeparator'; + +import styles from './Folder.module.scss'; + +type OwnProps = { + className?: string; + title: TeactNode; + isActive?: boolean; + isBlocked?: boolean; + badgeCount?: number; + isBadgeActive?: boolean; + contextActions?: MenuItemContextAction[]; + contextRootElementSelector?: string; + icon?: TeactNode; + clickArg?: number; + onClick?: (arg: number) => void; +}; + +const Folder = ({ + className, + title, + isActive, + isBlocked, + badgeCount, + isBadgeActive, + contextActions, + contextRootElementSelector, + icon, + clickArg, + onClick, +}: OwnProps) => { + const folderRef = useRef(); + + const { + contextMenuAnchor, handleContextMenu, handleBeforeContextMenu, handleContextMenuClose, + handleContextMenuHide, isContextMenuOpen, + } = useContextMenuHandlers(folderRef, !contextActions); + + const { handleClick, handleMouseDown } = useFastClick((e: React.MouseEvent) => { + if (contextActions && (e.button === MouseButton.Secondary || !onClick)) { + handleBeforeContextMenu(e); + } + + if (e.type === 'mousedown' && e.button !== MouseButton.Main) { + return; + } + + onClick?.(clickArg!); + }); + + const getTriggerElement = useLastCallback(() => folderRef.current); + const getRootElement = useLastCallback( + () => (contextRootElementSelector ? folderRef.current!.closest(contextRootElementSelector) : document.body), + ); + const getMenuElement = useLastCallback( + () => document.querySelector(`.${styles.contextMenu} .bubble`), + ); + const getLayout = useLastCallback(() => ({ withPortal: true })); + + return ( +
+
+ {icon} + {Boolean(badgeCount) && ( + {badgeCount} + )} +
+ +
+ {isBlocked && } + {title} +
+
+ + {contextActions && contextMenuAnchor !== undefined && ( + + {contextActions.map((action) => ( + ('isSeparator' in action) ? ( + + ) : ( + + {action.title} + + ) + ))} + + )} +
+ ); +}; + +export default Folder; diff --git a/src/components/ui/Tab.tsx b/src/components/ui/Tab.tsx index 0079f2252..683f4f0da 100644 --- a/src/components/ui/Tab.tsx +++ b/src/components/ui/Tab.tsx @@ -32,6 +32,7 @@ type OwnProps = { clickArg?: number; contextActions?: MenuItemContextAction[]; contextRootElementSelector?: string; + icon?: TeactNode; }; const classNames = { @@ -49,6 +50,7 @@ const Tab = ({ previousActiveTab, contextActions, contextRootElementSelector, + icon, clickArg, onClick, }: OwnProps) => { @@ -138,6 +140,7 @@ const Tab = ({ onContextMenu={handleContextMenu} ref={tabRef} > + {icon} {typeof title === 'string' ? renderText(title) : title} {Boolean(badgeCount) && ( diff --git a/src/components/ui/TabList.tsx b/src/components/ui/TabList.tsx index bbde90a6b..0c6a15ecb 100644 --- a/src/components/ui/TabList.tsx +++ b/src/components/ui/TabList.tsx @@ -1,6 +1,7 @@ import type { TeactNode } from '../../lib/teact/teact'; import { memo, useEffect, useRef } from '../../lib/teact/teact'; +import type { ApiMessageEntityCustomEmoji } from '../../api/types'; import type { MenuItemContextAction } from './ListItem'; import animateHorizontalScroll from '../../util/animateHorizontalScroll'; @@ -22,6 +23,8 @@ export type TabWithProperties = { isBlocked?: boolean; isBadgeActive?: boolean; contextActions?: MenuItemContextAction[]; + emoticon?: string | ApiMessageEntityCustomEmoji; + noTitleAnimations?: boolean; }; type OwnProps = { diff --git a/src/config.ts b/src/config.ts index daab0f46a..9029c5059 100644 --- a/src/config.ts +++ b/src/config.ts @@ -141,6 +141,10 @@ export const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16; export const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17; export const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15; +export const TABS_POSITION_TOP = 'top'; +export const TABS_POSITION_LEFT = 'left'; +export const TABS_POSITION_DEFAULT = TABS_POSITION_TOP; + export const PREVIEW_AVATAR_COUNT = 3; export const DRAFT_DEBOUNCE = 10000; // 10s diff --git a/src/global/actions/ui/settings.ts b/src/global/actions/ui/settings.ts index 47b6e9480..f65ef927b 100644 --- a/src/global/actions/ui/settings.ts +++ b/src/global/actions/ui/settings.ts @@ -161,14 +161,14 @@ addActionHandler('openLeftColumnContent', (global, actions, payload): ActionRetu }); addActionHandler('openSettingsScreen', (global, actions, payload): ActionReturnType => { - const { screen = SettingsScreens.Main, tabId = getCurrentTabId() } = payload; + const { screen, tabId = getCurrentTabId() } = payload; const tabState = selectTabState(global, tabId); // Force settings only if new screen is passed, do not on resets - if (payload.screen) actions.openLeftColumnContent({ contentKey: LeftColumnContent.Settings, tabId }); + if (payload.screen !== undefined) actions.openLeftColumnContent({ contentKey: LeftColumnContent.Settings, tabId }); return updateTabState(global, { leftColumn: { ...tabState.leftColumn, - settingsScreen: screen, + settingsScreen: screen || SettingsScreens.Main, }, }, tabId); }); diff --git a/src/global/cache.ts b/src/global/cache.ts index b3eafbbbd..e44c25272 100644 --- a/src/global/cache.ts +++ b/src/global/cache.ts @@ -21,6 +21,7 @@ import { IS_SCREEN_LOCKED_CACHE_KEY, SAVED_FOLDER_ID, SHARED_STATE_CACHE_KEY, + TABS_POSITION_DEFAULT, } from '../config'; import { MAIN_IDB_STORE } from '../util/browser/idb'; import { isUserId } from '../util/entities/ids'; @@ -313,6 +314,7 @@ function unsafeMigrateCache(cached: GlobalState, initialState: GlobalState) { cached.sharedState.settings = { canDisplayChatInTitle: untypedCached.settings.byKey.canDisplayChatInTitle, animationLevel: untypedCached.settings.byKey.animationLevel, + tabsPosition: untypedCached.settings.byKey.tabsPosition, messageSendKeyCombo: untypedCached.settings.byKey.messageSendKeyCombo, messageTextSize: untypedCached.settings.byKey.messageTextSize, performance: untypedCached.settings.performance, @@ -348,6 +350,10 @@ function unsafeMigrateCache(cached: GlobalState, initialState: GlobalState) { cachedSharedSettings.performance = INITIAL_PERFORMANCE_STATE_MED; } + if (!cachedSharedSettings.tabsPosition) { + cachedSharedSettings.tabsPosition = TABS_POSITION_DEFAULT; + } + if (!cached.appConfig) { cached.appConfig = initialState.appConfig; } diff --git a/src/global/initialState.ts b/src/global/initialState.ts index 730e3e0e7..ede9582b8 100644 --- a/src/global/initialState.ts +++ b/src/global/initialState.ts @@ -13,6 +13,7 @@ import { DEFAULT_VOLUME, IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, + TABS_POSITION_DEFAULT, } from '../config'; import { IS_IOS, IS_MAC_OS } from '../util/browser/windowEnvironment'; import { DEFAULT_APP_CONFIG } from '../limits'; @@ -79,6 +80,7 @@ export const INITIAL_SHARED_STATE: SharedState = { ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX), animationLevel: ANIMATION_LEVEL_DEFAULT, + tabsPosition: TABS_POSITION_DEFAULT, messageSendKeyCombo: 'enter', performance: INITIAL_PERFORMANCE_STATE_MAX, shouldSkipWebAppCloseConfirmation: false, diff --git a/src/global/selectors/chats.ts b/src/global/selectors/chats.ts index 7cbd0c9bf..2dec98d36 100644 --- a/src/global/selectors/chats.ts +++ b/src/global/selectors/chats.ts @@ -383,3 +383,8 @@ export function selectIsChatRestricted(global: T, chatId: const activeRestrictions = selectActiveRestrictionReasons(global, chat.restrictionReasons); return activeRestrictions.length > 0; } + +export function selectAreFoldersPresent(global: T) { + const ids = global.chatFolders.orderedIds; + return Boolean(ids && ids.length > 1); +} diff --git a/src/global/types/sharedState.ts b/src/global/types/sharedState.ts index 414736cea..018746633 100644 --- a/src/global/types/sharedState.ts +++ b/src/global/types/sharedState.ts @@ -1,5 +1,5 @@ import type { ApiLanguage } from '../../api/types'; -import type { AnimationLevel, PerformanceType, Point, Size, ThemeKey, TimeFormat } from '../../types'; +import type { AnimationLevel, PerformanceType, Point, Size, TabsPosition, ThemeKey, TimeFormat } from '../../types'; export interface SharedState { settings: SharedSettings; @@ -14,6 +14,7 @@ export interface SharedSettings { performance: PerformanceType; messageTextSize: number; animationLevel: AnimationLevel; + tabsPosition: TabsPosition; // This can be deleted after September 2025, along with the corresponding migration wasAnimationLevelSetManually?: boolean; messageSendKeyCombo: 'enter' | 'ctrl-enter'; diff --git a/src/hooks/reducers/useFoldersReducer.ts b/src/hooks/reducers/useFoldersReducer.ts index a066d3199..477568c1d 100644 --- a/src/hooks/reducers/useFoldersReducer.ts +++ b/src/hooks/reducers/useFoldersReducer.ts @@ -1,8 +1,8 @@ import { getGlobal } from '../../global'; -import type { ApiChatFolder } from '../../api/types'; import type { IconName } from '../../types/icons'; import type { Dispatch, StateReducer } from '../useReducer'; +import { type ApiChatFolder } from '../../api/types'; import { selectChat } from '../../global/selectors'; import { omit, pick } from '../../util/iteratees'; @@ -109,14 +109,14 @@ export type FoldersState = { error?: string; folderId?: number; chatFilter: string; - folder: Omit; + folder: Omit; includeFilters?: FolderIncludeFilters; excludeFilters?: FolderExcludeFilters; }; export type FoldersActions = ( 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' | 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters' | 'setIsTouched' | - 'setFolderId' | 'setIsChatlist' | 'setColor' + 'setFolderId' | 'setIsChatlist' | 'setColor' | 'setEmoticon' ); export type FolderEditDispatch = Dispatch; @@ -140,7 +140,9 @@ const foldersReducer: StateReducer = ( ...state, folder: { ...state.folder, - title: { text: action.payload }, + title: typeof action.payload === 'string' + ? { ...state.folder.title, text: action.payload } + : { ...state.folder.title, ...action.payload }, }, isTouched: true, }; @@ -257,6 +259,16 @@ const foldersReducer: StateReducer = ( }, isTouched: true, }; + case 'setEmoticon': { + return { + ...state, + folder: { + ...state.folder, + emoticon: action.payload, + }, + isTouched: true, + }; + } case 'reset': return INITIAL_STATE; default: diff --git a/src/hooks/useFolderTabs.ts b/src/hooks/useFolderTabs.ts new file mode 100644 index 000000000..de0d9a096 --- /dev/null +++ b/src/hooks/useFolderTabs.ts @@ -0,0 +1,235 @@ +import { type TeactNode, useMemo } from '../lib/teact/teact'; +import { getActions, getGlobal } from '../global'; + +import type { ApiMessageEntity, ApiMessageEntityCustomEmoji } from '../api/types'; +import type { MenuItemContextAction } from '../components/ui/ListItem'; +import type { TabWithProperties } from '../components/ui/TabList'; +import { type ApiChatFolder, type ApiChatlistExportedInvite, ApiMessageEntityTypes } from '../api/types'; +import { SettingsScreens } from '../types'; + +import { ALL_FOLDER_ID } from '../config'; +import { selectCanShareFolder } from '../global/selectors'; +import { MEMO_EMPTY_ARRAY } from '../util/memo'; +import { renderTextWithEntities } from '../components/common/helpers/renderTextWithEntities'; +import useAppLayout from './useAppLayout'; +import { useFolderManagerForUnreadChatsByFolder, useFolderManagerForUnreadCounters } from './useFolderManager'; +import useLang from './useLang'; +import useLastCallback from './useLastCallback'; + +type FolderNameOptions = { + text: string; + entities?: ApiMessageEntity[]; + noCustomEmojiPlayback?: boolean; + emojiSize?: number; +}; + +const useFolderTabs = ({ + sidebarMode, + orderedFolderIds, + chatFoldersById, + maxFolders, + maxChatLists, + folderInvitesById, + maxFolderInvites, +}: { + sidebarMode: boolean; + orderedFolderIds?: number[]; + chatFoldersById: Record; + maxFolders: number; + maxChatLists: number; + folderInvitesById: Record; + maxFolderInvites: number; +}) => { + const lang = useLang(); + const { isMobile } = useAppLayout(); + + const { + openShareChatFolderModal, + openDeleteChatFolderModal, + openEditChatFolder, + openLimitReachedModal, + markChatMessagesRead, + openSettingsScreen, + setSharedSettingOption, + } = getActions(); + + const allChatsFolder: ApiChatFolder = useMemo(() => { + return { + id: ALL_FOLDER_ID, + title: { text: orderedFolderIds?.[0] === ALL_FOLDER_ID ? lang('FilterAllChatsShort') : lang('FilterAllChats') }, + includedChatIds: MEMO_EMPTY_ARRAY, + excludedChatIds: MEMO_EMPTY_ARRAY, + emoticon: '💬', + } satisfies ApiChatFolder; + }, [orderedFolderIds, lang]); + + const displayedFolders = useMemo(() => { + return orderedFolderIds + ? orderedFolderIds.map((id) => { + if (id === ALL_FOLDER_ID) { + return allChatsFolder; + } + + return chatFoldersById[id] || {}; + }).filter(Boolean) + : undefined; + }, [chatFoldersById, allChatsFolder, orderedFolderIds]); + + const folderUnreadChatsCountersById = useFolderManagerForUnreadChatsByFolder(); + const handleReadAllChats = useLastCallback((folderId: number) => { + const unreadChatIds = folderUnreadChatsCountersById[folderId]; + if (!unreadChatIds?.length) return; + + unreadChatIds.forEach((chatId) => { + markChatMessagesRead({ id: chatId }); + }); + }); + + const folderCountersById = useFolderManagerForUnreadCounters(); + const folderTabs = useMemo(() => { + if (!displayedFolders || !displayedFolders.length) { + return undefined; + } + + return displayedFolders.map((folder, i) => { + const { id, title } = folder; + const isBlocked = id !== ALL_FOLDER_ID && i > maxFolders - 1; + const canShareFolder = selectCanShareFolder(getGlobal(), id); + const contextActions: MenuItemContextAction[] = []; + + if (canShareFolder) { + contextActions.push({ + title: lang('FilterShare'), + icon: 'link', + handler: () => { + const chatListCount = Object.values(chatFoldersById).reduce((acc, el) => acc + (el.isChatList ? 1 : 0), 0); + if (chatListCount >= maxChatLists && !folder.isChatList) { + openLimitReachedModal({ + limit: 'chatlistJoined', + }); + return; + } + + // Greater amount can be after premium downgrade + if (folderInvitesById[id]?.length >= maxFolderInvites) { + openLimitReachedModal({ + limit: 'chatlistInvites', + }); + return; + } + + openShareChatFolderModal({ + folderId: id, + }); + }, + }); + } + + if (id === ALL_FOLDER_ID) { + contextActions.push({ + title: lang('FilterEditFolders'), + icon: 'edit', + handler: () => { + openSettingsScreen({ screen: SettingsScreens.Folders }); + }, + }); + + if (folderUnreadChatsCountersById[id]?.length) { + contextActions.push({ + title: lang('ChatListMarkAllAsRead'), + icon: 'readchats', + handler: () => handleReadAllChats(folder.id), + }); + } + } else { + contextActions.push({ + title: lang('EditFolder'), + icon: 'edit', + handler: () => { + openEditChatFolder({ folderId: id }); + }, + }); + + if (folderUnreadChatsCountersById[id]?.length) { + contextActions.push({ + title: lang('ChatListMarkAllAsRead'), + icon: 'readchats', + handler: () => handleReadAllChats(folder.id), + }); + } + + contextActions.push({ + title: lang('FilterMenuDelete'), + icon: 'delete', + destructive: true, + handler: () => { + openDeleteChatFolderModal({ folderId: id }); + }, + }); + } + + if (!isMobile) { + contextActions.push({ + isSeparator: true, + }); + + contextActions.push({ + title: sidebarMode ? lang('TabsPositionTop') : lang('TabsPositionLeft'), + icon: 'forums', + handler: () => { + setSharedSettingOption({ tabsPosition: sidebarMode ? 'top' : 'left' }); + }, + }); + } + + const folderNameOptions: FolderNameOptions = { + text: title.text, + entities: title.entities, + noCustomEmojiPlayback: folder.noTitleAnimations, + }; + + let folderIcon: string | ApiMessageEntityCustomEmoji | undefined = folder.emoticon; + + if (sidebarMode) { + folderNameOptions.emojiSize = 10; + const currentCustomEmoji = title.entities?.find( + (entity): entity is ApiMessageEntityCustomEmoji => + entity.type === ApiMessageEntityTypes.CustomEmoji && entity.offset === 0); + if (currentCustomEmoji) { + folderIcon = currentCustomEmoji; + const { offset, length } = currentCustomEmoji; + + folderNameOptions.text = title.text.replace(title.text.substring(offset, offset + length), ''); + folderNameOptions.entities = title.entities?.filter((entity) => entity.offset !== offset).map((entity) => ({ + ...entity, + offset: entity.offset - length, + })); + } + } + + const folderName: TeactNode[] | string = renderTextWithEntities(folderNameOptions); + + return { + id, + title: folderName, + badgeCount: folderCountersById[id]?.chatsCount, + isBadgeActive: Boolean(folderCountersById[id]?.notificationsCount), + isBlocked, + contextActions: contextActions?.length ? contextActions : undefined, + emoticon: folderIcon, + noTitleAnimations: folder.noTitleAnimations, + } satisfies TabWithProperties; + }); + }, [ + displayedFolders, maxFolders, folderCountersById, lang, chatFoldersById, maxChatLists, folderInvitesById, + maxFolderInvites, folderUnreadChatsCountersById, openSettingsScreen, sidebarMode, isMobile, + setSharedSettingOption, + ]); + + return { + displayedFolders, + folderTabs, + }; +}; + +export default useFolderTabs; diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index fd4cb87a0..b00076b85 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -74,6 +74,7 @@ $color-message-story-mention-to: #74bcff; --color-background-selected: #f4f4f5; --color-background-secondary: #f4f4f5; --color-background-secondary-accent: #e4e4e5; + --color-background-sidebar: #E4E4E5; --color-background-own: #{$color-light-green}; --color-background-own-selected: color.adjust($color-light-green, -10%); --color-text: #{$color-black}; @@ -220,6 +221,7 @@ $color-message-story-mention-to: #74bcff; --border-radius-forum-avatar: 33.3333%; --messages-container-width: 45.5rem; --right-column-width: 26.5rem; + --tabs-sidebar-width: 5rem; --window-controls-width: 0rem; --header-height: 3.5rem; --custom-emoji-size: 1.25rem; diff --git a/src/styles/icons.css b/src/styles/icons.css index d682c4f90..361d17744 100644 --- a/src/styles/icons.css +++ b/src/styles/icons.css @@ -3,8 +3,8 @@ font-weight: normal; font-style: normal; font-display: block; - src: url("./icons.woff2?33f6294c2f4a2ffb1e77473fb35bc539") format("woff2"), -url("./icons.woff?33f6294c2f4a2ffb1e77473fb35bc539") format("woff"); + src: url("./icons.woff2?cc3fadda4d577575d1b441ec5d6c8994") format("woff2"), +url("./icons.woff?cc3fadda4d577575d1b441ec5d6c8994") format("woff"); } .icon-char::before { @@ -294,621 +294,651 @@ url("./icons.woff?33f6294c2f4a2ffb1e77473fb35bc539") format("woff"); .icon-folder-badge::before { content: "\f15b"; } -.icon-folder::before { +.icon-folder-tabs-bot::before { content: "\f15c"; } -.icon-fontsize::before { +.icon-folder-tabs-channel::before { content: "\f15d"; } -.icon-forums::before { +.icon-folder-tabs-chat::before { content: "\f15e"; } -.icon-forward::before { +.icon-folder-tabs-chats::before { content: "\f15f"; } -.icon-fragment::before { +.icon-folder-tabs-folder::before { content: "\f160"; } -.icon-frozen-time::before { +.icon-folder-tabs-group::before { content: "\f161"; } -.icon-fullscreen::before { +.icon-folder-tabs-star::before { content: "\f162"; } -.icon-gifs::before { +.icon-folder-tabs-user::before { content: "\f163"; } -.icon-gift-transfer-inline::before { +.icon-folder::before { content: "\f164"; } -.icon-gift::before { +.icon-fontsize::before { content: "\f165"; } -.icon-group-filled::before { +.icon-forums::before { content: "\f166"; } -.icon-group::before { +.icon-forward::before { content: "\f167"; } -.icon-grouped-disable::before { +.icon-fragment::before { content: "\f168"; } -.icon-grouped::before { +.icon-frozen-time::before { content: "\f169"; } -.icon-hand-stop::before { +.icon-fullscreen::before { content: "\f16a"; } -.icon-hashtag::before { +.icon-gifs::before { content: "\f16b"; } -.icon-hd-photo::before { +.icon-gift-transfer-inline::before { content: "\f16c"; } -.icon-heart-outline::before { +.icon-gift::before { content: "\f16d"; } -.icon-heart::before { +.icon-group-filled::before { content: "\f16e"; } -.icon-help::before { +.icon-group::before { content: "\f16f"; } -.icon-info-filled::before { +.icon-grouped-disable::before { content: "\f170"; } -.icon-info::before { +.icon-grouped::before { content: "\f171"; } -.icon-install::before { +.icon-hand-stop::before { content: "\f172"; } -.icon-italic::before { +.icon-hashtag::before { content: "\f173"; } -.icon-key::before { +.icon-hd-photo::before { content: "\f174"; } -.icon-keyboard::before { +.icon-heart-outline::before { content: "\f175"; } -.icon-lamp::before { +.icon-heart::before { content: "\f176"; } -.icon-language::before { +.icon-help::before { content: "\f177"; } -.icon-large-pause::before { +.icon-info-filled::before { content: "\f178"; } -.icon-large-play::before { +.icon-info::before { content: "\f179"; } -.icon-link-badge::before { +.icon-install::before { content: "\f17a"; } -.icon-link-broken::before { +.icon-italic::before { content: "\f17b"; } -.icon-link::before { +.icon-key::before { content: "\f17c"; } -.icon-location::before { +.icon-keyboard::before { content: "\f17d"; } -.icon-lock-badge::before { +.icon-lamp::before { content: "\f17e"; } -.icon-lock::before { +.icon-language::before { content: "\f17f"; } -.icon-logout::before { +.icon-large-pause::before { content: "\f180"; } -.icon-loop::before { +.icon-large-play::before { content: "\f181"; } -.icon-mention::before { +.icon-link-badge::before { content: "\f182"; } -.icon-message-failed::before { +.icon-link-broken::before { content: "\f183"; } -.icon-message-pending::before { +.icon-link::before { content: "\f184"; } -.icon-message-read::before { +.icon-location::before { content: "\f185"; } -.icon-message-succeeded::before { +.icon-lock-badge::before { content: "\f186"; } -.icon-message::before { +.icon-lock::before { content: "\f187"; } -.icon-microphone-alt::before { +.icon-logout::before { content: "\f188"; } -.icon-microphone::before { +.icon-loop::before { content: "\f189"; } -.icon-monospace::before { +.icon-mention::before { content: "\f18a"; } -.icon-more-circle::before { +.icon-menu::before { content: "\f18b"; } -.icon-more::before { +.icon-message-failed::before { content: "\f18c"; } -.icon-move-caption-down::before { +.icon-message-pending::before { content: "\f18d"; } -.icon-move-caption-up::before { +.icon-message-read::before { content: "\f18e"; } -.icon-mute::before { +.icon-message-succeeded::before { content: "\f18f"; } -.icon-muted::before { +.icon-message::before { content: "\f190"; } -.icon-my-notes::before { +.icon-microphone-alt::before { content: "\f191"; } -.icon-new-chat-filled::before { +.icon-microphone::before { content: "\f192"; } -.icon-next::before { +.icon-monospace::before { content: "\f193"; } -.icon-nochannel::before { +.icon-more-circle::before { content: "\f194"; } -.icon-noise-suppression::before { +.icon-more::before { content: "\f195"; } -.icon-non-contacts::before { +.icon-move-caption-down::before { content: "\f196"; } -.icon-note::before { +.icon-move-caption-up::before { content: "\f197"; } -.icon-one-filled::before { +.icon-mute::before { content: "\f198"; } -.icon-open-in-new-tab::before { +.icon-muted::before { content: "\f199"; } -.icon-password-off::before { +.icon-my-notes::before { content: "\f19a"; } -.icon-pause::before { +.icon-new-chat-filled::before { content: "\f19b"; } -.icon-permissions::before { +.icon-next::before { content: "\f19c"; } -.icon-phone-discard-outline::before { +.icon-nochannel::before { content: "\f19d"; } -.icon-phone-discard::before { +.icon-noise-suppression::before { content: "\f19e"; } -.icon-phone::before { +.icon-non-contacts::before { content: "\f19f"; } -.icon-photo::before { +.icon-note::before { content: "\f1a0"; } -.icon-pin-badge::before { +.icon-one-filled::before { content: "\f1a1"; } -.icon-pin-list::before { +.icon-open-in-new-tab::before { content: "\f1a2"; } -.icon-pin::before { +.icon-password-off::before { content: "\f1a3"; } -.icon-pinned-chat::before { +.icon-pause::before { content: "\f1a4"; } -.icon-pinned-message::before { +.icon-permissions::before { content: "\f1a5"; } -.icon-pip::before { +.icon-phone-discard-outline::before { content: "\f1a6"; } -.icon-play-story::before { +.icon-phone-discard::before { content: "\f1a7"; } -.icon-play::before { +.icon-phone::before { content: "\f1a8"; } -.icon-poll::before { +.icon-photo::before { content: "\f1a9"; } -.icon-previous::before { +.icon-pin-badge::before { content: "\f1aa"; } -.icon-privacy-policy::before { +.icon-pin-list::before { content: "\f1ab"; } -.icon-proof-of-ownership::before { +.icon-pin::before { content: "\f1ac"; } -.icon-quote-text::before { +.icon-pinned-chat::before { content: "\f1ad"; } -.icon-quote::before { +.icon-pinned-message::before { content: "\f1ae"; } -.icon-radial-badge::before { +.icon-pip::before { content: "\f1af"; } -.icon-rating-icons-level1::before { +.icon-play-story::before { content: "\f1b0"; } -.icon-rating-icons-level10::before { +.icon-play::before { content: "\f1b1"; } -.icon-rating-icons-level2::before { +.icon-poll::before { content: "\f1b2"; } -.icon-rating-icons-level20::before { +.icon-previous::before { content: "\f1b3"; } -.icon-rating-icons-level3::before { +.icon-privacy-policy::before { content: "\f1b4"; } -.icon-rating-icons-level30::before { +.icon-proof-of-ownership::before { content: "\f1b5"; } -.icon-rating-icons-level4::before { +.icon-quote-text::before { content: "\f1b6"; } -.icon-rating-icons-level40::before { +.icon-quote::before { content: "\f1b7"; } -.icon-rating-icons-level5::before { +.icon-radial-badge::before { content: "\f1b8"; } -.icon-rating-icons-level50::before { +.icon-rating-icons-level1::before { content: "\f1b9"; } -.icon-rating-icons-level6::before { +.icon-rating-icons-level10::before { content: "\f1ba"; } -.icon-rating-icons-level60::before { +.icon-rating-icons-level2::before { content: "\f1bb"; } -.icon-rating-icons-level7::before { +.icon-rating-icons-level20::before { content: "\f1bc"; } -.icon-rating-icons-level70::before { +.icon-rating-icons-level3::before { content: "\f1bd"; } -.icon-rating-icons-level8::before { +.icon-rating-icons-level30::before { content: "\f1be"; } -.icon-rating-icons-level80::before { +.icon-rating-icons-level4::before { content: "\f1bf"; } -.icon-rating-icons-level9::before { +.icon-rating-icons-level40::before { content: "\f1c0"; } -.icon-rating-icons-level90::before { +.icon-rating-icons-level5::before { content: "\f1c1"; } -.icon-rating-icons-negative::before { +.icon-rating-icons-level50::before { content: "\f1c2"; } -.icon-readchats::before { +.icon-rating-icons-level6::before { content: "\f1c3"; } -.icon-recent::before { +.icon-rating-icons-level60::before { content: "\f1c4"; } -.icon-refund::before { +.icon-rating-icons-level7::before { content: "\f1c5"; } -.icon-reload::before { +.icon-rating-icons-level70::before { content: "\f1c6"; } -.icon-remove-quote::before { +.icon-rating-icons-level8::before { content: "\f1c7"; } -.icon-remove::before { +.icon-rating-icons-level80::before { content: "\f1c8"; } -.icon-reopen-topic::before { +.icon-rating-icons-level9::before { content: "\f1c9"; } -.icon-reorder-tabs::before { +.icon-rating-icons-level90::before { content: "\f1ca"; } -.icon-replace::before { +.icon-rating-icons-negative::before { content: "\f1cb"; } -.icon-replies::before { +.icon-readchats::before { content: "\f1cc"; } -.icon-reply-filled::before { +.icon-recent::before { content: "\f1cd"; } -.icon-reply::before { +.icon-refund::before { content: "\f1ce"; } -.icon-revenue-split::before { +.icon-reload::before { content: "\f1cf"; } -.icon-revote::before { +.icon-remove-quote::before { content: "\f1d0"; } -.icon-save-story::before { +.icon-remove::before { content: "\f1d1"; } -.icon-saved-messages::before { +.icon-reopen-topic::before { content: "\f1d2"; } -.icon-schedule::before { +.icon-reorder-tabs::before { content: "\f1d3"; } -.icon-scheduled::before { +.icon-replace::before { content: "\f1d4"; } -.icon-sd-photo::before { +.icon-replies::before { content: "\f1d5"; } -.icon-search::before { +.icon-reply-filled::before { content: "\f1d6"; } -.icon-select::before { +.icon-reply::before { content: "\f1d7"; } -.icon-sell-outline::before { +.icon-revenue-split::before { content: "\f1d8"; } -.icon-sell::before { +.icon-revote::before { content: "\f1d9"; } -.icon-send-outline::before { +.icon-save-story::before { content: "\f1da"; } -.icon-send::before { +.icon-saved-messages::before { content: "\f1db"; } -.icon-settings-filled::before { +.icon-schedule::before { content: "\f1dc"; } -.icon-settings::before { +.icon-scheduled::before { content: "\f1dd"; } -.icon-share-filled::before { +.icon-sd-photo::before { content: "\f1de"; } -.icon-share-screen-outlined::before { +.icon-search::before { content: "\f1df"; } -.icon-share-screen-stop::before { +.icon-select::before { content: "\f1e0"; } -.icon-share-screen::before { +.icon-sell-outline::before { content: "\f1e1"; } -.icon-show-message::before { +.icon-sell::before { content: "\f1e2"; } -.icon-sidebar::before { +.icon-send-outline::before { content: "\f1e3"; } -.icon-skip-next::before { +.icon-send::before { content: "\f1e4"; } -.icon-skip-previous::before { +.icon-settings-filled::before { content: "\f1e5"; } -.icon-smallscreen::before { +.icon-settings::before { content: "\f1e6"; } -.icon-smile::before { +.icon-share-filled::before { content: "\f1e7"; } -.icon-sort-by-date::before { +.icon-share-screen-outlined::before { content: "\f1e8"; } -.icon-sort-by-number::before { +.icon-share-screen-stop::before { content: "\f1e9"; } -.icon-sort-by-price::before { +.icon-share-screen::before { content: "\f1ea"; } -.icon-sort::before { +.icon-show-message::before { content: "\f1eb"; } -.icon-speaker-muted-story::before { +.icon-sidebar::before { content: "\f1ec"; } -.icon-speaker-outline::before { +.icon-skip-next::before { content: "\f1ed"; } -.icon-speaker-story::before { +.icon-skip-previous::before { content: "\f1ee"; } -.icon-speaker::before { +.icon-smallscreen::before { content: "\f1ef"; } -.icon-spoiler-disable::before { +.icon-smile::before { content: "\f1f0"; } -.icon-spoiler::before { +.icon-sort-by-date::before { content: "\f1f1"; } -.icon-sport::before { +.icon-sort-by-number::before { content: "\f1f2"; } -.icon-star::before { +.icon-sort-by-price::before { content: "\f1f3"; } -.icon-stars-lock::before { +.icon-sort::before { content: "\f1f4"; } -.icon-stars-refund::before { +.icon-speaker-muted-story::before { content: "\f1f5"; } -.icon-stats::before { +.icon-speaker-outline::before { content: "\f1f6"; } -.icon-stealth-future::before { +.icon-speaker-story::before { content: "\f1f7"; } -.icon-stealth-past::before { +.icon-speaker::before { content: "\f1f8"; } -.icon-stickers::before { +.icon-spoiler-disable::before { content: "\f1f9"; } -.icon-stop-raising-hand::before { +.icon-spoiler::before { content: "\f1fa"; } -.icon-stop::before { +.icon-sport::before { content: "\f1fb"; } -.icon-story-caption::before { +.icon-star::before { content: "\f1fc"; } -.icon-story-expired::before { +.icon-stars-lock::before { content: "\f1fd"; } -.icon-story-priority::before { +.icon-stars-refund::before { content: "\f1fe"; } -.icon-story-reply::before { +.icon-stats::before { content: "\f1ff"; } -.icon-strikethrough::before { +.icon-stealth-future::before { content: "\f200"; } -.icon-tag-add::before { +.icon-stealth-past::before { content: "\f201"; } -.icon-tag-crossed::before { +.icon-stickers::before { content: "\f202"; } -.icon-tag-filter::before { +.icon-stop-raising-hand::before { content: "\f203"; } -.icon-tag-name::before { +.icon-stop::before { content: "\f204"; } -.icon-tag::before { +.icon-story-caption::before { content: "\f205"; } -.icon-timer::before { +.icon-story-expired::before { content: "\f206"; } -.icon-toncoin::before { +.icon-story-priority::before { content: "\f207"; } -.icon-topic-new::before { +.icon-story-reply::before { content: "\f208"; } -.icon-trade::before { +.icon-strikethrough::before { content: "\f209"; } -.icon-transcribe::before { +.icon-tag-add::before { content: "\f20a"; } -.icon-truck::before { +.icon-tag-crossed::before { content: "\f20b"; } -.icon-unarchive::before { +.icon-tag-filter::before { content: "\f20c"; } -.icon-underlined::before { +.icon-tag-name::before { content: "\f20d"; } -.icon-understood::before { +.icon-tag::before { content: "\f20e"; } -.icon-unique-profile::before { +.icon-timer::before { content: "\f20f"; } -.icon-unlist-outline::before { +.icon-toncoin::before { content: "\f210"; } -.icon-unlist::before { +.icon-tools::before { content: "\f211"; } -.icon-unlock-badge::before { +.icon-topic-new::before { content: "\f212"; } -.icon-unlock::before { +.icon-trade::before { content: "\f213"; } -.icon-unmute::before { +.icon-transcribe::before { content: "\f214"; } -.icon-unpin::before { +.icon-truck::before { content: "\f215"; } -.icon-unread::before { +.icon-unarchive::before { content: "\f216"; } -.icon-up::before { +.icon-underlined::before { content: "\f217"; } -.icon-user-filled::before { +.icon-understood::before { content: "\f218"; } -.icon-user-online::before { +.icon-unique-profile::before { content: "\f219"; } -.icon-user-stars::before { +.icon-unlist-outline::before { content: "\f21a"; } -.icon-user::before { +.icon-unlist::before { content: "\f21b"; } -.icon-video-outlined::before { +.icon-unlock-badge::before { content: "\f21c"; } -.icon-video-stop::before { +.icon-unlock::before { content: "\f21d"; } -.icon-video::before { +.icon-unmute::before { content: "\f21e"; } -.icon-view-once::before { +.icon-unpin::before { content: "\f21f"; } -.icon-voice-chat::before { +.icon-unread::before { content: "\f220"; } -.icon-volume-1::before { +.icon-up::before { content: "\f221"; } -.icon-volume-2::before { +.icon-user-filled::before { content: "\f222"; } -.icon-volume-3::before { +.icon-user-online::before { content: "\f223"; } -.icon-warning::before { +.icon-user-stars::before { content: "\f224"; } -.icon-web::before { +.icon-user::before { content: "\f225"; } -.icon-webapp::before { +.icon-video-outlined::before { content: "\f226"; } -.icon-word-wrap::before { +.icon-video-stop::before { content: "\f227"; } -.icon-zoom-in::before { +.icon-video::before { content: "\f228"; } -.icon-zoom-out::before { +.icon-view-once::before { content: "\f229"; } +.icon-voice-chat::before { + content: "\f22a"; +} +.icon-volume-1::before { + content: "\f22b"; +} +.icon-volume-2::before { + content: "\f22c"; +} +.icon-volume-3::before { + content: "\f22d"; +} +.icon-warning::before { + content: "\f22e"; +} +.icon-web::before { + content: "\f22f"; +} +.icon-webapp::before { + content: "\f230"; +} +.icon-word-wrap::before { + content: "\f231"; +} +.icon-zoom-in::before { + content: "\f232"; +} +.icon-zoom-out::before { + content: "\f233"; +} diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 8c6340e56..f779cff39 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -107,210 +107,220 @@ $icons-map: ( "file-badge": "\f159", "flag": "\f15a", "folder-badge": "\f15b", - "folder": "\f15c", - "fontsize": "\f15d", - "forums": "\f15e", - "forward": "\f15f", - "fragment": "\f160", - "frozen-time": "\f161", - "fullscreen": "\f162", - "gifs": "\f163", - "gift-transfer-inline": "\f164", - "gift": "\f165", - "group-filled": "\f166", - "group": "\f167", - "grouped-disable": "\f168", - "grouped": "\f169", - "hand-stop": "\f16a", - "hashtag": "\f16b", - "hd-photo": "\f16c", - "heart-outline": "\f16d", - "heart": "\f16e", - "help": "\f16f", - "info-filled": "\f170", - "info": "\f171", - "install": "\f172", - "italic": "\f173", - "key": "\f174", - "keyboard": "\f175", - "lamp": "\f176", - "language": "\f177", - "large-pause": "\f178", - "large-play": "\f179", - "link-badge": "\f17a", - "link-broken": "\f17b", - "link": "\f17c", - "location": "\f17d", - "lock-badge": "\f17e", - "lock": "\f17f", - "logout": "\f180", - "loop": "\f181", - "mention": "\f182", - "message-failed": "\f183", - "message-pending": "\f184", - "message-read": "\f185", - "message-succeeded": "\f186", - "message": "\f187", - "microphone-alt": "\f188", - "microphone": "\f189", - "monospace": "\f18a", - "more-circle": "\f18b", - "more": "\f18c", - "move-caption-down": "\f18d", - "move-caption-up": "\f18e", - "mute": "\f18f", - "muted": "\f190", - "my-notes": "\f191", - "new-chat-filled": "\f192", - "next": "\f193", - "nochannel": "\f194", - "noise-suppression": "\f195", - "non-contacts": "\f196", - "note": "\f197", - "one-filled": "\f198", - "open-in-new-tab": "\f199", - "password-off": "\f19a", - "pause": "\f19b", - "permissions": "\f19c", - "phone-discard-outline": "\f19d", - "phone-discard": "\f19e", - "phone": "\f19f", - "photo": "\f1a0", - "pin-badge": "\f1a1", - "pin-list": "\f1a2", - "pin": "\f1a3", - "pinned-chat": "\f1a4", - "pinned-message": "\f1a5", - "pip": "\f1a6", - "play-story": "\f1a7", - "play": "\f1a8", - "poll": "\f1a9", - "previous": "\f1aa", - "privacy-policy": "\f1ab", - "proof-of-ownership": "\f1ac", - "quote-text": "\f1ad", - "quote": "\f1ae", - "radial-badge": "\f1af", - "rating-icons-level1": "\f1b0", - "rating-icons-level10": "\f1b1", - "rating-icons-level2": "\f1b2", - "rating-icons-level20": "\f1b3", - "rating-icons-level3": "\f1b4", - "rating-icons-level30": "\f1b5", - "rating-icons-level4": "\f1b6", - "rating-icons-level40": "\f1b7", - "rating-icons-level5": "\f1b8", - "rating-icons-level50": "\f1b9", - "rating-icons-level6": "\f1ba", - "rating-icons-level60": "\f1bb", - "rating-icons-level7": "\f1bc", - "rating-icons-level70": "\f1bd", - "rating-icons-level8": "\f1be", - "rating-icons-level80": "\f1bf", - "rating-icons-level9": "\f1c0", - "rating-icons-level90": "\f1c1", - "rating-icons-negative": "\f1c2", - "readchats": "\f1c3", - "recent": "\f1c4", - "refund": "\f1c5", - "reload": "\f1c6", - "remove-quote": "\f1c7", - "remove": "\f1c8", - "reopen-topic": "\f1c9", - "reorder-tabs": "\f1ca", - "replace": "\f1cb", - "replies": "\f1cc", - "reply-filled": "\f1cd", - "reply": "\f1ce", - "revenue-split": "\f1cf", - "revote": "\f1d0", - "save-story": "\f1d1", - "saved-messages": "\f1d2", - "schedule": "\f1d3", - "scheduled": "\f1d4", - "sd-photo": "\f1d5", - "search": "\f1d6", - "select": "\f1d7", - "sell-outline": "\f1d8", - "sell": "\f1d9", - "send-outline": "\f1da", - "send": "\f1db", - "settings-filled": "\f1dc", - "settings": "\f1dd", - "share-filled": "\f1de", - "share-screen-outlined": "\f1df", - "share-screen-stop": "\f1e0", - "share-screen": "\f1e1", - "show-message": "\f1e2", - "sidebar": "\f1e3", - "skip-next": "\f1e4", - "skip-previous": "\f1e5", - "smallscreen": "\f1e6", - "smile": "\f1e7", - "sort-by-date": "\f1e8", - "sort-by-number": "\f1e9", - "sort-by-price": "\f1ea", - "sort": "\f1eb", - "speaker-muted-story": "\f1ec", - "speaker-outline": "\f1ed", - "speaker-story": "\f1ee", - "speaker": "\f1ef", - "spoiler-disable": "\f1f0", - "spoiler": "\f1f1", - "sport": "\f1f2", - "star": "\f1f3", - "stars-lock": "\f1f4", - "stars-refund": "\f1f5", - "stats": "\f1f6", - "stealth-future": "\f1f7", - "stealth-past": "\f1f8", - "stickers": "\f1f9", - "stop-raising-hand": "\f1fa", - "stop": "\f1fb", - "story-caption": "\f1fc", - "story-expired": "\f1fd", - "story-priority": "\f1fe", - "story-reply": "\f1ff", - "strikethrough": "\f200", - "tag-add": "\f201", - "tag-crossed": "\f202", - "tag-filter": "\f203", - "tag-name": "\f204", - "tag": "\f205", - "timer": "\f206", - "toncoin": "\f207", - "topic-new": "\f208", - "trade": "\f209", - "transcribe": "\f20a", - "truck": "\f20b", - "unarchive": "\f20c", - "underlined": "\f20d", - "understood": "\f20e", - "unique-profile": "\f20f", - "unlist-outline": "\f210", - "unlist": "\f211", - "unlock-badge": "\f212", - "unlock": "\f213", - "unmute": "\f214", - "unpin": "\f215", - "unread": "\f216", - "up": "\f217", - "user-filled": "\f218", - "user-online": "\f219", - "user-stars": "\f21a", - "user": "\f21b", - "video-outlined": "\f21c", - "video-stop": "\f21d", - "video": "\f21e", - "view-once": "\f21f", - "voice-chat": "\f220", - "volume-1": "\f221", - "volume-2": "\f222", - "volume-3": "\f223", - "warning": "\f224", - "web": "\f225", - "webapp": "\f226", - "word-wrap": "\f227", - "zoom-in": "\f228", - "zoom-out": "\f229", + "folder-tabs-bot": "\f15c", + "folder-tabs-channel": "\f15d", + "folder-tabs-chat": "\f15e", + "folder-tabs-chats": "\f15f", + "folder-tabs-folder": "\f160", + "folder-tabs-group": "\f161", + "folder-tabs-star": "\f162", + "folder-tabs-user": "\f163", + "folder": "\f164", + "fontsize": "\f165", + "forums": "\f166", + "forward": "\f167", + "fragment": "\f168", + "frozen-time": "\f169", + "fullscreen": "\f16a", + "gifs": "\f16b", + "gift-transfer-inline": "\f16c", + "gift": "\f16d", + "group-filled": "\f16e", + "group": "\f16f", + "grouped-disable": "\f170", + "grouped": "\f171", + "hand-stop": "\f172", + "hashtag": "\f173", + "hd-photo": "\f174", + "heart-outline": "\f175", + "heart": "\f176", + "help": "\f177", + "info-filled": "\f178", + "info": "\f179", + "install": "\f17a", + "italic": "\f17b", + "key": "\f17c", + "keyboard": "\f17d", + "lamp": "\f17e", + "language": "\f17f", + "large-pause": "\f180", + "large-play": "\f181", + "link-badge": "\f182", + "link-broken": "\f183", + "link": "\f184", + "location": "\f185", + "lock-badge": "\f186", + "lock": "\f187", + "logout": "\f188", + "loop": "\f189", + "mention": "\f18a", + "menu": "\f18b", + "message-failed": "\f18c", + "message-pending": "\f18d", + "message-read": "\f18e", + "message-succeeded": "\f18f", + "message": "\f190", + "microphone-alt": "\f191", + "microphone": "\f192", + "monospace": "\f193", + "more-circle": "\f194", + "more": "\f195", + "move-caption-down": "\f196", + "move-caption-up": "\f197", + "mute": "\f198", + "muted": "\f199", + "my-notes": "\f19a", + "new-chat-filled": "\f19b", + "next": "\f19c", + "nochannel": "\f19d", + "noise-suppression": "\f19e", + "non-contacts": "\f19f", + "note": "\f1a0", + "one-filled": "\f1a1", + "open-in-new-tab": "\f1a2", + "password-off": "\f1a3", + "pause": "\f1a4", + "permissions": "\f1a5", + "phone-discard-outline": "\f1a6", + "phone-discard": "\f1a7", + "phone": "\f1a8", + "photo": "\f1a9", + "pin-badge": "\f1aa", + "pin-list": "\f1ab", + "pin": "\f1ac", + "pinned-chat": "\f1ad", + "pinned-message": "\f1ae", + "pip": "\f1af", + "play-story": "\f1b0", + "play": "\f1b1", + "poll": "\f1b2", + "previous": "\f1b3", + "privacy-policy": "\f1b4", + "proof-of-ownership": "\f1b5", + "quote-text": "\f1b6", + "quote": "\f1b7", + "radial-badge": "\f1b8", + "rating-icons-level1": "\f1b9", + "rating-icons-level10": "\f1ba", + "rating-icons-level2": "\f1bb", + "rating-icons-level20": "\f1bc", + "rating-icons-level3": "\f1bd", + "rating-icons-level30": "\f1be", + "rating-icons-level4": "\f1bf", + "rating-icons-level40": "\f1c0", + "rating-icons-level5": "\f1c1", + "rating-icons-level50": "\f1c2", + "rating-icons-level6": "\f1c3", + "rating-icons-level60": "\f1c4", + "rating-icons-level7": "\f1c5", + "rating-icons-level70": "\f1c6", + "rating-icons-level8": "\f1c7", + "rating-icons-level80": "\f1c8", + "rating-icons-level9": "\f1c9", + "rating-icons-level90": "\f1ca", + "rating-icons-negative": "\f1cb", + "readchats": "\f1cc", + "recent": "\f1cd", + "refund": "\f1ce", + "reload": "\f1cf", + "remove-quote": "\f1d0", + "remove": "\f1d1", + "reopen-topic": "\f1d2", + "reorder-tabs": "\f1d3", + "replace": "\f1d4", + "replies": "\f1d5", + "reply-filled": "\f1d6", + "reply": "\f1d7", + "revenue-split": "\f1d8", + "revote": "\f1d9", + "save-story": "\f1da", + "saved-messages": "\f1db", + "schedule": "\f1dc", + "scheduled": "\f1dd", + "sd-photo": "\f1de", + "search": "\f1df", + "select": "\f1e0", + "sell-outline": "\f1e1", + "sell": "\f1e2", + "send-outline": "\f1e3", + "send": "\f1e4", + "settings-filled": "\f1e5", + "settings": "\f1e6", + "share-filled": "\f1e7", + "share-screen-outlined": "\f1e8", + "share-screen-stop": "\f1e9", + "share-screen": "\f1ea", + "show-message": "\f1eb", + "sidebar": "\f1ec", + "skip-next": "\f1ed", + "skip-previous": "\f1ee", + "smallscreen": "\f1ef", + "smile": "\f1f0", + "sort-by-date": "\f1f1", + "sort-by-number": "\f1f2", + "sort-by-price": "\f1f3", + "sort": "\f1f4", + "speaker-muted-story": "\f1f5", + "speaker-outline": "\f1f6", + "speaker-story": "\f1f7", + "speaker": "\f1f8", + "spoiler-disable": "\f1f9", + "spoiler": "\f1fa", + "sport": "\f1fb", + "star": "\f1fc", + "stars-lock": "\f1fd", + "stars-refund": "\f1fe", + "stats": "\f1ff", + "stealth-future": "\f200", + "stealth-past": "\f201", + "stickers": "\f202", + "stop-raising-hand": "\f203", + "stop": "\f204", + "story-caption": "\f205", + "story-expired": "\f206", + "story-priority": "\f207", + "story-reply": "\f208", + "strikethrough": "\f209", + "tag-add": "\f20a", + "tag-crossed": "\f20b", + "tag-filter": "\f20c", + "tag-name": "\f20d", + "tag": "\f20e", + "timer": "\f20f", + "toncoin": "\f210", + "tools": "\f211", + "topic-new": "\f212", + "trade": "\f213", + "transcribe": "\f214", + "truck": "\f215", + "unarchive": "\f216", + "underlined": "\f217", + "understood": "\f218", + "unique-profile": "\f219", + "unlist-outline": "\f21a", + "unlist": "\f21b", + "unlock-badge": "\f21c", + "unlock": "\f21d", + "unmute": "\f21e", + "unpin": "\f21f", + "unread": "\f220", + "up": "\f221", + "user-filled": "\f222", + "user-online": "\f223", + "user-stars": "\f224", + "user": "\f225", + "video-outlined": "\f226", + "video-stop": "\f227", + "video": "\f228", + "view-once": "\f229", + "voice-chat": "\f22a", + "volume-1": "\f22b", + "volume-2": "\f22c", + "volume-3": "\f22d", + "warning": "\f22e", + "web": "\f22f", + "webapp": "\f230", + "word-wrap": "\f231", + "zoom-in": "\f232", + "zoom-out": "\f233", ); diff --git a/src/styles/icons.woff b/src/styles/icons.woff index 2e9a73dcdffc43041f20ea3fec7a9c4756d2a406..f0e528d007b7a2bc3e25e386e657b75c11a5b797 100644 GIT binary patch delta 38339 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 j=)<$D<$BJB;#u>kqq00mS4 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 z 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 diff --git a/src/styles/icons.woff2 b/src/styles/icons.woff2 index 941663bf361ed0c5809a0e1c40b3bf8b5ff1c4d7..c01b062f84efefaf017713accdd5b2995f79b75d 100644 GIT binary patch literal 32396 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 z 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 bwYu@8{Y+yigQV$wb1dD{WCzhc$lCIEFr8E7 diff --git a/src/styles/themes.json b/src/styles/themes.json index 08ba7f56d..7cd1a0cd1 100644 --- a/src/styles/themes.json +++ b/src/styles/themes.json @@ -9,8 +9,9 @@ "--color-web-app-browser": ["#FFFFFFBB", "#0303038F"], "--color-background-compact-menu-reactions": ["#FFFFFFEB", "#212121DD"], "--color-background-compact-menu-hover": ["#00000011", "#00000066"], - "--color-background-secondary": ["#f4f4f5", "#0F0F0F"], + "--color-background-secondary": ["#F4F4F5", "#0F0F0F"], "--color-background-secondary-accent": ["#E4E4E5", "#191919"], + "--color-background-sidebar": ["#E4E4E5", "#0F0F0F"], "--color-background-own": ["#EEFFDE", "#766AC8"], "--color-background-own-apple": ["#DCF8C5", "#766AC8"], "--color-background-selected": ["#F4F4F5", "#2C2C2C"], @@ -18,8 +19,8 @@ "--color-chat-hover": ["#F4F4F5", "#2C2C2C"], "--color-chat-active": ["#3390EC", "#766AC8"], "--color-chat-active-greyed": ["#60a7f0", "#9288d3"], - "--color-item-hover": ["#f4f4f5", "#2c2c2c"], - "--color-item-active": ["#ededed", "#292929"], + "--color-item-hover": ["#F4F4F5", "#2C2C2C"], + "--color-item-active": ["#EDEDED", "#292929"], "--color-text": ["#000000", "#FFFFFF"], "--color-text-secondary": ["#707579", "#AAAAAA"], "--color-icon-secondary": ["#707579", "#AAAAAA"], diff --git a/src/types/icons/font.ts b/src/types/icons/font.ts index d31adf0c3..f16e15bcd 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -90,6 +90,14 @@ export type FontIconName = | 'file-badge' | 'flag' | 'folder-badge' + | 'folder-tabs-bot' + | 'folder-tabs-channel' + | 'folder-tabs-chat' + | 'folder-tabs-chats' + | 'folder-tabs-folder' + | 'folder-tabs-group' + | 'folder-tabs-star' + | 'folder-tabs-user' | 'folder' | 'fontsize' | 'forums' @@ -129,6 +137,7 @@ export type FontIconName = | 'logout' | 'loop' | 'mention' + | 'menu' | 'message-failed' | 'message-pending' | 'message-read' @@ -262,6 +271,7 @@ export type FontIconName = | 'tag' | 'timer' | 'toncoin' + | 'tools' | 'topic-new' | 'trade' | 'transcribe' diff --git a/src/types/index.ts b/src/types/index.ts index 4a2b5cb0d..a27fe3be6 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -100,6 +100,7 @@ export type ThreadId = string | number; export type ThemeKey = 'light' | 'dark'; export type AnimationLevel = 0 | 1 | 2; +export type TabsPosition = 'top' | 'left'; export type PerformanceTypeKey = ( 'pageTransitions' | 'messageSendingAnimations' | 'mediaViewerAnimations' | 'messageComposerAnimations' | 'contextMenuAnimations' | 'contextMenuBlur' | 'rightColumnAnimations' diff --git a/src/types/language.d.ts b/src/types/language.d.ts index b26800428..ba8dc4d2b 100644 --- a/src/types/language.d.ts +++ b/src/types/language.d.ts @@ -288,7 +288,8 @@ export interface LangPair { 'ChatEmptyChat': undefined; 'ChatListEmptyChatListEditFilter': undefined; 'UpdateTelegram': undefined; - 'AccDescrOpenMenu2': undefined; + 'AriaLabelOpenMenu': undefined; + 'AriaLabelBackChatList': undefined; 'SettingsTipsUsername': undefined; 'SearchFriends': undefined; 'Search': undefined; @@ -326,6 +327,9 @@ export interface LangPair { 'FilterColorHint': undefined; 'ShowFolderTags': undefined; 'ShowFolderTagsHint': undefined; + 'TabsPosition': undefined; + 'TabsPositionLeft': undefined; + 'TabsPositionTop': undefined; 'FilterIncludeInfo': undefined; 'FilterNameHint': undefined; 'FilterInclude': undefined; diff --git a/src/util/fallbackLangPack.ts b/src/util/fallbackLangPack.ts index 547e2ad50..06a781008 100644 --- a/src/util/fallbackLangPack.ts +++ b/src/util/fallbackLangPack.ts @@ -179,6 +179,9 @@ export default { FilterColorHint: 'This color will be used for the folder\'s tag in the chat list', ShowFolderTags: 'Show Folder Tags', ShowFolderTagsHint: 'Display folder names for each chat in the chat list.', + TabsPosition: 'Tabs View', + TabsPositionLeft: 'Tabs on the left', + TabsPositionTop: 'Tabs at the top', AccDescrChannel: 'Channel', AccDescrGroup: 'Group', Bot: 'bot', diff --git a/src/util/folderIconMap.ts b/src/util/folderIconMap.ts new file mode 100644 index 000000000..279585ac4 --- /dev/null +++ b/src/util/folderIconMap.ts @@ -0,0 +1,20 @@ +import type { IconName } from '../types/icons'; + +export const folderIconMap: Record = { + '🗂': 'folder-tabs-folder', + '⭐': 'folder-tabs-star', + '🤖': 'folder-tabs-bot', + '👥': 'folder-tabs-group', + '👤': 'folder-tabs-user', + '✅': 'folder-tabs-chat', + '📢': 'folder-tabs-channel', + '💬': 'folder-tabs-chats', +}; + +export const emojiToFolderIcon = (emoji: string): IconName | undefined => { + return folderIconMap[emoji]; +}; + +export const folderIconToEmoji = (icon: IconName): string | undefined => { + return Object.keys(folderIconMap).find((key) => folderIconMap[key] === icon); +};