diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 7baf0bb3..4e3ffc17 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -831,6 +831,12 @@ export async function deleteChatFolder(id: number) { } } +export function sortChatFolders(ids: number[]) { + return invokeRequest(new GramJs.messages.UpdateDialogFiltersOrder({ + order: ids, + })); +} + export async function toggleDialogUnread({ chat, hasUnreadMark, }: { diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 302ada0f..c1bab2ee 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -15,7 +15,7 @@ export { saveDraft, clearDraft, fetchChat, updateChatMutedState, createChannel, joinChannel, deleteChatUser, deleteChat, leaveChannel, deleteChannel, createGroupChat, editChatPhoto, toggleChatPinned, toggleChatArchived, toggleDialogUnread, setChatEnabledReactions, - fetchChatFolders, editChatFolder, deleteChatFolder, fetchRecommendedChatFolders, + fetchChatFolders, editChatFolder, deleteChatFolder, sortChatFolders, fetchRecommendedChatFolders, getChatByUsername, togglePreHistoryHidden, updateChatDefaultBannedRights, updateChatMemberBannedRights, updateChatTitle, updateChatAbout, toggleSignatures, updateChatAdmin, fetchGroupsForDiscussion, setDiscussionGroup, migrateChat, openChatByInvite, fetchMembers, importChatInvite, addChatMembers, deleteChatMember, toggleIsProtected, diff --git a/src/assets/fonts/icomoon.woff b/src/assets/fonts/icomoon.woff index 5ad06c7c..c4d15655 100644 Binary files a/src/assets/fonts/icomoon.woff and b/src/assets/fonts/icomoon.woff differ diff --git a/src/assets/fonts/icomoon.woff2 b/src/assets/fonts/icomoon.woff2 index 62d7a4a6..0d62eb28 100644 Binary files a/src/assets/fonts/icomoon.woff2 and b/src/assets/fonts/icomoon.woff2 differ diff --git a/src/components/left/settings/folders/SettingsFolders.scss b/src/components/left/settings/folders/SettingsFolders.scss index 216c336f..5f481da7 100644 --- a/src/components/left/settings/folders/SettingsFolders.scss +++ b/src/components/left/settings/folders/SettingsFolders.scss @@ -76,3 +76,15 @@ width: calc(100% + 2rem); padding-left: 1rem !important; } + +.settings-sortable-container { + position: relative; +} + +.settings-sortable-container .draggable-knob { + margin-top: -0.25rem; +} + +.settings-sortable-item .multiline-item { + padding-inline-end: 3rem; +} diff --git a/src/components/left/settings/folders/SettingsFoldersMain.tsx b/src/components/left/settings/folders/SettingsFoldersMain.tsx index efbf6537..15f01a46 100644 --- a/src/components/left/settings/folders/SettingsFoldersMain.tsx +++ b/src/components/left/settings/folders/SettingsFoldersMain.tsx @@ -1,6 +1,6 @@ import type { FC } from '../../../../lib/teact/teact'; import React, { - memo, useMemo, useCallback, useEffect, + memo, useMemo, useCallback, useEffect, useState, } from '../../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../../global'; @@ -21,6 +21,7 @@ import ListItem from '../../../ui/ListItem'; import Button from '../../../ui/Button'; import Loading from '../../../ui/Loading'; import AnimatedIcon from '../../../common/AnimatedIcon'; +import Draggable from '../../../ui/Draggable'; type OwnProps = { isActive?: boolean; @@ -30,13 +31,20 @@ type OwnProps = { }; type StateProps = { - orderedFolderIds?: number[]; + folderIds?: number[]; foldersById: Record; recommendedChatFolders?: ApiChatFolder[]; maxFolders: number; isPremium?: boolean; }; +type SortState = { + orderedFolderIds?: number[]; + dragOrderIds?: number[]; + draggedIndex?: number; +}; + +const FOLDER_HEIGHT_PX = 68; const runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true); const SettingsFoldersMain: FC = ({ @@ -44,7 +52,7 @@ const SettingsFoldersMain: FC = ({ onCreateFolder, onEditFolder, onReset, - orderedFolderIds, + folderIds, foldersById, isPremium, recommendedChatFolders, @@ -55,8 +63,15 @@ const SettingsFoldersMain: FC = ({ addChatFolder, openLimitReachedModal, openDeleteChatFolderModal, + sortChatFolders, } = getActions(); + const [state, setState] = useState({ + orderedFolderIds: folderIds, + dragOrderIds: folderIds, + draggedIndex: undefined, + }); + // Due to the parent Transition, this component never gets unmounted, // that's why we use throttled API call on every update. useEffect(() => { @@ -86,15 +101,15 @@ const SettingsFoldersMain: FC = ({ const chatsCountByFolderId = useFolderManagerForChatsCount(); const userFolders = useMemo(() => { - if (!orderedFolderIds) { + if (!state.orderedFolderIds) { return undefined; } - if (orderedFolderIds.length <= 1) { + if (state.orderedFolderIds.length <= 1) { return MEMO_EMPTY_ARRAY; } - return orderedFolderIds.map((id) => { + return state.orderedFolderIds.map((id) => { const folder = foldersById[id]; if (id === ALL_FOLDER_ID) { @@ -110,7 +125,7 @@ const SettingsFoldersMain: FC = ({ subtitle: getFolderDescriptionText(lang, folder, chatsCountByFolderId[folder.id]), }; }); - }, [orderedFolderIds, foldersById, lang, chatsCountByFolderId]); + }, [state.orderedFolderIds, foldersById, lang, chatsCountByFolderId]); const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => { if (Object.keys(foldersById).length >= maxFolders - 1) { @@ -124,6 +139,35 @@ const SettingsFoldersMain: FC = ({ addChatFolder({ folder }); }, [foldersById, maxFolders, addChatFolder, openLimitReachedModal]); + const handleDrag = useCallback((translation: { x: number; y: number }, id: number) => { + const delta = Math.round(translation.y / FOLDER_HEIGHT_PX); + const index = state.orderedFolderIds?.indexOf(id) || 0; + const dragOrderIds = state.orderedFolderIds?.filter((folderId) => folderId !== id); + + if (!dragOrderIds || !inRange(index + delta, 0, folderIds?.length || 0)) { + return; + } + + dragOrderIds.splice(index + delta + (isPremium ? 0 : 1), 0, id); + setState((current) => ({ + ...current, + draggedIndex: index, + dragOrderIds, + })); + }, [folderIds?.length, isPremium, state.orderedFolderIds]); + + const handleDragEnd = useCallback(() => { + setState((current) => { + sortChatFolders({ folderIds: current.dragOrderIds! }); + + return { + ...current, + orderedFolderIds: current.dragOrderIds, + draggedIndex: undefined, + }; + }); + }, [sortChatFolders]); + const canCreateNewFolder = useMemo(() => { return !isPremium || Object.keys(foldersById).length < maxFolders - 1; }, [foldersById, isPremium, maxFolders]); @@ -161,60 +205,91 @@ const SettingsFoldersMain: FC = ({

{lang('Filters')}

- {userFolders?.length ? userFolders.map((folder, i) => { - const isBlocked = i > maxFolders - 1; - if (folder.id === ALL_FOLDER_ID) { - return ( - - {folder.title} - - ); - } +
+ {userFolders?.length ? userFolders.map((folder, i) => { + const isBlocked = i > maxFolders - 1; + const isDragged = state.draggedIndex === i; + const draggedTop = (state.orderedFolderIds?.indexOf(folder.id) ?? 0) * FOLDER_HEIGHT_PX; + const top = (state.dragOrderIds?.indexOf(folder.id) ?? 0) * FOLDER_HEIGHT_PX; - return ( - { - openDeleteChatFolderModal({ folderId: folder.id }); - }, - destructive: true, - title: lang('Delete'), - icon: 'delete', - }, - ]} - // eslint-disable-next-line react/jsx-no-bind - onClick={() => { - if (isBlocked) { - openLimitReachedModal({ - limit: 'dialogFilters', - }); - } else { - onEditFolder(foldersById[folder.id]); - } - }} - > - - {folder.title} - {isBlocked && } - - {folder.subtitle} - - ); - }) : userFolders && !userFolders.length ? ( -

- You have no folders yet. -

- ) : } + if (folder.id === ALL_FOLDER_ID) { + return ( + + + + {folder.title} + + {lang('FoldersAllChatsDesc')} + + + ); + } + + return ( + + { + openDeleteChatFolderModal({ folderId: folder.id }); + }, + destructive: true, + title: lang('Delete'), + icon: 'delete', + }, + ]} + // eslint-disable-next-line react/jsx-no-bind + onClick={() => { + if (isBlocked) { + openLimitReachedModal({ + limit: 'dialogFilters', + }); + } else { + onEditFolder(foldersById[folder.id]); + } + }} + > + + {folder.title} + {isBlocked && } + + {folder.subtitle} + + + ); + }) : userFolders && !userFolders.length ? ( +

+ You have no folders yet. +

+ ) : } +
{(recommendedChatFolders && Boolean(recommendedChatFolders.length)) && ( @@ -258,13 +333,13 @@ const SettingsFoldersMain: FC = ({ export default memo(withGlobal( (global): StateProps => { const { - orderedIds: orderedFolderIds, + orderedIds: folderIds, byId: foldersById, recommended: recommendedChatFolders, } = global.chatFolders; return { - orderedFolderIds, + folderIds, foldersById, isPremium: selectIsCurrentUserPremium(global), recommendedChatFolders, @@ -272,3 +347,7 @@ export default memo(withGlobal( }; }, )(SettingsFoldersMain)); + +function inRange(x: number, min: number, max: number) { + return x >= min && x <= max; +} diff --git a/src/components/ui/Draggable.module.scss b/src/components/ui/Draggable.module.scss new file mode 100644 index 00000000..1887a2f1 --- /dev/null +++ b/src/components/ui/Draggable.module.scss @@ -0,0 +1,43 @@ +.container { + position: absolute; + width: 100%; +} + +.isDragging { + z-index: 2; + + > *:not(.knob) { + pointer-events: none; + } +} + +.knob { + position: absolute; + top: 50%; + width: 2rem; + height: 2rem; + + color: var(--color-text-secondary); + font-size: 1.25rem; + line-height: 1.75; + text-align: center; + opacity: 0; + transition: opacity 150ms; + + cursor: grab !important; + transform: translateY(-50%); + + .container:hover & { + opacity: 1; + } + + .isDragging & { + opacity: 1; + cursor: grabbing !important; + } + + @media (pointer: coarse) { + opacity: 1 !important; + touch-action: none; + } +} diff --git a/src/components/ui/Draggable.tsx b/src/components/ui/Draggable.tsx new file mode 100644 index 00000000..02b917fd --- /dev/null +++ b/src/components/ui/Draggable.tsx @@ -0,0 +1,189 @@ +import React, { + memo, useCallback, useEffect, useMemo, useRef, useState, +} from '../../lib/teact/teact'; + +import type { FC } from '../../lib/teact/teact'; + +import buildClassName from '../../util/buildClassName'; + +import styles from './Draggable.module.scss'; +import useLang from '../../hooks/useLang'; +import buildStyle from '../../util/buildStyle'; + +type TPoint = { + x: number; + y: number; +}; + +type DraggableState = { + isDragging: boolean; + origin: TPoint; + translation: TPoint; + width?: number; + height?: number; +}; + +type OwnProps = { + children: React.ReactNode; + onDrag: (translation: TPoint, id: number) => void; + onDragEnd: NoneToVoidFunction; + id: number; + style?: string; + knobStyle?: string; + isDisabled?: boolean; +}; + +const ZERO_POINT: TPoint = { x: 0, y: 0 }; + +const Draggable: FC = ({ + children, + id, + onDrag, + onDragEnd, + style: externalStyle, + knobStyle, + isDisabled, +}) => { + const lang = useLang(); + // eslint-disable-next-line no-null/no-null + const ref = useRef(null); + + const [state, setState] = useState({ + isDragging: false, + origin: ZERO_POINT, + translation: ZERO_POINT, + }); + + const handleMouseDown = (e: React.MouseEvent | React.TouchEvent) => { + e.stopPropagation(); + e.preventDefault(); + const { x, y } = getClientCoordinate(e); + + setState({ + ...state, + isDragging: true, + origin: { x, y }, + width: ref.current?.offsetWidth, + height: ref.current?.offsetHeight, + }); + }; + + const handleMouseMove = useCallback((e: MouseEvent | TouchEvent) => { + const { x, y } = getClientCoordinate(e); + + const translation = { + x: x - state.origin.x, + y: y - state.origin.y, + }; + + setState((current) => ({ + ...current, + translation, + })); + + onDrag(translation, id); + }, [id, onDrag, state.origin.x, state.origin.y]); + + const handleMouseUp = useCallback(() => { + requestAnimationFrame(() => { + setState((current) => ({ + ...current, + isDragging: false, + width: undefined, + height: undefined, + })); + + onDragEnd(); + }); + }, [onDragEnd]); + + useEffect(() => { + if (state.isDragging && isDisabled) { + setState((current) => ({ + ...current, + isDragging: false, + width: undefined, + height: undefined, + })); + } + }, [isDisabled, state.isDragging]); + + useEffect(() => { + if (state.isDragging) { + window.addEventListener('touchmove', handleMouseMove); + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('touchend', handleMouseUp); + window.addEventListener('touchcancel', handleMouseUp); + window.addEventListener('mouseup', handleMouseUp); + } else { + window.removeEventListener('touchmove', handleMouseMove); + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('touchend', handleMouseUp); + window.removeEventListener('touchcancel', handleMouseUp); + window.removeEventListener('mouseup', handleMouseUp); + + setState((current) => ({ + ...current, + translation: ZERO_POINT, + })); + } + + return () => { + if (state.isDragging) { + window.removeEventListener('touchmove', handleMouseMove); + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('touchend', handleMouseUp); + window.removeEventListener('touchcancel', handleMouseUp); + window.removeEventListener('mouseup', handleMouseUp); + } + }; + }, [handleMouseMove, handleMouseUp, state.isDragging]); + + const fullClassName = buildClassName(styles.container, state.isDragging && styles.isDragging); + + const cssStyles = useMemo(() => { + return buildStyle( + `transform: translate(${state.translation.x}px, ${state.translation.y}px)`, + state.width ? `width: ${state.width}px` : undefined, + state.height ? `height: ${state.height}px` : undefined, + externalStyle, + ); + }, [externalStyle, state.height, state.translation.x, state.translation.y, state.width]); + + return ( +
+ {children} + + {!isDisabled && ( +
+ +
+ )} +
+ ); +}; + +export default memo(Draggable); + +function getClientCoordinate(e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) { + let x; + let y; + + if ('touches' in e) { + x = e.touches[0].clientX; + y = e.touches[0].clientY; + } else { + x = e.clientX; + y = e.clientY; + } + + return { x, y }; +} diff --git a/src/config.ts b/src/config.ts index 2946c632..b4fe4d17 100644 --- a/src/config.ts +++ b/src/config.ts @@ -38,7 +38,7 @@ export const MEDIA_PROGRESSIVE_CACHE_DISABLED = false; export const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive'; export const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB export const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg'; -export const LANG_CACHE_NAME = 'tt-lang-packs-v10'; +export const LANG_CACHE_NAME = 'tt-lang-packs-v11'; export const ASSET_CACHE_NAME = 'tt-assets'; export const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500]; diff --git a/src/global/actions/api/chats.ts b/src/global/actions/api/chats.ts index 77ec733c..f6be3957 100644 --- a/src/global/actions/api/chats.ts +++ b/src/global/actions/api/chats.ts @@ -491,6 +491,22 @@ addActionHandler('addChatFolder', (global, actions, payload) => { void createChatFolder(folder, maxId); }); +addActionHandler('sortChatFolders', async (global, actions, payload) => { + const { folderIds } = payload!; + + const result = await callApi('sortChatFolders', folderIds); + if (result) { + global = getGlobal(); + setGlobal({ + ...global, + chatFolders: { + ...global.chatFolders, + orderedIds: folderIds, + }, + }); + } +}); + addActionHandler('deleteChatFolder', (global, actions, payload) => { const { id } = payload!; const folder = selectChatFolder(global, id); diff --git a/src/global/types.ts b/src/global/types.ts index 6ce045f1..06e3fced 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -1052,6 +1052,7 @@ export interface ActionPayloads { // Settings requestNextSettingsScreen: SettingsScreens; + sortChatFolders: { folderIds: number[] }; closeDeleteChatFolderModal: never; openDeleteChatFolderModal: { folderId: number }; loadGlobalPrivacySettings: never; diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index 0b834838..6778ad07 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -1143,6 +1143,7 @@ messages.getPollVotes#b86e380e flags:# peer:InputPeer id:int option:flags.0?byte messages.getDialogFilters#f19ed96d = Vector; messages.getSuggestedDialogFilters#a29cd42c = Vector; messages.updateDialogFilter#1ad4a04a flags:# id:int filter:flags.0?DialogFilter = Bool; +messages.updateDialogFiltersOrder#c563c1e4 order:Vector = Bool; messages.getReplies#22ddd30c peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages; messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage; messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index 95edc08c..5977e12d 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -146,6 +146,7 @@ "messages.getDialogFilters", "messages.getSuggestedDialogFilters", "messages.updateDialogFilter", + "messages.updateDialogFiltersOrder", "messages.getReplies", "messages.getDiscussionMessage", "messages.readDiscussion", diff --git a/src/styles/Telegram T.json b/src/styles/Telegram T.json index a13656f3..be51033b 100644 --- a/src/styles/Telegram T.json +++ b/src/styles/Telegram T.json @@ -2,7 +2,7 @@ "metadata": { "name": "Telegram T", "lastOpened": 0, - "created": 1654275522872 + "created": 1659146815066 }, "iconSets": [ { @@ -157,13 +157,21 @@ }, { "selection": [ + { + "order": 734, + "id": 76, + "name": "sort", + "prevSize": 32, + "code": 59820, + "tempChar": "" + }, { "order": 732, "id": 75, "name": "web", "prevSize": 32, "code": 59819, - "tempChar": "" + "tempChar": "" }, { "order": 731, @@ -171,7 +179,7 @@ "name": "transcribe", "prevSize": 32, "code": 59818, - "tempChar": "" + "tempChar": "" }, { "order": 719, @@ -179,7 +187,7 @@ "name": "add-one-badge", "prevSize": 32, "code": 59803, - "tempChar": "" + "tempChar": "" }, { "order": 720, @@ -187,7 +195,7 @@ "name": "chat-badge", "prevSize": 32, "code": 59808, - "tempChar": "" + "tempChar": "" }, { "order": 721, @@ -195,7 +203,7 @@ "name": "chats-badge", "prevSize": 32, "code": 59809, - "tempChar": "" + "tempChar": "" }, { "order": 722, @@ -203,7 +211,7 @@ "name": "double-badge", "prevSize": 32, "code": 59810, - "tempChar": "" + "tempChar": "" }, { "order": 723, @@ -211,7 +219,7 @@ "name": "file-badge", "prevSize": 32, "code": 59811, - "tempChar": "" + "tempChar": "" }, { "order": 724, @@ -219,7 +227,7 @@ "name": "folder-badge", "prevSize": 32, "code": 59812, - "tempChar": "" + "tempChar": "" }, { "order": 726, @@ -227,7 +235,7 @@ "name": "link-badge", "prevSize": 32, "code": 59813, - "tempChar": "" + "tempChar": "" }, { "order": 725, @@ -235,7 +243,7 @@ "name": "pin-badge", "prevSize": 32, "code": 59814, - "tempChar": "" + "tempChar": "" }, { "order": 727, @@ -243,7 +251,7 @@ "name": "premium", "prevSize": 32, "code": 59815, - "tempChar": "" + "tempChar": "" }, { "order": 728, @@ -251,7 +259,7 @@ "name": "unlock-badge", "prevSize": 32, "code": 59816, - "tempChar": "" + "tempChar": "" }, { "order": 729, @@ -259,7 +267,7 @@ "name": "lock-badge", "prevSize": 32, "code": 59817, - "tempChar": "" + "tempChar": "" }, { "order": 715, @@ -267,7 +275,7 @@ "name": "key", "prevSize": 32, "code": 59802, - "tempChar": "" + "tempChar": "" }, { "order": 714, @@ -275,7 +283,7 @@ "name": "heart-outline", "prevSize": 32, "code": 59806, - "tempChar": "" + "tempChar": "" }, { "order": 713, @@ -283,7 +291,7 @@ "name": "heart", "prevSize": 32, "code": 59807, - "tempChar": "" + "tempChar": "" }, { "order": 712, @@ -291,7 +299,7 @@ "name": "word-wrap", "prevSize": 32, "code": 59805, - "tempChar": "" + "tempChar": "" }, { "order": 708, @@ -299,7 +307,7 @@ "name": "webapp", "prevSize": 32, "code": 59795, - "tempChar": "" + "tempChar": "" }, { "order": 707, @@ -307,7 +315,7 @@ "name": "reload", "prevSize": 32, "code": 59796, - "tempChar": "" + "tempChar": "" }, { "order": 706, @@ -315,7 +323,7 @@ "name": "install", "prevSize": 32, "code": 59801, - "tempChar": "" + "tempChar": "" }, { "order": 705, @@ -323,7 +331,7 @@ "name": "favorite-filled", "prevSize": 32, "code": 59800, - "tempChar": "" + "tempChar": "" }, { "order": 702, @@ -331,7 +339,7 @@ "name": "share-screen", "prevSize": 32, "code": 59770, - "tempChar": "" + "tempChar": "" }, { "order": 701, @@ -339,7 +347,7 @@ "name": "video-outlined", "prevSize": 32, "code": 59799, - "tempChar": "" + "tempChar": "" }, { "order": 700, @@ -347,7 +355,7 @@ "name": "stats", "prevSize": 32, "code": 59798, - "tempChar": "" + "tempChar": "" }, { "order": 699, @@ -355,7 +363,7 @@ "name": "copy-media", "prevSize": 32, "code": 59797, - "tempChar": "" + "tempChar": "" }, { "order": 704, @@ -363,7 +371,7 @@ "name": "sidebar", "prevSize": 32, "code": 59794, - "tempChar": "" + "tempChar": "" }, { "order": 690, @@ -371,7 +379,7 @@ "name": "video-stop", "prevSize": 32, "code": 59787, - "tempChar": "" + "tempChar": "" }, { "order": 678, @@ -379,7 +387,7 @@ "name": "speaker", "prevSize": 32, "code": 59777, - "tempChar": "" + "tempChar": "" }, { "order": 679, @@ -387,7 +395,7 @@ "name": "speaker-outline", "prevSize": 32, "code": 59778, - "tempChar": "" + "tempChar": "" }, { "order": 680, @@ -395,7 +403,7 @@ "name": "phone-discard-outline", "prevSize": 32, "code": 59779, - "tempChar": "" + "tempChar": "" }, { "order": 681, @@ -403,7 +411,7 @@ "name": "allow-speak", "prevSize": 32, "code": 59780, - "tempChar": "" + "tempChar": "" }, { "order": 682, @@ -411,7 +419,7 @@ "name": "stop-raising-hand", "prevSize": 32, "code": 59781, - "tempChar": "" + "tempChar": "" }, { "order": 683, @@ -419,7 +427,7 @@ "name": "share-screen-outlined", "prevSize": 32, "code": 59782, - "tempChar": "" + "tempChar": "" }, { "order": 684, @@ -427,7 +435,7 @@ "name": "voice-chat", "prevSize": 32, "code": 59783, - "tempChar": "" + "tempChar": "" }, { "order": 689, @@ -435,7 +443,7 @@ "name": "video", "prevSize": 32, "code": 59784, - "tempChar": "" + "tempChar": "" }, { "order": 686, @@ -443,7 +451,7 @@ "name": "noise-suppression", "prevSize": 32, "code": 59785, - "tempChar": "" + "tempChar": "" }, { "order": 703, @@ -451,7 +459,7 @@ "name": "phone-discard", "prevSize": 32, "code": 59786, - "tempChar": "" + "tempChar": "" }, { "order": 667, @@ -459,7 +467,7 @@ "name": "bot-commands-filled", "prevSize": 32, "code": 59775, - "tempChar": "" + "tempChar": "" }, { "order": 664, @@ -467,7 +475,7 @@ "name": "reply-filled", "prevSize": 32, "code": 59776, - "tempChar": "" + "tempChar": "" }, { "order": 656, @@ -475,7 +483,7 @@ "name": "bug", "prevSize": 32, "code": 59774, - "tempChar": "" + "tempChar": "" }, { "order": 619, @@ -483,7 +491,7 @@ "name": "data", "prevSize": 32, "code": 59773, - "tempChar": "" + "tempChar": "" }, { "order": 622, @@ -491,7 +499,7 @@ "name": "darkmode", "prevSize": 32, "code": 59769, - "tempChar": "" + "tempChar": "" }, { "order": 711, @@ -499,7 +507,7 @@ "name": "animations", "prevSize": 32, "code": 59804, - "tempChar": "" + "tempChar": "" }, { "order": 626, @@ -507,7 +515,7 @@ "name": "enter", "prevSize": 32, "code": 59771, - "tempChar": "" + "tempChar": "" }, { "order": 627, @@ -515,7 +523,7 @@ "name": "fontsize", "prevSize": 32, "code": 59772, - "tempChar": "" + "tempChar": "" }, { "order": 630, @@ -523,7 +531,7 @@ "name": "permissions", "prevSize": 32, "code": 59766, - "tempChar": "" + "tempChar": "" }, { "order": 631, @@ -531,7 +539,7 @@ "name": "card", "prevSize": 32, "code": 59767, - "tempChar": "" + "tempChar": "" }, { "order": 634, @@ -539,7 +547,7 @@ "name": "truck", "prevSize": 32, "code": 59768, - "tempChar": "" + "tempChar": "" }, { "order": 663, @@ -547,7 +555,7 @@ "name": "share-filled", "prevSize": 32, "code": 59738, - "tempChar": "" + "tempChar": "" }, { "order": 638, @@ -555,7 +563,7 @@ "name": "bold", "prevSize": 32, "code": 59745, - "tempChar": "" + "tempChar": "" }, { "order": 639, @@ -563,7 +571,7 @@ "name": "bot-command", "prevSize": 32, "code": 59746, - "tempChar": "" + "tempChar": "" }, { "order": 642, @@ -571,7 +579,7 @@ "name": "calendar-filter", "prevSize": 32, "code": 59747, - "tempChar": "" + "tempChar": "" }, { "order": 643, @@ -579,7 +587,7 @@ "name": "comments", "prevSize": 32, "code": 59748, - "tempChar": "" + "tempChar": "" }, { "order": 645, @@ -587,7 +595,7 @@ "name": "comments-sticker", "prevSize": 32, "code": 59749, - "tempChar": "" + "tempChar": "" }, { "order": 646, @@ -595,7 +603,7 @@ "name": "arrow-down", "prevSize": 32, "code": 59750, - "tempChar": "" + "tempChar": "" }, { "order": 668, @@ -603,7 +611,7 @@ "name": "email", "prevSize": 32, "code": 59751, - "tempChar": "" + "tempChar": "" }, { "order": 648, @@ -611,7 +619,7 @@ "name": "italic", "prevSize": 32, "code": 59752, - "tempChar": "" + "tempChar": "" }, { "order": 620, @@ -619,7 +627,7 @@ "name": "link", "prevSize": 32, "code": 59753, - "tempChar": "" + "tempChar": "" }, { "order": 621, @@ -627,7 +635,7 @@ "name": "mention", "prevSize": 32, "code": 59754, - "tempChar": "" + "tempChar": "" }, { "order": 624, @@ -635,7 +643,7 @@ "name": "monospace", "prevSize": 32, "code": 59755, - "tempChar": "" + "tempChar": "" }, { "order": 625, @@ -643,7 +651,7 @@ "name": "next", "prevSize": 32, "code": 59756, - "tempChar": "" + "tempChar": "" }, { "order": 628, @@ -651,7 +659,7 @@ "name": "password-off", "prevSize": 32, "code": 59757, - "tempChar": "" + "tempChar": "" }, { "order": 629, @@ -659,7 +667,7 @@ "name": "pin-list", "prevSize": 32, "code": 59758, - "tempChar": "" + "tempChar": "" }, { "order": 632, @@ -667,7 +675,7 @@ "name": "previous", "prevSize": 32, "code": 59759, - "tempChar": "" + "tempChar": "" }, { "order": 633, @@ -675,7 +683,7 @@ "name": "replace", "prevSize": 32, "code": 59760, - "tempChar": "" + "tempChar": "" }, { "order": 636, @@ -683,7 +691,7 @@ "name": "schedule", "prevSize": 32, "code": 59761, - "tempChar": "" + "tempChar": "" }, { "order": 691, @@ -691,7 +699,7 @@ "name": "strikethrough", "prevSize": 32, "code": 59762, - "tempChar": "" + "tempChar": "" }, { "order": 692, @@ -699,7 +707,7 @@ "name": "underlined", "prevSize": 32, "code": 59763, - "tempChar": "" + "tempChar": "" }, { "order": 641, @@ -707,7 +715,7 @@ "name": "zoom-in", "prevSize": 32, "code": 59764, - "tempChar": "" + "tempChar": "" }, { "order": 649, @@ -715,20 +723,37 @@ "name": "zoom-out", "prevSize": 32, "code": 59765, - "tempChar": "" + "tempChar": "" } ], "id": 2, "metadata": { "name": "Untitled Set", "importSize": { - "width": 768, - "height": 768 + "width": 489, + "height": 489 } }, "height": 1024, "prevSize": 32, "icons": [ + { + "id": 76, + "paths": [ + "M543.839 668.139c-15.919-14.001-41.812-11.891-55.815 4.028l-147.687 166.483v-665.357c0-21.865-18.029-39.894-39.894-39.894s-39.894 18.029-39.894 39.894v665.357l-147.687-166.483c-15.919-15.919-39.894-18.029-55.815-4.028-15.919 15.919-18.029 39.894-4.028 55.815l217.503 243.396c16.303 20.138 45.074 17.070 57.925 0l219.421-243.396c14.001-15.728 12.084-41.812-4.028-55.815z", + "M970.979 301.033l-215.584-243.396c-19.18-19.371-43.155-20.523-59.841 0l-219.421 243.396c-14.001 15.919-11.891 41.812 4.028 55.815 24.551 19.565 49.293 6.138 55.815-4.028l147.687-166.483v663.439c0 21.865 18.029 39.894 39.894 39.894s39.894-15.919 39.894-37.976v-665.166l147.687 166.483c15.919 15.919 39.894 18.029 55.815 4.028 15.919-16.112 18.029-40.087 4.028-56.006z" + ], + "attrs": [ + {}, + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "sort" + ] + }, { "id": 75, "paths": [ @@ -3391,7 +3416,7 @@ "name": "select", "prevSize": 32, "code": 59744, - "tempChar": "" + "tempChar": "" }, { "order": 480, @@ -3399,7 +3424,7 @@ "name": "folder", "prevSize": 32, "code": 59667, - "tempChar": "" + "tempChar": "" }, { "order": 481, @@ -3407,7 +3432,7 @@ "name": "bots", "prevSize": 32, "code": 59669, - "tempChar": "" + "tempChar": "" }, { "order": 482, @@ -3415,7 +3440,7 @@ "name": "calendar", "prevSize": 32, "code": 59670, - "tempChar": "" + "tempChar": "" }, { "order": 483, @@ -3423,7 +3448,7 @@ "name": "cloud-download", "prevSize": 32, "code": 59671, - "tempChar": "" + "tempChar": "" }, { "order": 484, @@ -3431,7 +3456,7 @@ "name": "colorize", "prevSize": 32, "code": 59672, - "tempChar": "" + "tempChar": "" }, { "order": 651, @@ -3439,7 +3464,7 @@ "name": "forward", "prevSize": 32, "code": 59687, - "tempChar": "" + "tempChar": "" }, { "order": 650, @@ -3447,7 +3472,7 @@ "name": "reply", "prevSize": 32, "code": 59719, - "tempChar": "" + "tempChar": "" }, { "order": 487, @@ -3455,7 +3480,7 @@ "name": "help", "prevSize": 32, "code": 59690, - "tempChar": "" + "tempChar": "" }, { "order": 488, @@ -3463,7 +3488,7 @@ "name": "info", "prevSize": 32, "code": 59691, - "tempChar": "" + "tempChar": "" }, { "order": 489, @@ -3471,7 +3496,7 @@ "name": "info-filled", "prevSize": 32, "code": 59675, - "tempChar": "" + "tempChar": "" }, { "order": 490, @@ -3479,7 +3504,7 @@ "name": "delete-filled", "prevSize": 32, "code": 59676, - "tempChar": "" + "tempChar": "" }, { "order": 491, @@ -3487,7 +3512,7 @@ "name": "delete", "prevSize": 32, "code": 59677, - "tempChar": "" + "tempChar": "" }, { "order": 492, @@ -3495,7 +3520,7 @@ "name": "edit", "prevSize": 32, "code": 59683, - "tempChar": "" + "tempChar": "" }, { "order": 493, @@ -3503,7 +3528,7 @@ "name": "new-chat-filled", "prevSize": 32, "code": 59705, - "tempChar": "" + "tempChar": "" }, { "order": 494, @@ -3511,7 +3536,7 @@ "name": "send", "prevSize": 32, "code": 59722, - "tempChar": "" + "tempChar": "" }, { "order": 495, @@ -3519,7 +3544,7 @@ "name": "send-outline", "prevSize": 32, "code": 59723, - "tempChar": "" + "tempChar": "" }, { "order": 496, @@ -3527,7 +3552,7 @@ "name": "add-user-filled", "prevSize": 32, "code": 59652, - "tempChar": "" + "tempChar": "" }, { "order": 497, @@ -3535,7 +3560,7 @@ "name": "add-user", "prevSize": 32, "code": 59653, - "tempChar": "" + "tempChar": "" }, { "order": 498, @@ -3543,7 +3568,7 @@ "name": "delete-user", "prevSize": 32, "code": 59678, - "tempChar": "" + "tempChar": "" }, { "order": 499, @@ -3551,7 +3576,7 @@ "name": "microphone", "prevSize": 32, "code": 59701, - "tempChar": "" + "tempChar": "" }, { "order": 500, @@ -3559,7 +3584,7 @@ "name": "microphone-alt", "prevSize": 32, "code": 59707, - "tempChar": "" + "tempChar": "" }, { "order": 501, @@ -3567,7 +3592,7 @@ "name": "poll", "prevSize": 32, "code": 59704, - "tempChar": "" + "tempChar": "" }, { "order": 502, @@ -3575,7 +3600,7 @@ "name": "revote", "prevSize": 32, "code": 59706, - "tempChar": "" + "tempChar": "" }, { "order": 503, @@ -3583,7 +3608,7 @@ "name": "photo", "prevSize": 32, "code": 59712, - "tempChar": "" + "tempChar": "" }, { "order": 504, @@ -3591,7 +3616,7 @@ "name": "document", "prevSize": 32, "code": 59679, - "tempChar": "" + "tempChar": "" }, { "order": 505, @@ -3599,7 +3624,7 @@ "name": "camera", "prevSize": 32, "code": 59662, - "tempChar": "" + "tempChar": "" }, { "order": 506, @@ -3607,7 +3632,7 @@ "name": "camera-add", "prevSize": 32, "code": 59663, - "tempChar": "" + "tempChar": "" }, { "order": 507, @@ -3615,7 +3640,7 @@ "name": "logout", "prevSize": 32, "code": 59698, - "tempChar": "" + "tempChar": "" }, { "order": 508, @@ -3623,7 +3648,7 @@ "name": "saved-messages", "prevSize": 32, "code": 59720, - "tempChar": "" + "tempChar": "" }, { "order": 509, @@ -3631,7 +3656,7 @@ "name": "settings", "prevSize": 32, "code": 59726, - "tempChar": "" + "tempChar": "" }, { "order": 652, @@ -3639,7 +3664,7 @@ "name": "phone", "prevSize": 32, "code": 59711, - "tempChar": "" + "tempChar": "" }, { "order": 653, @@ -3647,7 +3672,7 @@ "name": "attach", "prevSize": 32, "code": 59657, - "tempChar": "" + "tempChar": "" }, { "order": 512, @@ -3655,7 +3680,7 @@ "name": "copy", "prevSize": 32, "code": 59674, - "tempChar": "" + "tempChar": "" }, { "order": 513, @@ -3663,7 +3688,7 @@ "name": "channel", "prevSize": 32, "code": 59665, - "tempChar": "" + "tempChar": "" }, { "order": 514, @@ -3671,7 +3696,7 @@ "name": "group", "prevSize": 32, "code": 59689, - "tempChar": "" + "tempChar": "" }, { "order": 515, @@ -3679,7 +3704,7 @@ "name": "user", "prevSize": 32, "code": 59737, - "tempChar": "" + "tempChar": "" }, { "order": 516, @@ -3687,7 +3712,7 @@ "name": "non-contacts", "prevSize": 32, "code": 59688, - "tempChar": "" + "tempChar": "" }, { "order": 517, @@ -3695,7 +3720,7 @@ "name": "active-sessions", "prevSize": 32, "code": 59650, - "tempChar": "" + "tempChar": "" }, { "order": 518, @@ -3703,7 +3728,7 @@ "name": "admin", "prevSize": 32, "code": 59654, - "tempChar": "" + "tempChar": "" }, { "order": 519, @@ -3711,7 +3736,7 @@ "name": "download", "prevSize": 32, "code": 59681, - "tempChar": "" + "tempChar": "" }, { "order": 520, @@ -3719,7 +3744,7 @@ "name": "location", "prevSize": 32, "code": 59696, - "tempChar": "" + "tempChar": "" }, { "order": 521, @@ -3727,7 +3752,7 @@ "name": "stop", "prevSize": 32, "code": 59730, - "tempChar": "" + "tempChar": "" }, { "order": 523, @@ -3735,7 +3760,7 @@ "name": "archive", "prevSize": 32, "code": 59656, - "tempChar": "" + "tempChar": "" }, { "order": 524, @@ -3743,7 +3768,7 @@ "name": "unarchive", "prevSize": 32, "code": 59731, - "tempChar": "" + "tempChar": "" }, { "order": 525, @@ -3751,7 +3776,7 @@ "name": "readchats", "prevSize": 32, "code": 59699, - "tempChar": "" + "tempChar": "" }, { "order": 526, @@ -3759,7 +3784,7 @@ "name": "unread", "prevSize": 32, "code": 59735, - "tempChar": "" + "tempChar": "" }, { "order": 654, @@ -3767,7 +3792,7 @@ "name": "message", "prevSize": 32, "code": 59700, - "tempChar": "" + "tempChar": "" }, { "order": 659, @@ -3775,7 +3800,7 @@ "name": "lock", "prevSize": 32, "code": 59697, - "tempChar": "" + "tempChar": "" }, { "order": 529, @@ -3783,7 +3808,7 @@ "name": "unlock", "prevSize": 32, "code": 59732, - "tempChar": "" + "tempChar": "" }, { "order": 530, @@ -3791,7 +3816,7 @@ "name": "mute", "prevSize": 32, "code": 59703, - "tempChar": "" + "tempChar": "" }, { "order": 531, @@ -3799,7 +3824,7 @@ "name": "unmute", "prevSize": 32, "code": 59733, - "tempChar": "" + "tempChar": "" }, { "order": 532, @@ -3807,7 +3832,7 @@ "name": "pin", "prevSize": 32, "code": 59713, - "tempChar": "" + "tempChar": "" }, { "order": 533, @@ -3815,7 +3840,7 @@ "name": "unpin", "prevSize": 32, "code": 59734, - "tempChar": "" + "tempChar": "" }, { "order": 534, @@ -3823,7 +3848,7 @@ "name": "smallscreen", "prevSize": 32, "code": 59742, - "tempChar": "" + "tempChar": "" }, { "order": 535, @@ -3831,7 +3856,7 @@ "name": "fullscreen", "prevSize": 32, "code": 59743, - "tempChar": "" + "tempChar": "" }, { "order": 536, @@ -3839,7 +3864,7 @@ "name": "large-pause", "prevSize": 32, "code": 59694, - "tempChar": "" + "tempChar": "" }, { "order": 537, @@ -3847,7 +3872,7 @@ "name": "large-play", "prevSize": 32, "code": 59695, - "tempChar": "" + "tempChar": "" }, { "order": 538, @@ -3855,7 +3880,7 @@ "name": "pause", "prevSize": 32, "code": 59709, - "tempChar": "" + "tempChar": "" }, { "order": 539, @@ -3863,7 +3888,7 @@ "name": "play", "prevSize": 32, "code": 59715, - "tempChar": "" + "tempChar": "" }, { "order": 540, @@ -3871,7 +3896,7 @@ "name": "channelviews", "prevSize": 32, "code": 59666, - "tempChar": "" + "tempChar": "" }, { "order": 541, @@ -3879,7 +3904,7 @@ "name": "message-succeeded", "prevSize": 32, "code": 59648, - "tempChar": "" + "tempChar": "" }, { "order": 657, @@ -3887,7 +3912,7 @@ "name": "message-read", "prevSize": 32, "code": 59649, - "tempChar": "" + "tempChar": "" }, { "order": 543, @@ -3895,7 +3920,7 @@ "name": "message-pending", "prevSize": 32, "code": 59724, - "tempChar": "" + "tempChar": "" }, { "order": 544, @@ -3903,7 +3928,7 @@ "name": "message-failed", "prevSize": 32, "code": 59725, - "tempChar": "" + "tempChar": "" }, { "order": 545, @@ -3911,7 +3936,7 @@ "name": "favorite", "prevSize": 32, "code": 59710, - "tempChar": "" + "tempChar": "" }, { "order": 546, @@ -3919,7 +3944,7 @@ "name": "keyboard", "prevSize": 32, "code": 59716, - "tempChar": "" + "tempChar": "" }, { "order": 547, @@ -3927,7 +3952,7 @@ "name": "delete-left", "prevSize": 32, "code": 59717, - "tempChar": "" + "tempChar": "" }, { "order": 548, @@ -3935,7 +3960,7 @@ "name": "recent", "prevSize": 32, "code": 59718, - "tempChar": "" + "tempChar": "" }, { "order": 549, @@ -3943,7 +3968,7 @@ "name": "gifs", "prevSize": 32, "code": 59727, - "tempChar": "" + "tempChar": "" }, { "order": 550, @@ -3951,7 +3976,7 @@ "name": "stickers", "prevSize": 32, "code": 59739, - "tempChar": "" + "tempChar": "" }, { "order": 551, @@ -3959,7 +3984,7 @@ "name": "smile", "prevSize": 32, "code": 59728, - "tempChar": "" + "tempChar": "" }, { "order": 552, @@ -3967,7 +3992,7 @@ "name": "animals", "prevSize": 32, "code": 59655, - "tempChar": "" + "tempChar": "" }, { "order": 553, @@ -3975,7 +4000,7 @@ "name": "eats", "prevSize": 32, "code": 59682, - "tempChar": "" + "tempChar": "" }, { "order": 554, @@ -3983,7 +4008,7 @@ "name": "sport", "prevSize": 32, "code": 59729, - "tempChar": "" + "tempChar": "" }, { "order": 555, @@ -3991,7 +4016,7 @@ "name": "car", "prevSize": 32, "code": 59664, - "tempChar": "" + "tempChar": "" }, { "order": 556, @@ -3999,7 +4024,7 @@ "name": "lamp", "prevSize": 32, "code": 59692, - "tempChar": "" + "tempChar": "" }, { "order": 557, @@ -4007,7 +4032,7 @@ "name": "language", "prevSize": 32, "code": 59693, - "tempChar": "" + "tempChar": "" }, { "order": 558, @@ -4015,7 +4040,7 @@ "name": "flag", "prevSize": 32, "code": 59686, - "tempChar": "" + "tempChar": "" }, { "order": 559, @@ -4023,7 +4048,7 @@ "name": "more", "prevSize": 32, "code": 59702, - "tempChar": "" + "tempChar": "" }, { "order": 560, @@ -4031,7 +4056,7 @@ "name": "search", "prevSize": 32, "code": 59721, - "tempChar": "" + "tempChar": "" }, { "order": 561, @@ -4039,7 +4064,7 @@ "name": "remove", "prevSize": 32, "code": 59740, - "tempChar": "" + "tempChar": "" }, { "order": 562, @@ -4047,7 +4072,7 @@ "name": "add", "prevSize": 32, "code": 59651, - "tempChar": "" + "tempChar": "" }, { "order": 563, @@ -4055,7 +4080,7 @@ "name": "check", "prevSize": 32, "code": 59668, - "tempChar": "" + "tempChar": "" }, { "order": 564, @@ -4063,7 +4088,7 @@ "name": "close", "prevSize": 32, "code": 59673, - "tempChar": "" + "tempChar": "" }, { "order": 610, @@ -4071,7 +4096,7 @@ "name": "arrow-left", "prevSize": 32, "code": 59661, - "tempChar": "" + "tempChar": "" }, { "order": 566, @@ -4079,7 +4104,7 @@ "name": "arrow-right", "prevSize": 32, "code": 59708, - "tempChar": "" + "tempChar": "" }, { "order": 730, @@ -4087,7 +4112,7 @@ "name": "down", "prevSize": 32, "code": 59680, - "tempChar": "" + "tempChar": "" }, { "order": 568, @@ -4095,7 +4120,7 @@ "name": "up", "prevSize": 32, "code": 59736, - "tempChar": "" + "tempChar": "" }, { "order": 569, @@ -4103,7 +4128,7 @@ "name": "eye-closed", "prevSize": 32, "code": 59685, - "tempChar": "" + "tempChar": "" }, { "order": 570, @@ -4111,7 +4136,7 @@ "name": "eye", "prevSize": 32, "code": 59684, - "tempChar": "" + "tempChar": "" }, { "order": 571, @@ -4119,7 +4144,7 @@ "name": "muted", "prevSize": 32, "code": 59741, - "tempChar": "" + "tempChar": "" }, { "order": 572, @@ -4127,7 +4152,7 @@ "name": "avatar-archived-chats", "prevSize": 32, "code": 59658, - "tempChar": "" + "tempChar": "" }, { "order": 573, @@ -4135,7 +4160,7 @@ "name": "avatar-deleted-account", "prevSize": 32, "code": 59659, - "tempChar": "" + "tempChar": "" }, { "order": 574, @@ -4143,7 +4168,7 @@ "name": "avatar-saved-messages", "prevSize": 32, "code": 59660, - "tempChar": "" + "tempChar": "" }, { "order": 575, @@ -4151,7 +4176,7 @@ "name": "pinned-chat", "prevSize": 32, "code": 59714, - "tempChar": "" + "tempChar": "" } ], "prevSize": 32, diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 770f3593..befb49ea 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -51,6 +51,9 @@ .icon-volume-3:before { content: "\e991"; } +.icon-sort:before { + content: "\e9ac"; +} .icon-web:before { content: "\e9ab"; } diff --git a/src/util/fallbackLangPack.ts b/src/util/fallbackLangPack.ts index 2172d0cb..6ac9d9a4 100644 --- a/src/util/fallbackLangPack.ts +++ b/src/util/fallbackLangPack.ts @@ -1853,4 +1853,8 @@ export default { key: 'Settings.TipsUsername', value: 'TelegramTips', }, + FoldersAllChatsDesc: { + key: 'FoldersAllChatsDesc', + value: 'All unarchived chats', + }, } as ApiLangPack;