From 6445847af022aaf445f8da653d8270d2911789e3 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 5 Aug 2022 19:23:03 +0200 Subject: [PATCH] Settings / Folders: Support re-ordering (#1973) --- src/api/gramjs/methods/chats.ts | 6 + src/api/gramjs/methods/index.ts | 2 +- src/assets/fonts/icomoon.woff | Bin 48208 -> 48392 bytes src/assets/fonts/icomoon.woff2 | Bin 22648 -> 22788 bytes .../settings/folders/SettingsFolders.scss | 12 + .../settings/folders/SettingsFoldersMain.tsx | 203 +++++++--- src/components/ui/Draggable.module.scss | 43 +++ src/components/ui/Draggable.tsx | 189 +++++++++ src/config.ts | 2 +- src/global/actions/api/chats.ts | 16 + src/global/types.ts | 1 + src/lib/gramjs/tl/apiTl.js | 1 + src/lib/gramjs/tl/static/api.json | 1 + src/styles/Telegram T.json | 363 ++++++++++-------- src/styles/icons.scss | 3 + src/util/fallbackLangPack.ts | 4 + 16 files changed, 613 insertions(+), 233 deletions(-) create mode 100644 src/components/ui/Draggable.module.scss create mode 100644 src/components/ui/Draggable.tsx diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 7baf0bb31..4e3ffc17c 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 302ada0f3..c1bab2ee6 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 5ad06c7c3681c1ac283e0cf18830b067db41a6d0..c4d15655ab5d5c233773bda057201cb21b334de8 100644 GIT binary patch delta 489 zcmcccgQ?>elSsM0n;Qco0}$-xVBiMPd-hBe(XPLooSRs{z`&RR6bS)g@vzIr>50W4 zu{}UO2NVmW=TxQv#f~sAZ21Ag8KLfPGEx&$7#OyJ)R}>>qRHvT44@!T>bP^ zSn@M+ODY%`wo5QDFah;59oc!qvn?k-8K}-~=N+J-KtmW)Jk!hFauX|n7VmZdYE%H@ z{fu|=5_405VhKPsZ6G|;i}QCuesKxV2QMc6@n>8!*@w}aan0r#jD=h3nHWs}KW0A7 zT*x5JU=CER#>USmXriX9#3m}JuE)sE$0*MzW@gW5rl!uQuBOD#$R;KZ;tPt185^0I z3X01yn%gm|Gb!*Wa!(N#6cC@nqrk(%#C3~Dh4T&<6A$C+8+?j9AeOKKE3yJcelBL7 zWf4p>1;xb$|E4eFVdetr{KC)7^95)WWBzA;{?9y0T>RV|%l>8xii-*|%>=692C4zN z66jSRo}%@7Z9KotR|aktpa28IeJ}n^U$OU}6Evnr>FvnZ(EuRRh+$ KadY3ULyQ1{f^|m# delta 323 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 bh=_=Y00000003CA>Oj*ClUQKc%>w`cm-G?w literal 22648 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 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 000000000..1887a2f1c --- /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 000000000..02b917fdb --- /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 2946c632f..b4fe4d17a 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 77ec733c4..f6be39575 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 6ce045f12..06e3fcedd 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 0b834838f..6778ad076 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 95edc08c9..5977e12db 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 a13656f3b..be51033b8 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 770f35931..befb49ead 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 2172d0cb4..6ac9d9a46 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;