diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index 7d9604b..5e01ca6 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -25,6 +25,7 @@ import "package:nexus/models/requests/get_event_context.dart"; import "package:nexus/models/requests/get_mentions.dart"; import "package:nexus/models/requests/get_related_events.dart"; import "package:nexus/models/requests/get_room_state.dart"; +import "package:nexus/models/requests/get_room_summary.dart"; import "package:nexus/models/requests/join_room.dart"; import "package:nexus/models/profile_response.dart"; import "package:nexus/models/requests/oauth/exchange_token.dart"; @@ -188,7 +189,7 @@ class ClientController extends AsyncNotifier { Future joinRoom(JoinRoomRequest request) async => (await _sendCommand("join_room", request.toJson()))["room_id"]; - Future getRoomSummary(JoinRoomRequest request) async => + Future getRoomSummary(GetRoomSummary request) async => .fromJson(await _sendCommand("get_room_summary", request.toJson())); Future leaveRoom(Room room) async { diff --git a/lib/controllers/invited_rooms.dart b/lib/controllers/invited_rooms.dart new file mode 100644 index 0000000..94ce9b5 --- /dev/null +++ b/lib/controllers/invited_rooms.dart @@ -0,0 +1,15 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/models/invited_room.dart"; + +class InvitedRoomsController extends Notifier> { + @override + IList build() => .new(); + + void set(IList newState) => state = newState; + + static final provider = + NotifierProvider>( + InvitedRoomsController.new, + ); +} diff --git a/lib/controllers/room_summary.dart b/lib/controllers/room_summary.dart index e5b3174..05f555d 100644 --- a/lib/controllers/room_summary.dart +++ b/lib/controllers/room_summary.dart @@ -1,16 +1,16 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/client.dart"; -import "package:nexus/models/requests/join_room.dart"; +import "package:nexus/models/requests/get_room_summary.dart"; import "package:nexus/models/room_summary.dart"; -class RoomSummaryController(final JoinRoomRequest request) +class RoomSummaryController(final GetRoomSummary request) extends AsyncNotifier { @override Future build() => ref.read(ClientController.provider.notifier).getRoomSummary(request); static final provider = AsyncNotifierProvider.family - .autoDispose( + .autoDispose( RoomSummaryController.new, ); } diff --git a/lib/models/invited_room.dart b/lib/models/invited_room.dart new file mode 100644 index 0000000..1393f3f --- /dev/null +++ b/lib/models/invited_room.dart @@ -0,0 +1,21 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/epoch_date_time_converter.dart"; +import "package:nexus/models/event.dart"; + +part "invited_room.freezed.dart"; +part "invited_room.g.dart"; + +@Freezed(toJson: false, fromJson: false) +@JsonSerializable() +class const InvitedRoom({ + required final String roomId, + @EpochDateTimeConverter() required final DateTime createdAt, + // TODO: This is DBEvent, should be event.Event + required final IList inviteState, +}) with _$InvitedRoom { + Map toJson() => _$InvitedRoomToJson(this); + + factory InvitedRoom.fromJson(Map json) => + _$InvitedRoomFromJson(json); +} diff --git a/lib/models/requests/get_room_summary.dart b/lib/models/requests/get_room_summary.dart new file mode 100644 index 0000000..ba94ad2 --- /dev/null +++ b/lib/models/requests/get_room_summary.dart @@ -0,0 +1,17 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:freezed_annotation/freezed_annotation.dart"; + +part "get_room_summary.freezed.dart"; +part "get_room_summary.g.dart"; + +@Freezed(toJson: false, fromJson: false) +@JsonSerializable() +class const GetRoomSummary({ + required final String roomIdOrAlias, + final IList via = const IList.empty(), +}) with _$GetRoomSummary { + Map toJson() => _$GetRoomSummaryToJson(this); + + factory GetRoomSummary.fromJson(Map json) => + _$GetRoomSummaryFromJson(json); +} diff --git a/lib/models/requests/join_room.dart b/lib/models/requests/join_room.dart index 350b762..17c1d0a 100644 --- a/lib/models/requests/join_room.dart +++ b/lib/models/requests/join_room.dart @@ -9,6 +9,7 @@ part "join_room.g.dart"; class const JoinRoomRequest({ required final String roomIdOrAlias, final IList via = const IList.empty(), + final bool fromInvite = false, }) with _$JoinRoomRequest { Map toJson() => _$JoinRoomRequestToJson(this); diff --git a/lib/models/sync_data.dart b/lib/models/sync_data.dart index a9c10bf..26c8451 100644 --- a/lib/models/sync_data.dart +++ b/lib/models/sync_data.dart @@ -1,5 +1,6 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/invited_room.dart"; import "package:nexus/models/room.dart"; import "package:nexus/models/space_edge.dart"; @@ -12,6 +13,7 @@ class const SyncData({ final bool clearState = false, final IMap> accountData = const IMap.empty(), final IMap rooms = const IMap.empty(), + final IList invitedRooms = const IList.empty(), final ISet leftRooms = const ISet.empty(), final IMap>? spaceEdges, final IList? topLevelSpaces,