5189.js (13486B)
1 "use strict";(self.webpackChunkelement_web=self.webpackChunkelement_web||[]).push([[5189],{"./src/stores/room-list-v3/RoomListStoreV3.ts"(e,t,s){s.d(t,{LISTS_LOADED_EVENT:()=>V,LISTS_UPDATE_EVENT:()=>D,K:()=>z,default:()=>O});var o=s("./node_modules/@babel/runtime/helpers/esm/defineProperty.js"),i=s("./node_modules/matrix-js-sdk/src/logger.ts"),r=s("./node_modules/matrix-js-sdk/src/matrix.ts"),n=s("./src/stores/AsyncStoreWithClient.ts"),a=s("./src/settings/SettingsStore.ts"),c=s("./src/stores/room-list/filters/VisibilityProvider.ts"),l=s("./src/dispatcher/dispatcher.ts"),m=s("./src/stores/spaces/SpaceStore.ts");class h{constructor(e){(0,o.A)(this,"_isInActiveSpace",!1),(0,o.A)(this,"next",[]),(0,o.A)(this,"previous",[]),(0,o.A)(this,"filterKeysSet",new Set),this.room=e}get isInActiveSpace(){return this._isInActiveSpace}checkIfRoomBelongsToActiveSpace(){const e=m.Ay.instance.activeSpace;this._isInActiveSpace=m.Ay.instance.isRoomInSpace(e,this.room.roomId)}doesRoomMatchFilters(e){return!e.some(e=>!this.filterKeysSet.has(e))}applyFilters(e){this.filterKeysSet=new Set;for(const t of e)t.matches(this.room)&&this.filterKeysSet.add(t.key)}}function d(){return Math.random()<.5}class u{get size(){return this._size}constructor(e){(0,o.A)(this,"head",void 0),(0,o.A)(this,"current",void 0),(0,o.A)(this,"_size",0),this.level=e}setNext(e){this.head||(this.head=e),this.current?(e.previous[this.level]=this.current,this.current.next[this.level]=e,this.current=e):this.current=e,this._size++}generateNextLevel(){const e=new u(this.level+1);let t=this.head;for(;t;)d()&&e.setNext(t),t=t.next[this.level];return e}removeNode(e){if(!(this.head===e||e.previous[this.level]))return;const t=e.previous[this.level];if(t){const s=e.next[this.level];t.next[this.level]=s,s&&(s.previous[this.level]=t)}else{const t=e.next[this.level];this.head=t,t&&(t.previous[this.level]=e.previous[this.level])}this._size--}insertAfter(e,t){const s=this.level,o=e.next[s];o&&(t.next[s]=o,o.previous[s]=t),e.next[s]=t,t.previous[s]=e,this._size++}insertAtHead(e){const t=this.head;this.head=e,t&&(e.next[this.level]=t,t.previous[this.level]=e),this._size++}}class v{constructor(e){this.current=e}next(){const e=this.current;return e?(this.current=e.next[0],{value:e.room}):{value:void 0,done:!0}}}class p{constructor(e,t){this.current=e,this.filters=t}[Symbol.iterator](){return this}next(){let e=this.current;for(;e&&(!e.isInActiveSpace||!e.doesRoomMatchFilters(this.filters));)e=e.next[0];return e?(this.current=e.next[0],{value:e.room}):{value:void 0,done:!0}}}class g{constructor(e,t=[]){(0,o.A)(this,"levels",[new u(0)]),(0,o.A)(this,"roomNodeMap",new Map),(0,o.A)(this,"initialized",!1),this.sorter=e,this.filters=t}reset(){this.levels=[new u(0)],this.roomNodeMap=new Map}seed(e){const t=this.sorter.sort(e).map(e=>new h(e));let s=this.levels[0];for(const e of t)e.applyFilters(this.filters),s.setNext(e),this.roomNodeMap.set(e.room.roomId,e);do{this.levels[s.level]=s,s=s.generateNextLevel()}while(s.size>1);this.calculateActiveSpaceForNodes(),this.initialized=!0}calculateActiveSpaceForNodes(){for(const e of this.roomNodeMap.values())e.checkIfRoomBelongsToActiveSpace()}useNewSorter(e,t){this.reset(),this.sorter=e,this.seed(t)}removeRoom(e){const t=this.roomNodeMap.get(e.roomId);if(this.roomNodeMap.delete(e.roomId),t)for(const e of this.levels)e.removeNode(t)}reInsertRoom(e){this.roomNodeMap.has(e.roomId)&&(this.removeRoom(e),this.addNewRoom(e))}addNewRoom(e){if(this.roomNodeMap.has(e.roomId))throw new Error(`Can't add room to skiplist: ${e.roomId} is already in the skiplist!`);this.insertRoom(e)}insertRoom(e){const t=new h(e);t.checkIfRoomBelongsToActiveSpace(),t.applyFilters(this.filters),this.roomNodeMap.set(e.roomId,t);const s=[];for(let t=this.levels.length-1;t>=0;--t){const o=this.levels[t];if(!o.head){s[t]=null;continue}let i=o.head,r=null;for(;i&&this.sorter.comparator(i.room,e)<0;)r=i,i=i.next[t];s[t]=r}for(const[e,o]of s.entries()){if(0!==e&&!d())break;{const s=this.levels[e];o?s.insertAfter(o,t):s.insertAtHead(t)}}}[Symbol.iterator](){return new v(this.levels[0].head)}getRoomsInActiveSpace(e=[]){return new p(this.levels[0].head,e)}get size(){return this.levels[0].size}get activeSortAlgorithm(){return this.sorter.type}}var f=s("./src/stores/room-list-v3/skip-list/sorters/index.ts"),S=s("./src/stores/notifications/RoomNotificationStateStore.ts"),y=s("./src/stores/room-list/models.ts"),A=s("./src/utils/membership.ts"),R=s("./src/Unread.ts");function w(e){const t=e.getType(),s=e.getContent(),o=e.getPrevContent();return t===r.EventType.RoomMember&&o.membership!==s.membership||(t!==r.EventType.RoomMember||o.displayname===s.displayname)&&(t!==r.EventType.RoomMember||o.avatar_url===s.avatar_url)}class k{constructor(e){this.myUserId=e}sort(e){const t={};return[...e].sort((e,s)=>this.comparator(e,s,t))}comparator(e,t,s){const o=this.getScore(e)-this.getScore(t);if(0!==o)return o;const i=this.getTs(e,s);return this.getTs(t,s)-i}getTs(e,t){var s;const o=null!==(s=null==t?void 0:t[e.roomId])&&void 0!==s?s:((e,t)=>{const s=((s,o)=>{const i=e.getLiveTimeline().getEvents(),n=e.getBumpStamp();if(n)return n;if((0,A.Cs)(e.getMyMembership())!==A._T.Join){var a;const s=null===(a=e.getLiveTimeline().getState(r.EventTimeline.FORWARDS))||void 0===a?void 0:a.getStateEvents(r.EventType.RoomMember,t);if(s&&!Array.isArray(s))return s.getTs()}for(let s=i.length-1;s>=0;--s){const o=i[s];if(o.getTs()&&(o.getSender()===t&&w(o)||R.aA(e.client,o)))return o.getTs()}return null!==(s=null===(o=i[0])||void 0===o?void 0:o.getTs())&&void 0!==s?s:0})(),o=e.getThreads().map(e=>{var t,s;const o=null!==(t=e.replyToEvent)&&void 0!==t?t:e.rootEvent;return null!==(s=null==o?void 0:o.getTs())&&void 0!==s?s:0});return Math.max(s,...o)})(e,this.myUserId);return t&&(t[e.roomId]=o),o}}class I extends k{get type(){return f.U.Recency}getScore(e){const t=!!e.tags[y.zO.LowPriority],s=S.n.instance.getRoomState(e).muted;return s&&t?5:s?10:t?2:0}}class L{constructor(){(0,o.A)(this,"collator",new Intl.Collator)}sort(e){return[...e].sort((e,t)=>this.comparator(e,t))}comparator(e,t){return this.collator.compare(e.name,t.name)}get type(){return f.U.Alphabetic}}var x=s("./src/utils/read-receipts.ts"),M=s("./src/stores/spaces/index.ts"),b=s("./src/stores/room-list-v3/skip-list/filters/index.ts");var F=s("./src/utils/notifications.ts");var T=s("./src/utils/DMRoomMap.ts");var E=s("./src/settings/SettingLevel.ts"),_=s("./src/stores/room-list/utils/roomMute.ts"),C=s("./src/dispatcher/actions.ts"),N=s("./src/stores/CallStore.ts");class P extends k{get type(){return f.U.Unread}getScore(e){if(e.getMyMembership()===r.KnownMembership.Invite)return 100;const t=e.getType();if(!(t===r.RoomType.UnstableCall||t===r.RoomType.ElementVideo)&&N.e.instance.getCall(e.roomId))return 101;const s=S.n.instance.getRoomState(e);return s.isMention?102:s.hasUnreadCount||(0,F.nx)(e)?103:s.isActivityNotification?104:e.tags[y.zO.LowPriority]?106:s.muted?107:105}}const U=[new class{matches(e){return!!e.tags[y.zO.Favourite]}get key(){return b.M.FavouriteFilter}},new class{matches(e){return S.n.instance.getRoomState(e).hasUnreadCount||!!(0,F.nx)(e)}get key(){return b.M.UnreadFilter}},new class{matches(e){return!!T.A.shared().getUserIdForRoomId(e.roomId)}get key(){return b.M.PeopleFilter}},new class{matches(e){return!T.A.shared().getUserIdForRoomId(e.roomId)}get key(){return b.M.RoomsFilter}},new class{matches(e){return e.getMyMembership()===r.KnownMembership.Invite}get key(){return b.M.InvitesFilter}},new class{matches(e){return S.n.instance.getRoomState(e).isMention}get key(){return b.M.MentionsFilter}},new class{matches(e){return!!e.tags[y.zO.LowPriority]}get key(){return b.M.LowPriorityFilter}}];let z=function(e){return e.ListsUpdate="lists_update",e.ListsLoaded="lists_loaded",e}({});const D=z.ListsUpdate,V=z.ListsLoaded;class K extends n.r{constructor(e){super(e),(0,o.A)(this,"roomSkipList",void 0),(0,o.A)(this,"msc3946ProcessDynamicPredecessor",void 0),this.msc3946ProcessDynamicPredecessor=a.A.getValue("feature_dynamic_room_predecessors"),m.Ay.instance.on(M.tw,()=>{this.onActiveSpaceChanged()}),m.Ay.instance.on(M.EC,()=>this.onActiveSpaceChanged())}getRooms(){var e,t;let s=null!==(e=null===(t=this.matrixClient)||void 0===t?void 0:t.getVisibleRooms(this.msc3946ProcessDynamicPredecessor))&&void 0!==e?e:[];return s=s.filter(e=>c.W.instance.isRoomVisible(e)),s}get isLoadingRooms(){var e;return!(null!==(e=this.roomSkipList)&&void 0!==e&&e.initialized)}getSortedRooms(){var e;return null!==(e=this.roomSkipList)&&void 0!==e&&e.initialized?Array.from(this.roomSkipList):[]}getSortedRoomsInActiveSpace(e){var t;const s=m.Ay.instance.activeSpace;return null!==(t=this.roomSkipList)&&void 0!==t&&t.initialized?{spaceId:s,filterKeys:e,rooms:Array.from(this.roomSkipList.getRoomsInActiveSpace(e))}:{spaceId:s,filterKeys:e,rooms:[]}}resort(e){if(!this.roomSkipList)throw new Error("Cannot resort room list before skip list is created.");if(!this.matrixClient)throw new Error("Cannot resort room list without matrix client.");if(this.roomSkipList.activeSortAlgorithm===e)return;const t=this.getSorterFromSortingAlgorithm(e,this.matrixClient.getSafeUserId());this.roomSkipList.useNewSorter(t,this.getRooms()),this.emit(D),a.A.setValue("RoomList.preferredSorting",null,E.p.DEVICE,e)}get activeSortAlgorithm(){var e;return null===(e=this.roomSkipList)||void 0===e?void 0:e.activeSortAlgorithm}async onReady(){var e;if(null!==(e=this.roomSkipList)&&void 0!==e&&e.initialized||!this.matrixClient)return;const t=this.getPreferredSorter(this.matrixClient.getSafeUserId());this.roomSkipList=new g(t,U),await m.Ay.instance.storeReadyPromise;const s=this.getRooms();this.roomSkipList.seed(s),this.emit(V),this.emit(D)}async onNotReady(){this.roomSkipList=void 0}async onAction(e){var t;if(this.matrixClient&&null!==(t=this.roomSkipList)&&void 0!==t&&t.initialized)switch(e.action){case"MatrixActions.Room.receipt":if((0,x.A)(e.event,this.matrixClient)){const t=e.room;if(!t)return void i.vF.warn(`Own read receipt was in unknown room ${t.roomId}`);this.addRoomAndEmit(t)}break;case"MatrixActions.Room.tags":{const t=e.room;this.addRoomAndEmit(t);break}case"MatrixActions.Room.accountData":{const t=e.event_type;if(t===F.uk||t===F.HG){const t=e.room;this.addRoomAndEmit(t)}break}case"MatrixActions.Event.decrypted":{const t=e.event.getRoomId();if(!t)return;const s=this.matrixClient.getRoom(t);if(!s)return void i.vF.warn(`Event ${e.event.getId()} was decrypted in an unknown room ${t}`);this.addRoomAndEmit(s);break}case"MatrixActions.accountData":this.handleAccountDataPayload(e);break;case"MatrixActions.Room.timeline":if(!e.isLiveEvent||!e.isLiveUnfilteredRoomTimelineEvent||!e.room)return;this.addRoomAndEmit(e.room);break;case"MatrixActions.Room.myMembership":{var s;const t=(0,A.Cs)(e.oldMembership),o=(0,A.E3)(e.room,e.membership),i=this.matrixClient.getSafeUserId();if(null===(s=e.room.getMember(i))||void 0===s?void 0:s.isKicked())return void this.addRoomAndEmit(e.room);if((t===A._T.Invite||t===A._T.Join)&&o===A._T.Leave)return this.roomSkipList.removeRoom(e.room),void this.emit(D);if(t!==A._T.Join&&o===A._T.Join){const t=e.room,s=t.client.getRoomUpgradeHistory(t.roomId,!0,this.msc3946ProcessDynamicPredecessor),o=s.slice(0,s.indexOf(t));for(const e of o)this.roomSkipList.removeRoom(e)}this.addRoomAndEmit(e.room,t===A._T.Leave);break}case C.r.AfterForgetRoom:{const t=e.room;this.roomSkipList.removeRoom(t),this.emit(D);break}}}handleAccountDataPayload(e){let t=!1;switch(e.event_type){case r.EventType.Direct:{const s=e.event.getContent();for(const e of Object.keys(s)){const o=s[e];for(const e of o){const s=this.matrixClient.getRoom(e);s?(this.roomSkipList.reInsertRoom(s),t=!0):i.vF.warn(`${e} was found in DMs but the room is not in the store`)}}break}case r.EventType.PushRules:{const s=(0,_.Q)(e);if(!s)return;const o=s.map(e=>{var t;return null===(t=this.matrixClient)||void 0===t?void 0:t.getRoom(e)}).filter(e=>!!e);for(const e of o)this.roomSkipList.reInsertRoom(e),t=!0;break}}t&&this.emit(D)}getPreferredSorter(e){const t=a.A.getValue("RoomList.preferredSorting");return this.getSorterFromSortingAlgorithm(t,e)}getSorterFromSortingAlgorithm(e,t){switch(e){case f.U.Alphabetic:return new L;case f.U.Recency:return new I(t);case f.U.Unread:return new P(t);default:return i.vF.info(`RoomListStoreV3: There is no sorting implementation for algorithm ${e}, defaulting to recency sorter`),new I(t)}}addRoomAndEmit(e,t=!1){if(!this.roomSkipList)throw new Error("roomSkipList hasn't been created yet!");if(t){if(!c.W.instance.isRoomVisible(e))return void i.vF.info(`RoomListStoreV3: Refusing to add new room ${e.roomId} because isRoomVisible returned false.`);this.roomSkipList.addNewRoom(e)}else this.roomSkipList.reInsertRoom(e);this.emit(D)}onActiveSpaceChanged(){this.roomSkipList&&(this.roomSkipList.calculateActiveSpaceForNodes(),this.emit(D))}}class O{static get instance(){if(!O.internalInstance){const e=new K(l.A);e.start(),O.internalInstance=e}return this.internalInstance}}(0,o.A)(O,"internalInstance",void 0),window.getRoomListStoreV3=()=>O.instance},"./src/stores/room-list-v3/skip-list/filters/index.ts"(e,t,s){s.d(t,{M:()=>o});let o=function(e){return e[e.FavouriteFilter=0]="FavouriteFilter",e[e.UnreadFilter=1]="UnreadFilter",e[e.PeopleFilter=2]="PeopleFilter",e[e.RoomsFilter=3]="RoomsFilter",e[e.LowPriorityFilter=4]="LowPriorityFilter",e[e.MentionsFilter=5]="MentionsFilter",e[e.InvitesFilter=6]="InvitesFilter",e}({})}}]); 2 //# sourceMappingURL=5189.js.map