Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.8 KiB
114 lines
3.8 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import appDialogsManager, {AppDialogsManager, DialogDom} from '../lib/appManagers/appDialogsManager'; |
|
import {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck'; |
|
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'; |
|
import {AppManagers} from '../lib/appManagers/managers'; |
|
import getUserStatusString from './wrappers/getUserStatusString'; |
|
import type LazyLoadQueue from './lazyLoadQueue'; |
|
|
|
interface SortedUser extends SortedElementBase { |
|
dom: DialogDom |
|
} |
|
|
|
export default class SortedUserList extends SortedList<SortedUser> { |
|
protected static SORT_INTERVAL = 30e3; |
|
public list: HTMLUListElement; |
|
|
|
protected lazyLoadQueue: LazyLoadQueue; |
|
protected avatarSize = 48; |
|
protected rippleEnabled = true; |
|
protected autonomous = true; |
|
protected createChatListOptions: Parameters<AppDialogsManager['createChatList']>[0]; |
|
protected onListLengthChange: () => void; |
|
protected getIndex: (element: SortedUser) => number; |
|
protected onUpdate: (element: SortedUser) => void; |
|
protected managers: AppManagers; |
|
|
|
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'] |
|
}> & { |
|
managers: SortedUserList['managers'] |
|
}) { |
|
super({ |
|
getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)), |
|
onDelete: (element) => { |
|
element.dom.listEl.remove(); |
|
this.onListLengthChange && this.onListLengthChange(); |
|
}, |
|
onUpdate: options.onUpdate || (async(element) => { |
|
const status = getUserStatusString(await this.managers.appUsersManager.getUser(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({ |
|
peerId: base.id, |
|
container: 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(); |
|
} |
|
}
|
|
|