mirror of
				https://github.com/vector-im/element-web.git
				synced 2025-10-31 00:01:23 +01:00 
			
		
		
		
	Stash
This commit is contained in:
		
							parent
							
								
									dbaa394d65
								
							
						
					
					
						commit
						271f544637
					
				| @ -61,8 +61,6 @@ const partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => { // [spaces, | |||||||
|     }, [[], []]); |     }, [[], []]); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const SpaceTagOrderingField = "org.matrix.mscXXXX.space"; |  | ||||||
| 
 |  | ||||||
| // For sorting space children using a validated `order`, `m.room.create`'s `origin_server_ts`, `room_id`
 | // For sorting space children using a validated `order`, `m.room.create`'s `origin_server_ts`, `room_id`
 | ||||||
| export const getChildOrder = (order: string, creationTs: number, roomId: string): Array<Many<ListIteratee<any>>> => { | export const getChildOrder = (order: string, creationTs: number, roomId: string): Array<Many<ListIteratee<any>>> => { | ||||||
|     let validatedOrder: string = null; |     let validatedOrder: string = null; | ||||||
| @ -98,7 +96,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> { | |||||||
|     private _activeSpace?: Room = null; |     private _activeSpace?: Room = null; | ||||||
|     private _suggestedRooms: ISuggestedRoom[] = []; |     private _suggestedRooms: ISuggestedRoom[] = []; | ||||||
|     private _invitedSpaces = new Set<Room>(); |     private _invitedSpaces = new Set<Room>(); | ||||||
|     private spaceOrderLocalEchoMap = new Map<string, number>(); |     private spaceOrderLocalEchoMap = new Map<string, string>(); | ||||||
| 
 | 
 | ||||||
|     public get invitedSpaces(): Room[] { |     public get invitedSpaces(): Room[] { | ||||||
|         return Array.from(this._invitedSpaces); |         return Array.from(this._invitedSpaces); | ||||||
| @ -477,11 +475,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> { | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEv?: MatrixEvent) => { |     private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEv?: MatrixEvent) => { | ||||||
|         if (!room.isSpaceRoom() || ev.getType() !== EventType.Tag) return; |         if (!room.isSpaceRoom() || ev.getType() !== EventType.SpaceOrder) return; | ||||||
| 
 | 
 | ||||||
|         this.spaceOrderLocalEchoMap.delete(room.roomId); // clear any local echo
 |         this.spaceOrderLocalEchoMap.delete(room.roomId); // clear any local echo
 | ||||||
|         const order = ev.getContent()?.tags?.[SpaceTagOrderingField]?.order; |         const order = ev.getContent()?.order; | ||||||
|         const lastOrder = lastEv?.getContent()?.tags?.[SpaceTagOrderingField]?.order; |         const lastOrder = lastEv?.getContent()?.order; | ||||||
|         if (order !== lastOrder) { |         if (order !== lastOrder) { | ||||||
|             this.notifyIfOrderChanged(); |             this.notifyIfOrderChanged(); | ||||||
|         } |         } | ||||||
| @ -625,15 +623,21 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> { | |||||||
|         childSpaces.forEach(s => this.traverseSpace(s.roomId, fn, includeRooms, newPath)); |         childSpaces.forEach(s => this.traverseSpace(s.roomId, fn, includeRooms, newPath)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private getSpaceTagOrdering = (space: Room): number | undefined => { |     private getSpaceTagOrdering = (space: Room): string | undefined => { | ||||||
|         if (this.spaceOrderLocalEchoMap.has(space.roomId)) return this.spaceOrderLocalEchoMap.get(space.roomId); |         if (this.spaceOrderLocalEchoMap.has(space.roomId)) return this.spaceOrderLocalEchoMap.get(space.roomId); | ||||||
|         return space.tags?.[SpaceTagOrderingField]?.order; |         const order = space.getAccountData(EventType.SpaceOrder)?.getContent()?.order; | ||||||
|  |         return typeof order === "string" ? order : undefined; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     private sortRootSpaces(spaces: Room[]): Room[] { |     private sortRootSpaces(spaces: Room[]): Room[] { | ||||||
|         return sortBy(spaces, [this.getSpaceTagOrdering, "roomId"]); |         return sortBy(spaces, [this.getSpaceTagOrdering, "roomId"]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private setRootSpaceOrder(space: Room, order: string): void { | ||||||
|  |         this.spaceOrderLocalEchoMap.set(space.roomId, order); | ||||||
|  |         this.matrixClient.setRoomAccountData(space.roomId, EventType.SpaceOrder, { order }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public moveRootSpace(fromIndex: number, toIndex: number): void { |     public moveRootSpace(fromIndex: number, toIndex: number): void { | ||||||
|         if ( |         if ( | ||||||
|             fromIndex < 0 || toIndex < 0 || |             fromIndex < 0 || toIndex < 0 || | ||||||
| @ -645,29 +649,43 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> { | |||||||
|         const space = this.rootSpaces[fromIndex]; |         const space = this.rootSpaces[fromIndex]; | ||||||
|         const orders = this.rootSpaces.map(this.getSpaceTagOrdering); |         const orders = this.rootSpaces.map(this.getSpaceTagOrdering); | ||||||
| 
 | 
 | ||||||
|         let prevOrder = orders[toIndex - 1]; |         let prevOrder: string; | ||||||
|         let nextOrder = orders[toIndex]; // accounts for downwards displacement of existing inhabitant of this index
 |         let nextOrder: string; | ||||||
| 
 | 
 | ||||||
|         if (prevOrder === undefined && nextOrder === undefined) { |         if (toIndex > fromIndex) { | ||||||
|             // TODO WHAT A PAIN
 |             prevOrder = toIndex >= 0 ? orders[toIndex] : "aaaaa"; | ||||||
|  |             nextOrder = toIndex <= orders.length ? orders[toIndex + 1] : "zzzzz"; | ||||||
|  |         } else { | ||||||
|  |             // accounts for downwards displacement of existing inhabitant of this index
 | ||||||
|  |             prevOrder = toIndex > 0 ? orders[toIndex - 1] : "aaaaa"; | ||||||
|  |             nextOrder = toIndex < orders.length ? orders[toIndex] : "zzzzz"; | ||||||
|         } |         } | ||||||
|  |         console.log("@@ start", {fromIndex, toIndex, orders, prevOrder, nextOrder}); | ||||||
| 
 | 
 | ||||||
|         prevOrder = prevOrder || 0.0; |         if (prevOrder === undefined) { | ||||||
|         nextOrder = nextOrder || 1.0; |             const firstUndefinedIndex = orders.indexOf(undefined); | ||||||
|  |             const numUndefined = orders.length - firstUndefinedIndex; | ||||||
|  |             const lastOrder = orders[firstUndefinedIndex - 1]; | ||||||
|  |             console.log("@@ precalc", {firstUndefinedIndex, numUndefined, lastOrder}); | ||||||
|  |             nextOrder = lastOrder + step; | ||||||
|  |             for (let i = firstUndefinedIndex; i < toIndex; i++, nextOrder += step) { | ||||||
|  |                 console.log("@@ preset", {i, nextOrder}); | ||||||
|  |                 this.setRootSpaceOrder(this.rootSpaces[i], nextOrder); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             prevOrder = nextOrder; | ||||||
|  |             nextOrder += step; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         if (prevOrder !== nextOrder) { |         if (prevOrder !== nextOrder) { | ||||||
|             const order = prevOrder + ((nextOrder - prevOrder) / 2); |             const order = prevOrder + ((nextOrder - prevOrder) / 2); | ||||||
|             this.spaceOrderLocalEchoMap.set(space.roomId, order); |             console.log("@@ set", {prevOrder, nextOrder, order}); | ||||||
|             this.matrixClient.setRoomAccountData(space.roomId, EventType.Tag, { |             this.setRootSpaceOrder(space, order); | ||||||
|                 tags: { |  | ||||||
|                     ...space.tags, |  | ||||||
|                     [SpaceTagOrderingField]: { order }, |  | ||||||
|                 }, |  | ||||||
|             }); |  | ||||||
|             this.notifyIfOrderChanged(); |  | ||||||
|         } else { |         } else { | ||||||
|             // TODO REBUILD
 |             // TODO REBUILD
 | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         this.notifyIfOrderChanged(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user