fix no room selected after leave / init
This commit is contained in:
parent
f19a51939c
commit
81851bdc42
6 changed files with 65 additions and 27 deletions
|
|
@ -25,6 +25,7 @@ class RoomChatController(final ChatParams info)
|
|||
@override
|
||||
Future<RoomChat?> build() async {
|
||||
final client = ref.read(ClientController.provider.notifier);
|
||||
|
||||
final room = ref.read(
|
||||
RoomsController.provider.select((rooms) => rooms[info.roomId]),
|
||||
);
|
||||
|
|
|
|||
31
lib/controllers/selected_room.dart
Normal file
31
lib/controllers/selected_room.dart
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import "package:fast_immutable_collections/fast_immutable_collections.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/key.dart";
|
||||
import "package:nexus/controllers/selected_space.dart";
|
||||
import "package:nexus/helpers/extensions/get_all_child_rooms.dart";
|
||||
|
||||
class SelectedRoomController extends Notifier<String?> {
|
||||
@override
|
||||
String? build() {
|
||||
final roomId = ref.watch(
|
||||
KeyController.provider(KeyController.roomKey)
|
||||
.select((async) => async.value),
|
||||
);
|
||||
|
||||
final roomIds = ref.watch(
|
||||
SelectedSpaceController.provider.select(
|
||||
(space) => space?.allChildRooms
|
||||
.map((room) => room.metadata?.id)
|
||||
.nonNulls
|
||||
.toIList(),
|
||||
),
|
||||
);
|
||||
if (roomIds == null) return roomId;
|
||||
|
||||
return roomIds.contains(roomId) ? roomId : roomIds.firstOrNull;
|
||||
}
|
||||
|
||||
static final provider = NotifierProvider<SelectedRoomController, String?>(
|
||||
SelectedRoomController.new,
|
||||
);
|
||||
}
|
||||
25
lib/controllers/selected_space.dart
Normal file
25
lib/controllers/selected_space.dart
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/key.dart";
|
||||
import "package:nexus/controllers/spaces.dart";
|
||||
import "package:nexus/models/space.dart";
|
||||
|
||||
class SelectedSpaceController extends Notifier<Space?> {
|
||||
@override
|
||||
Space? build() {
|
||||
final spaces = ref.watch(SpacesController.provider).value;
|
||||
if (spaces == null) return null;
|
||||
|
||||
final spaceId = ref.watch(
|
||||
KeyController.provider(KeyController.spaceKey)
|
||||
.select((async) => async.value),
|
||||
);
|
||||
|
||||
return spaces.firstWhereOrNull((space) => space.id == spaceId) ??
|
||||
spaces.firstOrNull;
|
||||
}
|
||||
|
||||
static final provider = NotifierProvider<SelectedSpaceController, Space?>(
|
||||
SelectedSpaceController.new,
|
||||
);
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@ import "dart:io";
|
|||
import "package:flutter/foundation.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:intl/intl.dart";
|
||||
import "package:nexus/controllers/key.dart";
|
||||
import "package:nexus/controllers/selected_room.dart";
|
||||
import "package:nexus/controllers/notification.dart";
|
||||
import "package:nexus/controllers/push_key.dart";
|
||||
import "package:nexus/main.dart";
|
||||
|
|
@ -90,10 +90,7 @@ class UnifiedPushController extends AsyncNotifier<String?> {
|
|||
if (event.unreadType?.has(.notify) != true ||
|
||||
(!isInBackground &&
|
||||
await windowManager.isFocused().onError((_, _) => true) &&
|
||||
await ref.read(
|
||||
KeyController.provider(KeyController.roomKey).future,
|
||||
) ==
|
||||
event.roomId)) {
|
||||
ref.read(SelectedRoomController.provider) == event.roomId)) {
|
||||
if (isInBackground) exit(0);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue