/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import type { LazyLoadQueueIntersector } from "./lazyLoadQueue"; import appDialogsManager, { AppDialogsManager, DialogDom } from "../lib/appManagers/appDialogsManager"; import { getHeavyAnimationPromise } from "../hooks/useHeavyAnimationCheck"; import appUsersManager from "../lib/appManagers/appUsersManager"; import isInDOM from "../helpers/dom/isInDOM"; import positionElementByIndex from "../helpers/dom/positionElementByIndex"; import replaceContent from "../helpers/dom/replaceContent"; import { fastRaf } from "../helpers/schedulers"; import SortedList, { SortedElementBase } from "../helpers/sortedList"; import safeAssign from "../helpers/object/safeAssign"; interface SortedUser extends SortedElementBase { dom: DialogDom } export default class SortedUserList extends SortedList { protected static SORT_INTERVAL = 30e3; public list: HTMLUListElement; protected lazyLoadQueue: LazyLoadQueueIntersector; protected avatarSize = 48; protected rippleEnabled = true; protected autonomous = true; protected createChatListOptions: Parameters[0]; protected onListLengthChange: () => void; protected getIndex: (element: SortedUser) => number; protected onUpdate: (element: SortedUser) => void; constructor(options: Partial<{ lazyLoadQueue: SortedUserList['lazyLoadQueue'], avatarSize: SortedUserList['avatarSize'], rippleEnabled: SortedUserList['rippleEnabled'], createChatListOptions: SortedUserList['createChatListOptions'], autonomous: SortedUserList['autonomous'], onListLengthChange: SortedUserList['onListLengthChange'], getIndex: SortedUserList['getIndex'], onUpdate: SortedUserList['onUpdate'] }> = {}) { super({ getIndex: options.getIndex || ((element) => appUsersManager.getUserStatusForSort(element.id)), onDelete: (element) => { element.dom.listEl.remove(); this.onListLengthChange && this.onListLengthChange(); }, onUpdate: options.onUpdate || ((element) => { const status = appUsersManager.getUserStatusString(element.id); replaceContent(element.dom.lastMessageSpan, status); }), onSort: (element, idx) => { const willChangeLength = element.dom.listEl.parentElement !== this.list; positionElementByIndex(element.dom.listEl, this.list, idx); if(willChangeLength && this.onListLengthChange) { this.onListLengthChange(); } }, onElementCreate: (base) => { const {dom} = appDialogsManager.addDialogNew({ dialog: base.id, container: false, drawStatus: false, avatarSize: this.avatarSize, autonomous: this.autonomous, meAsSaved: false, rippleEnabled: this.rippleEnabled, lazyLoadQueue: this.lazyLoadQueue }); (base as SortedUser).dom = dom; return base as SortedUser; }, updateElementWith: fastRaf, updateListWith: async(callback) => { if(!isInDOM(this.list)) { return callback(false); } await getHeavyAnimationPromise(); if(!isInDOM(this.list)) { return callback(false); } callback(true); } }); safeAssign(this, options); this.list = appDialogsManager.createChatList(this.createChatListOptions); let timeout: number; const doTimeout = () => { timeout = window.setTimeout(() => { this.updateList((good) => { if(good) { doTimeout(); } }); }, SortedUserList.SORT_INTERVAL); }; doTimeout(); } }