mirror of
				https://github.com/vector-im/element-web.git
				synced 2025-11-04 02:02:14 +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});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (prevOrder === undefined) {
 | 
				
			||||||
 | 
					            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 = prevOrder || 0.0;
 | 
					            prevOrder = nextOrder;
 | 
				
			||||||
        nextOrder = nextOrder || 1.0;
 | 
					            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