feat: added waitForSync method
This commit is contained in:
parent
e7910ab725
commit
2d018d3d5f
|
|
@ -587,8 +587,7 @@ class Client extends MatrixApi {
|
||||||
|
|
||||||
if (waitForSync && getRoomById(roomId) == null) {
|
if (waitForSync && getRoomById(roomId) == null) {
|
||||||
// Wait for room actually appears in sync
|
// Wait for room actually appears in sync
|
||||||
await onSync.stream
|
await waitForRoomInSync(roomId, join: true);
|
||||||
.firstWhere((sync) => sync.rooms?.join?.containsKey(roomId) ?? false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await Room(id: roomId, client: this).addToDirectChat(mxid);
|
await Room(id: roomId, client: this).addToDirectChat(mxid);
|
||||||
|
|
@ -632,13 +631,29 @@ class Client extends MatrixApi {
|
||||||
if (waitForSync) {
|
if (waitForSync) {
|
||||||
if (getRoomById(roomId) == null) {
|
if (getRoomById(roomId) == null) {
|
||||||
// Wait for room actually appears in sync
|
// Wait for room actually appears in sync
|
||||||
await onSync.stream.firstWhere(
|
await waitForRoomInSync(roomId, join: true);
|
||||||
(sync) => sync.rooms?.join?.containsKey(roomId) ?? false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return roomId;
|
return roomId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wait for the room to appear into the enabled section of the room sync.
|
||||||
|
/// By default, the function will listen for room in invite, join and leave
|
||||||
|
/// sections of the sync.
|
||||||
|
Future<SyncUpdate> waitForRoomInSync(String roomId,
|
||||||
|
{bool join = false, bool invite = false, bool leave = false}) async {
|
||||||
|
if (!join && !invite && !leave) {
|
||||||
|
join = true;
|
||||||
|
invite = true;
|
||||||
|
leave = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await onSync.stream.firstWhere((sync) =>
|
||||||
|
invite && (sync.rooms?.invite?.containsKey(roomId) ?? false) ||
|
||||||
|
join && (sync.rooms?.join?.containsKey(roomId) ?? false) ||
|
||||||
|
leave && (sync.rooms?.leave?.containsKey(roomId) ?? false));
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if the given user has encryption keys. May query keys from the
|
/// Checks if the given user has encryption keys. May query keys from the
|
||||||
/// server to answer this.
|
/// server to answer this.
|
||||||
Future<bool> userOwnsEncryptionKeys(String userId) async {
|
Future<bool> userOwnsEncryptionKeys(String userId) async {
|
||||||
|
|
@ -657,26 +672,33 @@ class Client extends MatrixApi {
|
||||||
/// room as a space with `room.toSpace()`.
|
/// room as a space with `room.toSpace()`.
|
||||||
///
|
///
|
||||||
/// https://github.com/matrix-org/matrix-doc/blob/matthew/msc1772/proposals/1772-groups-as-rooms.md
|
/// https://github.com/matrix-org/matrix-doc/blob/matthew/msc1772/proposals/1772-groups-as-rooms.md
|
||||||
Future<String> createSpace({
|
Future<String> createSpace(
|
||||||
String? name,
|
{String? name,
|
||||||
String? topic,
|
String? topic,
|
||||||
Visibility visibility = Visibility.public,
|
Visibility visibility = Visibility.public,
|
||||||
String? spaceAliasName,
|
String? spaceAliasName,
|
||||||
List<String>? invite,
|
List<String>? invite,
|
||||||
List<Invite3pid>? invite3pid,
|
List<Invite3pid>? invite3pid,
|
||||||
String? roomVersion,
|
String? roomVersion,
|
||||||
}) =>
|
bool waitForSync = false}) async {
|
||||||
createRoom(
|
final id = await createRoom(
|
||||||
name: name,
|
name: name,
|
||||||
topic: topic,
|
topic: topic,
|
||||||
visibility: visibility,
|
visibility: visibility,
|
||||||
roomAliasName: spaceAliasName,
|
roomAliasName: spaceAliasName,
|
||||||
creationContent: {'type': 'm.space'},
|
creationContent: {'type': 'm.space'},
|
||||||
powerLevelContentOverride: {'events_default': 100},
|
powerLevelContentOverride: {'events_default': 100},
|
||||||
invite: invite,
|
invite: invite,
|
||||||
invite3pid: invite3pid,
|
invite3pid: invite3pid,
|
||||||
roomVersion: roomVersion,
|
roomVersion: roomVersion,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (waitForSync) {
|
||||||
|
await waitForRoomInSync(id, join: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the user's own displayname and avatar url. In Matrix it is possible that
|
/// Returns the user's own displayname and avatar url. In Matrix it is possible that
|
||||||
/// one user can have different displaynames and avatar urls in different rooms. So
|
/// one user can have different displaynames and avatar urls in different rooms. So
|
||||||
|
|
|
||||||
|
|
@ -519,6 +519,12 @@ class Room {
|
||||||
/// in muted rooms, use [hasNewMessages].
|
/// in muted rooms, use [hasNewMessages].
|
||||||
bool get isUnread => notificationCount > 0 || markedUnread;
|
bool get isUnread => notificationCount > 0 || markedUnread;
|
||||||
|
|
||||||
|
/// Wait for the room to appear in join, leave or invited section of the
|
||||||
|
/// sync.
|
||||||
|
Future<SyncUpdate> get waitForSync async {
|
||||||
|
return await client.waitForRoomInSync(id);
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets an unread flag manually for this room. This changes the local account
|
/// Sets an unread flag manually for this room. This changes the local account
|
||||||
/// data model before syncing it to make sure
|
/// data model before syncing it to make sure
|
||||||
/// this works if there is no connection to the homeserver. This does **not**
|
/// this works if there is no connection to the homeserver. This does **not**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue