Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Avatar URL, extract determineCreateRoomEncryptionOption
Browse files Browse the repository at this point in the history
  • Loading branch information
weeman1337 committed May 20, 2022
1 parent 1885a45 commit c3f52b4
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 51 deletions.
13 changes: 6 additions & 7 deletions src/Avatar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,6 @@ export function getInitialLetter(name: string): string {
export function avatarUrlForRoom(room: Room, width: number, height: number, resizeMethod?: ResizeMethod) {
if (!room) return null; // null-guard

// @todo MiW
if (room instanceof LocalRoom) {
return mediaFromMxc(room.targets[0].getMxcAvatarUrl())
.getThumbnailOfSourceHttp(width, height, resizeMethod);
}

if (room.getMxcAvatarUrl()) {
return mediaFromMxc(room.getMxcAvatarUrl()).getThumbnailOfSourceHttp(width, height, resizeMethod);
}
Expand All @@ -149,7 +143,12 @@ export function avatarUrlForRoom(room: Room, width: number, height: number, resi
if (room.isSpaceRoom()) return null;

// If the room is not a DM don't fallback to a member avatar
if (!DMRoomMap.shared().getUserIdForRoomId(room.roomId)) return null;
if (
!DMRoomMap.shared().getUserIdForRoomId(room.roomId)
&& !(room instanceof LocalRoom)
) {
return null;
}

// If there are only two members in the DM use the avatar of the other member
const otherMember = room.getAvatarFallbackMember();
Expand Down
19 changes: 17 additions & 2 deletions src/components/structures/MessagePanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import { IReadReceiptInfo } from "../views/rooms/ReadReceiptMarker";
import { haveRendererForEvent } from "../../events/EventTileFactory";
import { editorRoomKey } from "../../Editing";
import { hasThreadSummary } from "../../utils/EventUtils";
import { LOCAL_ROOM_ID_PREFIX } from '../../models/LocalRoom';

const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes
const continuedTypes = [EventType.Sticker, EventType.RoomMessage];
Expand All @@ -66,6 +67,9 @@ const groupedEvents = [
EventType.RoomServerAcl,
EventType.RoomPinnedEvents,
];
const LOCAL_ROOM_NO_TILE_EVENTS = [
EventType.RoomMember,
];

// check if there is a previous event and it has the same sender as this event
// and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL
Expand Down Expand Up @@ -719,6 +723,13 @@ export default class MessagePanel extends React.Component<IProps, IState> {
nextEvent?: MatrixEvent,
nextEventWithTile?: MatrixEvent,
): ReactNode[] {
if (
mxEv.getRoomId().startsWith(LOCAL_ROOM_ID_PREFIX) &&
LOCAL_ROOM_NO_TILE_EVENTS.includes(mxEv.getType() as EventType)
) {
return [];
}

const ret = [];

const isEditing = this.props.editState?.getEvent().getId() === mxEv.getId();
Expand Down Expand Up @@ -1160,6 +1171,12 @@ class CreationGrouper extends BaseGrouper {
));
}

ret.push(<NewRoomIntro key="newroomintro" />);

if (this.events[0].getRoomId().startsWith(LOCAL_ROOM_ID_PREFIX)) {
return ret;
}

const eventTiles = this.events.map((e) => {
// In order to prevent DateSeparators from appearing in the expanded form
// of GenericEventListSummary, render each member event as if the previous
Expand All @@ -1179,8 +1196,6 @@ class CreationGrouper extends BaseGrouper {
summaryText = _t("%(creator)s created and configured the room.", { creator });
}

ret.push(<NewRoomIntro key="newroomintro" />);

ret.push(
<GenericEventListSummary
key="roomcreationsummary"
Expand Down
1 change: 0 additions & 1 deletion src/components/views/rooms/RoomSublist.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ import { ListNotificationState } from "../../../stores/notifications/ListNotific
import { getKeyBindingsManager } from "../../../KeyBindingsManager";
import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts";
import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
import { LocalRoom } from "../../../models/LocalRoom";

const SHOW_N_BUTTON_HEIGHT = 28; // As defined by CSS
const RESIZE_HANDLE_HEIGHT = 4; // As defined by CSS
Expand Down
2 changes: 2 additions & 0 deletions src/models/LocalRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import { Room } from "matrix-js-sdk/src/models/room";

import { Member } from "../utils/direct-messages";

export const LOCAL_ROOM_ID_PREFIX = 'local/';

/**
* A local room that only exists on the client side.
* Its main purpose is to be used for temporary rooms when creating a DM.
Expand Down
105 changes: 64 additions & 41 deletions src/utils/direct-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import DMRoomMap from "./DMRoomMap";
import { isJoinedOrNearlyJoined } from "./membership";
import dis from "../dispatcher/dispatcher";
import { privateShouldBeEncrypted } from "./rooms";
import { LocalRoom } from '../models/LocalRoom';
import { LocalRoom, LOCAL_ROOM_ID_PREFIX } from '../models/LocalRoom';

export function findDMForUser(client: MatrixClient, userId: string): Room {
const roomIds = DMRoomMap.shared().getDMRoomsForUserId(userId);
Expand Down Expand Up @@ -63,16 +63,17 @@ export async function createDmLocalRoom(
const other = targets[0];

const localRoom = new LocalRoom(
`local/${client.makeTxnId()}`,
LOCAL_ROOM_ID_PREFIX + client.makeTxnId(),
client,
userId,
{
pendingEventOrdering: PendingEventOrdering.Detached,
unstableClientRelationAggregation: true,
},
);
const events = [];

const roomCreateEvent = new MatrixEvent({
events.push(new MatrixEvent({
event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,
type: EventType.RoomCreate,
content: {
Expand All @@ -84,9 +85,26 @@ export async function createDmLocalRoom(
sender: userId,
room_id: localRoom.roomId,
origin_server_ts: new Date().getTime(),
});
}));

if (determineCreateRoomEncryptionOption(client, targets)) {
events.push(
new MatrixEvent({
event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,
type: "m.room.encryption",
content: {
algorithm: "m.megolm.v1.aes-sha2",
},
user_id: userId,
sender: userId,
state_key: "",
room_id: localRoom.roomId,
origin_server_ts: new Date().getTime(),
}),
);
}

const roomMembershipEvent = new MatrixEvent({
events.push(new MatrixEvent({
event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,
type: EventType.RoomMember,
content: {
Expand All @@ -98,55 +116,68 @@ export async function createDmLocalRoom(
sender: userId,
room_id: localRoom.roomId,
origin_server_ts: new Date().getTime(),
});
}));

const roomMembership2Event = new MatrixEvent({
events.push(new MatrixEvent({
event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,
type: EventType.RoomMember,
content: {
displayname: other.name,
avatar_url: other.getMxcAvatarUrl(),
membership: "join",
membership: "invite",
isDirect: true,
},
state_key: other.userId,
user_id: other.userId,
sender: other.userId,
room_id: localRoom.roomId,
origin_server_ts: new Date().getTime(),
});

const encryptionEvent = new MatrixEvent({
event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,
type: "m.room.encryption",
content: {
algorithm: "m.megolm.v1.aes-sha2",
},
user_id: userId,
sender: userId,
state_key: "",
room_id: localRoom.roomId,
origin_server_ts: new Date().getTime(),
});

const localEvents = [
roomCreateEvent,
encryptionEvent,
roomMembershipEvent,
roomMembership2Event,
];
}));

//events.push(new MatrixEvent({
//event_id: `~${localRoom.roomId}:${client.makeTxnId()}`,
//type: EventType.RoomMember,
//content: {
//displayname: other.name,
//avatar_url: other.getMxcAvatarUrl(),
//membership: "join",
//},
//state_key: other.userId,
//user_id: other.userId,
//sender: other.userId,
//room_id: localRoom.roomId,
//origin_server_ts: new Date().getTime(),
//}));

localRoom.name = other.name;
localRoom.targets = targets;
localRoom.updateMyMembership("join");
localRoom.addLiveEvents(localEvents);
localRoom.currentState.setStateEvents(localEvents);
localRoom.addLiveEvents(events);
localRoom.currentState.setStateEvents(events);

client.store.storeRoom(localRoom);
client.sessionStore.store.setItem('mx_pending_events_local_room', []);

return localRoom;
}

async function determineCreateRoomEncryptionOption(client: MatrixClient, targets: Member[]): Promise<boolean> {
if (privateShouldBeEncrypted()) {
// Check whether all users have uploaded device keys before.
// If so, enable encryption in the new room.
const has3PidMembers = targets.some(t => t instanceof ThreepidMember);
if (!has3PidMembers) {
const targetIds = targets.map(t => t.userId);
const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds);
if (allHaveDeviceKeys) {
return true;
}
}
}

return false;
}

/**
* Start a DM.
*
Expand Down Expand Up @@ -175,16 +206,8 @@ export async function startDm(client: MatrixClient, targets: Member[]): Promise<

const createRoomOptions = { inlineErrors: true } as any; // XXX: Type out `createRoomOptions`

if (privateShouldBeEncrypted()) {
// Check whether all users have uploaded device keys before.
// If so, enable encryption in the new room.
const has3PidMembers = targets.some(t => t instanceof ThreepidMember);
if (!has3PidMembers) {
const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds);
if (allHaveDeviceKeys) {
createRoomOptions.encryption = true;
}
}
if (determineCreateRoomEncryptionOption(client, targets)) {
createRoomOptions.encryption = true;
}

// Check if it's a traditional DM and create the room if required.
Expand Down

0 comments on commit c3f52b4

Please sign in to comment.