This commit is contained in:
Bruno Windels 2022-02-07 16:30:44 +01:00
parent 0bb3cfcfad
commit e1fbd1242e
3 changed files with 30 additions and 38 deletions

View file

@ -83,7 +83,7 @@ export class MemberDetailsViewModel extends ViewModel {
} }
async openDirectMessage() { async openDirectMessage() {
const localId = await this._session.createRoom(RoomType.DirectMessage, undefined, undefined, undefined, [this.userId]); const roomBeingCreated = await this._session.createRoom(RoomType.DirectMessage, undefined, undefined, undefined, [this.userId]);
this.navigation.push("room", localId); this.navigation.push("room", roomBeingCreated.localId);
} }
} }

View file

@ -594,13 +594,13 @@ export class Session {
createRoom(type, isEncrypted, explicitName, topic, invites, log = undefined) { createRoom(type, isEncrypted, explicitName, topic, invites, log = undefined) {
return this._platform.logger.wrapOrRun(log, "create room", log => { return this._platform.logger.wrapOrRun(log, "create room", log => {
const localId = `room-being-created-${this._platform.random()}`; const localId = `local-${Math.round(this._platform.random() * Math.MAX_SAFE_INTEGER)}`;
const roomBeingCreated = new RoomBeingCreated(localId, type, isEncrypted, explicitName, topic, invites, this._roomsBeingCreatedUpdateCallback, this._mediaRepository, log); const roomBeingCreated = new RoomBeingCreated(localId, type, isEncrypted, explicitName, topic, invites, this._roomsBeingCreatedUpdateCallback, this._mediaRepository, log);
this._roomsBeingCreated.set(localId, roomBeingCreated); this._roomsBeingCreated.set(localId, roomBeingCreated);
log.wrapDetached("create room network", async log => { log.wrapDetached("create room network", log => {
roomBeingCreated.start(this._hsApi, log); return roomBeingCreated.start(this._hsApi, log);
}); });
return localId; return roomBeingCreated;
}); });
} }
@ -691,10 +691,9 @@ export class Session {
if (roomBeingCreated.roomId === roomId) { if (roomBeingCreated.roomId === roomId) {
const observableStatus = this._observedRoomStatus.get(roomBeingCreated.localId); const observableStatus = this._observedRoomStatus.get(roomBeingCreated.localId);
if (observableStatus) { if (observableStatus) {
this._platform.logger.wrapOrRun(log, `replacing room being created`, log => { log.log(`replacing room being created`)
log.set("localId", roomBeingCreated.localId) .set("localId", roomBeingCreated.localId)
.set("roomId", roomBeingCreated.roomId); .set("roomId", roomBeingCreated.roomId);
});
observableStatus.set(observableStatus.get() | RoomStatus.Replaced); observableStatus.set(observableStatus.get() | RoomStatus.Replaced);
} }
this._roomsBeingCreated.remove(roomBeingCreated.localId); this._roomsBeingCreated.remove(roomBeingCreated.localId);
@ -737,10 +736,12 @@ export class Session {
for (const is of inviteStates) { for (const is of inviteStates) {
const statusObservable = this._observedRoomStatus.get(is.id); const statusObservable = this._observedRoomStatus.get(is.id);
if (statusObservable) { if (statusObservable) {
const withInvited = statusObservable.get() | RoomStatus.Invited;
if (is.shouldAdd) { if (is.shouldAdd) {
statusObservable.set(statusObservable.get().withInvited()); statusObservable.set(withInvited);
} else if (is.shouldRemove) { } else if (is.shouldRemove) {
statusObservable.set(statusObservable.get().withoutInvited()); const withoutInvited = withInvited ^ RoomStatus.Invited;
statusObservable.set(withoutInvited);
} }
} }
} }
@ -750,7 +751,7 @@ export class Session {
_forgetArchivedRoom(roomId) { _forgetArchivedRoom(roomId) {
const statusObservable = this._observedRoomStatus.get(roomId); const statusObservable = this._observedRoomStatus.get(roomId);
if (statusObservable) { if (statusObservable) {
statusObservable.set(statusObservable.get() ^ RoomStatus.Archived); statusObservable.set((statusObservable.get() | RoomStatus.Archived) ^ RoomStatus.Archived);
} }
} }

View file

@ -65,6 +65,7 @@ export class RoomBeingCreated extends EventEmitter<{change: never}> {
public readonly isEncrypted: boolean; public readonly isEncrypted: boolean;
private _name: string; private _name: string;
private _error?: Error;
constructor( constructor(
public readonly localId: string, public readonly localId: string,
@ -115,12 +116,12 @@ export class RoomBeingCreated extends EventEmitter<{change: never}> {
if (this.isEncrypted) { if (this.isEncrypted) {
options.initial_state = [createRoomEncryptionEvent()]; options.initial_state = [createRoomEncryptionEvent()];
} }
console.log("going to create the room now"); try {
const response = await hsApi.createRoom(options, {log}).response(); const response = await hsApi.createRoom(options, {log}).response();
this._roomId = response["room_id"]; this._roomId = response["room_id"];
console.log("done creating the room now", this._roomId); } catch (err) {
// TODO: somehow check in Session if we need to replace this with a joined room this._error = err;
// in case the room appears first in sync, and this request returns later }
this.emitChange(undefined, log); this.emitChange(undefined, log);
} }
@ -128,39 +129,30 @@ export class RoomBeingCreated extends EventEmitter<{change: never}> {
// only load profiles if we need it for the room name and avatar // only load profiles if we need it for the room name and avatar
if (!this.explicitName && this.inviteUserIds) { if (!this.explicitName && this.inviteUserIds) {
this.profiles = await loadProfiles(this.inviteUserIds, hsApi, log); this.profiles = await loadProfiles(this.inviteUserIds, hsApi, log);
console.log("loaded the profiles", this.profiles);
const summaryData = { const summaryData = {
joinCount: 1, // ourselves joinCount: 1, // ourselves
inviteCount: this.inviteUserIds.length inviteCount: this.inviteUserIds.length
}; };
this._name = calculateRoomName(this.profiles, summaryData, log); this._name = calculateRoomName(this.profiles, summaryData, log);
console.log("loaded the profiles and the new name", this.name);
this.emitChange(); this.emitChange();
} }
} }
private emitChange(params?, log?) { private emitChange(params?, log?: ILogItem) {
this.updateCallback(this, params, log); this.updateCallback(this, params, log);
this.emit("change"); this.emit("change");
} }
get avatarColorId(): string { get avatarColorId(): string { return this.inviteUserIds?.[0] ?? this._roomId ?? this.localId; }
return this.inviteUserIds?.[0] ?? this._roomId ?? this.localId; get avatarUrl(): string | undefined { return this.profiles[0]?.avatarUrl; }
} get roomId(): string | undefined { return this._roomId; }
get avatarUrl(): string | undefined {
const result = this.profiles[0]?.avatarUrl;
console.log("RoomBeingCreated.avatarUrl", this.profiles, result);
return result;
}
get roomId(): string | undefined {
return this._roomId;
}
get name() { return this._name; } get name() { return this._name; }
get isBeingCreated(): boolean { return true; } get isBeingCreated(): boolean { return true; }
get error(): Error | undefined { return this._error; }
cancel() {
// remove from collection somehow
}
} }
export async function loadProfiles(userIds: string[], hsApi: HomeServerApi, log: ILogItem): Promise<Profile[]> { export async function loadProfiles(userIds: string[], hsApi: HomeServerApi, log: ILogItem): Promise<Profile[]> {
@ -194,5 +186,4 @@ class UserIdProfile implements IProfile {
get displayName() { return undefined; } get displayName() { return undefined; }
get name() { return this.userId; } get name() { return this.userId; }
get avatarUrl() { return undefined; } get avatarUrl() { return undefined; }
} }