Stash
This commit is contained in:
parent
dbaa394d65
commit
271f544637
1 changed files with 40 additions and 22 deletions
|
@ -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…
Reference in a new issue