mirror of
https://github.com/element-hq/element-web
synced 2024-11-28 20:38:55 +03:00
Merge pull request #4123 from matrix-org/travis/invite-populate
Ensure DMs tagged outside of account data work in the invite dialog
This commit is contained in:
commit
6dcbed0320
5 changed files with 45 additions and 24 deletions
|
@ -15,7 +15,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { asyncAction } from './actionCreators';
|
import { asyncAction } from './actionCreators';
|
||||||
import RoomListStore from '../stores/RoomListStore';
|
import RoomListStore, {TAG_DM} from '../stores/RoomListStore';
|
||||||
import Modal from '../Modal';
|
import Modal from '../Modal';
|
||||||
import * as Rooms from '../Rooms';
|
import * as Rooms from '../Rooms';
|
||||||
import { _t } from '../languageHandler';
|
import { _t } from '../languageHandler';
|
||||||
|
@ -73,11 +73,11 @@ RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex,
|
||||||
const roomId = room.roomId;
|
const roomId = room.roomId;
|
||||||
|
|
||||||
// Evil hack to get DMs behaving
|
// Evil hack to get DMs behaving
|
||||||
if ((oldTag === undefined && newTag === 'im.vector.fake.direct') ||
|
if ((oldTag === undefined && newTag === TAG_DM) ||
|
||||||
(oldTag === 'im.vector.fake.direct' && newTag === undefined)
|
(oldTag === TAG_DM && newTag === undefined)
|
||||||
) {
|
) {
|
||||||
return Rooms.guessAndSetDMRoom(
|
return Rooms.guessAndSetDMRoom(
|
||||||
room, newTag === 'im.vector.fake.direct',
|
room, newTag === TAG_DM,
|
||||||
).catch((err) => {
|
).catch((err) => {
|
||||||
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
console.error("Failed to set direct chat tag " + err);
|
console.error("Failed to set direct chat tag " + err);
|
||||||
|
@ -91,10 +91,10 @@ RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex,
|
||||||
const hasChangedSubLists = oldTag !== newTag;
|
const hasChangedSubLists = oldTag !== newTag;
|
||||||
|
|
||||||
// More evilness: We will still be dealing with moving to favourites/low prio,
|
// More evilness: We will still be dealing with moving to favourites/low prio,
|
||||||
// but we avoid ever doing a request with 'im.vector.fake.direct`.
|
// but we avoid ever doing a request with TAG_DM.
|
||||||
//
|
//
|
||||||
// if we moved lists, remove the old tag
|
// if we moved lists, remove the old tag
|
||||||
if (oldTag && oldTag !== 'im.vector.fake.direct' &&
|
if (oldTag && oldTag !== TAG_DM &&
|
||||||
hasChangedSubLists
|
hasChangedSubLists
|
||||||
) {
|
) {
|
||||||
const promiseToDelete = matrixClient.deleteRoomTag(
|
const promiseToDelete = matrixClient.deleteRoomTag(
|
||||||
|
@ -112,7 +112,7 @@ RoomListActions.tagRoom = function(matrixClient, room, oldTag, newTag, oldIndex,
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we moved lists or the ordering changed, add the new tag
|
// if we moved lists or the ordering changed, add the new tag
|
||||||
if (newTag && newTag !== 'im.vector.fake.direct' &&
|
if (newTag && newTag !== TAG_DM &&
|
||||||
(hasChangedSubLists || metaData)
|
(hasChangedSubLists || metaData)
|
||||||
) {
|
) {
|
||||||
// metaData is the body of the PUT to set the tag, so it must
|
// metaData is the body of the PUT to set the tag, so it must
|
||||||
|
|
|
@ -34,6 +34,7 @@ import {humanizeTime} from "../../../utils/humanize";
|
||||||
import createRoom, {canEncryptToAllUsers} from "../../../createRoom";
|
import createRoom, {canEncryptToAllUsers} from "../../../createRoom";
|
||||||
import {inviteMultipleToRoom} from "../../../RoomInvite";
|
import {inviteMultipleToRoom} from "../../../RoomInvite";
|
||||||
import SettingsStore from '../../../settings/SettingsStore';
|
import SettingsStore from '../../../settings/SettingsStore';
|
||||||
|
import RoomListStore, {TAG_DM} from "../../../stores/RoomListStore";
|
||||||
|
|
||||||
export const KIND_DM = "dm";
|
export const KIND_DM = "dm";
|
||||||
export const KIND_INVITE = "invite";
|
export const KIND_INVITE = "invite";
|
||||||
|
@ -332,7 +333,23 @@ export default class InviteDialog extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
_buildRecents(excludedTargetIds: Set<string>): {userId: string, user: RoomMember, lastActive: number} {
|
_buildRecents(excludedTargetIds: Set<string>): {userId: string, user: RoomMember, lastActive: number} {
|
||||||
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals();
|
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room
|
||||||
|
|
||||||
|
// Also pull in all the rooms tagged as TAG_DM so we don't miss anything. Sometimes the
|
||||||
|
// room list doesn't tag the room for the DMRoomMap, but does for the room list.
|
||||||
|
const taggedRooms = RoomListStore.getRoomLists();
|
||||||
|
const dmTaggedRooms = taggedRooms[TAG_DM];
|
||||||
|
const myUserId = MatrixClientPeg.get().getUserId();
|
||||||
|
for (const dmRoom of dmTaggedRooms) {
|
||||||
|
const otherMembers = dmRoom.getJoinedMembers().filter(u => u.userId !== myUserId);
|
||||||
|
for (const member of otherMembers) {
|
||||||
|
if (rooms[member.userId]) continue; // already have a room
|
||||||
|
|
||||||
|
console.warn(`Adding DM room for ${member.userId} as ${dmRoom.roomId} from tag, not DM map`);
|
||||||
|
rooms[member.userId] = dmRoom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const recents = [];
|
const recents = [];
|
||||||
for (const userId in rooms) {
|
for (const userId in rooms) {
|
||||||
// Filter out user IDs that are already in the room / should be excluded
|
// Filter out user IDs that are already in the room / should be excluded
|
||||||
|
|
|
@ -28,7 +28,7 @@ import rate_limited_func from "../../../ratelimitedfunc";
|
||||||
import * as Rooms from '../../../Rooms';
|
import * as Rooms from '../../../Rooms';
|
||||||
import DMRoomMap from '../../../utils/DMRoomMap';
|
import DMRoomMap from '../../../utils/DMRoomMap';
|
||||||
import TagOrderStore from '../../../stores/TagOrderStore';
|
import TagOrderStore from '../../../stores/TagOrderStore';
|
||||||
import RoomListStore from '../../../stores/RoomListStore';
|
import RoomListStore, {TAG_DM} from '../../../stores/RoomListStore';
|
||||||
import CustomRoomTagStore from '../../../stores/CustomRoomTagStore';
|
import CustomRoomTagStore from '../../../stores/CustomRoomTagStore';
|
||||||
import GroupStore from '../../../stores/GroupStore';
|
import GroupStore from '../../../stores/GroupStore';
|
||||||
import RoomSubList from '../../structures/RoomSubList';
|
import RoomSubList from '../../structures/RoomSubList';
|
||||||
|
@ -718,11 +718,11 @@ export default createReactClass({
|
||||||
incomingCall: incomingCallIfTaggedAs('m.favourite'),
|
incomingCall: incomingCallIfTaggedAs('m.favourite'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
list: this.state.lists['im.vector.fake.direct'],
|
list: this.state.lists[TAG_DM],
|
||||||
label: _t('Direct Messages'),
|
label: _t('Direct Messages'),
|
||||||
tagName: "im.vector.fake.direct",
|
tagName: TAG_DM,
|
||||||
order: "recent",
|
order: "recent",
|
||||||
incomingCall: incomingCallIfTaggedAs('im.vector.fake.direct'),
|
incomingCall: incomingCallIfTaggedAs(TAG_DM),
|
||||||
onAddRoom: () => {dis.dispatch({action: 'view_create_chat'});},
|
onAddRoom: () => {dis.dispatch({action: 'view_create_chat'});},
|
||||||
addRoomLabel: _t("Start chat"),
|
addRoomLabel: _t("Start chat"),
|
||||||
},
|
},
|
||||||
|
|
|
@ -37,11 +37,14 @@ const CATEGORY_BOLD = "bold"; // Unread messages (not notified, 'Mentions Only
|
||||||
const CATEGORY_IDLE = "idle"; // Nothing of interest
|
const CATEGORY_IDLE = "idle"; // Nothing of interest
|
||||||
|
|
||||||
const CATEGORY_ORDER = [CATEGORY_RED, CATEGORY_GREY, CATEGORY_BOLD, CATEGORY_IDLE];
|
const CATEGORY_ORDER = [CATEGORY_RED, CATEGORY_GREY, CATEGORY_BOLD, CATEGORY_IDLE];
|
||||||
|
|
||||||
|
export const TAG_DM = "im.vector.fake.direct";
|
||||||
|
|
||||||
const LIST_ORDERS = {
|
const LIST_ORDERS = {
|
||||||
"m.favourite": "manual",
|
"m.favourite": "manual",
|
||||||
"im.vector.fake.invite": "recent",
|
"im.vector.fake.invite": "recent",
|
||||||
"im.vector.fake.recent": "recent",
|
"im.vector.fake.recent": "recent",
|
||||||
"im.vector.fake.direct": "recent",
|
[TAG_DM]: "recent",
|
||||||
"m.lowpriority": "recent",
|
"m.lowpriority": "recent",
|
||||||
"im.vector.fake.archived": "recent",
|
"im.vector.fake.archived": "recent",
|
||||||
};
|
};
|
||||||
|
@ -95,7 +98,7 @@ class RoomListStore extends Store {
|
||||||
"im.vector.fake.invite": [],
|
"im.vector.fake.invite": [],
|
||||||
"m.favourite": [],
|
"m.favourite": [],
|
||||||
"im.vector.fake.recent": [],
|
"im.vector.fake.recent": [],
|
||||||
"im.vector.fake.direct": [],
|
[TAG_DM]: [],
|
||||||
"m.lowpriority": [],
|
"m.lowpriority": [],
|
||||||
"im.vector.fake.archived": [],
|
"im.vector.fake.archived": [],
|
||||||
};
|
};
|
||||||
|
@ -323,7 +326,7 @@ class RoomListStore extends Store {
|
||||||
} else if (dmRoomMap.getUserIdForRoomId(room.roomId) && tags.length === 0) {
|
} else if (dmRoomMap.getUserIdForRoomId(room.roomId) && tags.length === 0) {
|
||||||
// We intentionally don't duplicate rooms in other tags into the people list
|
// We intentionally don't duplicate rooms in other tags into the people list
|
||||||
// as a feature.
|
// as a feature.
|
||||||
tags.push("im.vector.fake.direct");
|
tags.push(TAG_DM);
|
||||||
} else if (tags.length === 0) {
|
} else if (tags.length === 0) {
|
||||||
tags.push("im.vector.fake.recent");
|
tags.push("im.vector.fake.recent");
|
||||||
}
|
}
|
||||||
|
@ -553,7 +556,7 @@ class RoomListStore extends Store {
|
||||||
"im.vector.fake.invite": [],
|
"im.vector.fake.invite": [],
|
||||||
"m.favourite": [],
|
"m.favourite": [],
|
||||||
"im.vector.fake.recent": [],
|
"im.vector.fake.recent": [],
|
||||||
"im.vector.fake.direct": [],
|
[TAG_DM]: [],
|
||||||
"m.lowpriority": [],
|
"m.lowpriority": [],
|
||||||
"im.vector.fake.archived": [],
|
"im.vector.fake.archived": [],
|
||||||
};
|
};
|
||||||
|
@ -590,7 +593,7 @@ class RoomListStore extends Store {
|
||||||
}
|
}
|
||||||
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
|
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
|
||||||
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
|
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
|
||||||
lists["im.vector.fake.direct"].push({room, category: this._calculateCategory(room)});
|
lists[TAG_DM].push({room, category: this._calculateCategory(room)});
|
||||||
} else {
|
} else {
|
||||||
lists["im.vector.fake.recent"].push({room, category: this._calculateCategory(room)});
|
lists["im.vector.fake.recent"].push({room, category: this._calculateCategory(room)});
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import DMRoomMap from '../../../../src/utils/DMRoomMap.js';
|
||||||
import GroupStore from '../../../../src/stores/GroupStore.js';
|
import GroupStore from '../../../../src/stores/GroupStore.js';
|
||||||
|
|
||||||
import { MatrixClient, Room, RoomMember } from 'matrix-js-sdk';
|
import { MatrixClient, Room, RoomMember } from 'matrix-js-sdk';
|
||||||
|
import {TAG_DM} from "../../../../src/stores/RoomListStore";
|
||||||
|
|
||||||
function generateRoomId() {
|
function generateRoomId() {
|
||||||
return '!' + Math.random().toString().slice(2, 10) + ':domain';
|
return '!' + Math.random().toString().slice(2, 10) + ':domain';
|
||||||
|
@ -152,7 +153,7 @@ describe('RoomList', () => {
|
||||||
// Set up the room that will be moved such that it has the correct state for a room in
|
// Set up the room that will be moved such that it has the correct state for a room in
|
||||||
// the section for oldTag
|
// the section for oldTag
|
||||||
if (['m.favourite', 'm.lowpriority'].includes(oldTag)) movingRoom.tags = {[oldTag]: {}};
|
if (['m.favourite', 'm.lowpriority'].includes(oldTag)) movingRoom.tags = {[oldTag]: {}};
|
||||||
if (oldTag === 'im.vector.fake.direct') {
|
if (oldTag === TAG_DM) {
|
||||||
// Mock inverse m.direct
|
// Mock inverse m.direct
|
||||||
DMRoomMap.shared().roomToUser = {
|
DMRoomMap.shared().roomToUser = {
|
||||||
[movingRoom.roomId]: '@someotheruser:domain',
|
[movingRoom.roomId]: '@someotheruser:domain',
|
||||||
|
@ -179,7 +180,7 @@ describe('RoomList', () => {
|
||||||
// TODO: Re-enable dragging tests when we support dragging again.
|
// TODO: Re-enable dragging tests when we support dragging again.
|
||||||
describe.skip('does correct optimistic update when dragging from', () => {
|
describe.skip('does correct optimistic update when dragging from', () => {
|
||||||
it('rooms to people', () => {
|
it('rooms to people', () => {
|
||||||
expectCorrectMove(undefined, 'im.vector.fake.direct');
|
expectCorrectMove(undefined, TAG_DM);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('rooms to favourites', () => {
|
it('rooms to favourites', () => {
|
||||||
|
@ -194,15 +195,15 @@ describe('RoomList', () => {
|
||||||
// Whe running the app live, it updates when some other event occurs (likely the
|
// Whe running the app live, it updates when some other event occurs (likely the
|
||||||
// m.direct arriving) that these tests do not fire.
|
// m.direct arriving) that these tests do not fire.
|
||||||
xit('people to rooms', () => {
|
xit('people to rooms', () => {
|
||||||
expectCorrectMove('im.vector.fake.direct', undefined);
|
expectCorrectMove(TAG_DM, undefined);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('people to favourites', () => {
|
it('people to favourites', () => {
|
||||||
expectCorrectMove('im.vector.fake.direct', 'm.favourite');
|
expectCorrectMove(TAG_DM, 'm.favourite');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('people to lowpriority', () => {
|
it('people to lowpriority', () => {
|
||||||
expectCorrectMove('im.vector.fake.direct', 'm.lowpriority');
|
expectCorrectMove(TAG_DM, 'm.lowpriority');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('low priority to rooms', () => {
|
it('low priority to rooms', () => {
|
||||||
|
@ -210,7 +211,7 @@ describe('RoomList', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('low priority to people', () => {
|
it('low priority to people', () => {
|
||||||
expectCorrectMove('m.lowpriority', 'im.vector.fake.direct');
|
expectCorrectMove('m.lowpriority', TAG_DM);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('low priority to low priority', () => {
|
it('low priority to low priority', () => {
|
||||||
|
@ -222,7 +223,7 @@ describe('RoomList', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('favourites to people', () => {
|
it('favourites to people', () => {
|
||||||
expectCorrectMove('m.favourite', 'im.vector.fake.direct');
|
expectCorrectMove('m.favourite', TAG_DM);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('favourites to low priority', () => {
|
it('favourites to low priority', () => {
|
||||||
|
|
Loading…
Reference in a new issue