forked from mystiq/hydrogen-web
adjust m.direct when creating a DM
This commit is contained in:
parent
3adb2c3254
commit
ff46d382ac
3 changed files with 39 additions and 1 deletions
|
@ -624,8 +624,8 @@ export class Session {
|
||||||
// the room id. Replace the room being created with the synced room.
|
// the room id. Replace the room being created with the synced room.
|
||||||
if (roomBeingCreated.roomId && !!this.rooms.get(roomBeingCreated.roomId)) {
|
if (roomBeingCreated.roomId && !!this.rooms.get(roomBeingCreated.roomId)) {
|
||||||
this._tryReplaceRoomBeingCreated(roomBeingCreated.roomId, log);
|
this._tryReplaceRoomBeingCreated(roomBeingCreated.roomId, log);
|
||||||
|
await roomBeingCreated.adjustDirectMessageMapIfNeeded(this._user, this._storage, this._hsApi, log);
|
||||||
}
|
}
|
||||||
// TODO: if type is DM, then adjust the m.direct account data
|
|
||||||
});
|
});
|
||||||
return roomBeingCreated;
|
return roomBeingCreated;
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,6 +286,9 @@ export class HomeServerApi {
|
||||||
return this._post(`/createRoom`, {}, payload, options);
|
return this._post(`/createRoom`, {}, payload, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setAccountData(ownUserId: string, type: string, content: Record<string, any>, options?: IRequestOptions): IHomeServerRequest {
|
||||||
|
return this._put(`/user/${encodeURIComponent(ownUserId)}/account_data/${encodeURIComponent(type)}`, {}, content, options);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import {Request as MockRequest} from "../../mocks/Request.js";
|
import {Request as MockRequest} from "../../mocks/Request.js";
|
||||||
|
|
|
@ -26,6 +26,8 @@ import type {HomeServerApi} from "../net/HomeServerApi";
|
||||||
import type {ILogItem} from "../../logging/types";
|
import type {ILogItem} from "../../logging/types";
|
||||||
import type {Platform} from "../../platform/web/Platform";
|
import type {Platform} from "../../platform/web/Platform";
|
||||||
import type {IBlobHandle} from "../../platform/types/types";
|
import type {IBlobHandle} from "../../platform/types/types";
|
||||||
|
import type {User} from "../User";
|
||||||
|
import type {Storage} from "../storage/idb/Storage";
|
||||||
|
|
||||||
type CreateRoomPayload = {
|
type CreateRoomPayload = {
|
||||||
is_direct?: boolean;
|
is_direct?: boolean;
|
||||||
|
@ -217,4 +219,37 @@ export class RoomBeingCreated extends EventEmitter<{change: never}> {
|
||||||
this.options.avatar.blob.dispose();
|
this.options.avatar.blob.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async adjustDirectMessageMapIfNeeded(user: User, storage: Storage, hsApi: HomeServerApi, log: ILogItem): Promise<void> {
|
||||||
|
if (!this.options.invites || this.options.type !== RoomType.DirectMessage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const userId = this.options.invites[0];
|
||||||
|
const DM_MAP_TYPE = "m.direct";
|
||||||
|
await log.wrap("set " + DM_MAP_TYPE, async log => {
|
||||||
|
try {
|
||||||
|
const txn = await storage.readWriteTxn([storage.storeNames.accountData]);
|
||||||
|
let mapEntry;
|
||||||
|
try {
|
||||||
|
mapEntry = await txn.accountData.get(DM_MAP_TYPE);
|
||||||
|
if (!mapEntry) {
|
||||||
|
mapEntry = {type: DM_MAP_TYPE, content: {}};
|
||||||
|
}
|
||||||
|
const map = mapEntry.content;
|
||||||
|
const userRooms = map[userId];
|
||||||
|
// this is a new room id so no need to check if it's already there
|
||||||
|
userRooms.push(this._roomId);
|
||||||
|
txn.accountData.set(mapEntry);
|
||||||
|
await txn.complete();
|
||||||
|
} catch (err) {
|
||||||
|
txn.abort();
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
await hsApi.setAccountData(user.id, DM_MAP_TYPE, mapEntry.content, {log}).response();
|
||||||
|
} catch (err) {
|
||||||
|
// we can't really do anything else but logging here
|
||||||
|
log.catch(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue