Leave room support, persist last room, fixes
This commit is contained in:
parent
f7c6c3bb6a
commit
7dfd47a404
17 changed files with 312 additions and 136 deletions
|
|
@ -11,6 +11,7 @@ import "package:nexus/models/session_backup.dart";
|
|||
|
||||
class ClientController extends AsyncNotifier<Client> {
|
||||
static const sessionBackupKey = "sessionBackup";
|
||||
|
||||
@override
|
||||
Future<Client> build() async {
|
||||
if (!voz.isInitialized()) await voz_fl.init();
|
||||
|
|
@ -43,10 +44,6 @@ class ClientController extends AsyncNotifier<Client> {
|
|||
);
|
||||
}
|
||||
|
||||
ref.onDispose(
|
||||
client.onRoomState.stream.listen((_) => ref.notifyListeners()).cancel,
|
||||
);
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/spaces_controller.dart";
|
||||
import "package:nexus/helpers/extensions/get_full_room.dart";
|
||||
import "package:nexus/models/full_room.dart";
|
||||
|
||||
class CurrentRoomController extends AsyncNotifier<FullRoom?> {
|
||||
@override
|
||||
Future<FullRoom?> build() async {
|
||||
final spaces = await ref.watch(SpacesController.provider.future);
|
||||
|
||||
if (spaces.isEmpty || spaces[0].children.isEmpty) return null;
|
||||
return spaces[0].children[0].roomData.fullRoom;
|
||||
}
|
||||
|
||||
Future<void> set(FullRoom room) async {
|
||||
await future;
|
||||
state = AsyncValue.data(room);
|
||||
}
|
||||
|
||||
static final provider =
|
||||
AsyncNotifierProvider<CurrentRoomController, FullRoom?>(
|
||||
CurrentRoomController.new,
|
||||
);
|
||||
}
|
||||
30
lib/controllers/key_controller.dart
Normal file
30
lib/controllers/key_controller.dart
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/shared_prefs_controller.dart";
|
||||
|
||||
class KeyController extends Notifier<String?> {
|
||||
final String key;
|
||||
KeyController(this.key);
|
||||
|
||||
static const String spaceKey = "space";
|
||||
static const String roomKey = "room";
|
||||
|
||||
@override
|
||||
String? build() =>
|
||||
ref.watch(SharedPrefsController.provider).requireValue.getString(key);
|
||||
|
||||
Future<void> set(String? id) async {
|
||||
final prefs = ref.watch(SharedPrefsController.provider).requireValue;
|
||||
state = id;
|
||||
|
||||
if (id == null) {
|
||||
prefs.remove(key);
|
||||
} else {
|
||||
prefs.setString(key, id);
|
||||
}
|
||||
}
|
||||
|
||||
static final provider =
|
||||
NotifierProvider.family<KeyController, String?, String>(
|
||||
KeyController.new,
|
||||
);
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import "package:flutter_chat_core/flutter_chat_core.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/current_room_controller.dart";
|
||||
import "package:nexus/controllers/selected_room_controller.dart";
|
||||
import "package:nexus/helpers/extensions/event_to_message.dart";
|
||||
|
||||
class MessageController extends AsyncNotifier<TextMessage?> {
|
||||
|
|
@ -9,11 +9,11 @@ class MessageController extends AsyncNotifier<TextMessage?> {
|
|||
|
||||
@override
|
||||
Future<TextMessage?> build() async {
|
||||
final room = await ref.watch(CurrentRoomController.provider.future);
|
||||
final room = await ref.watch(SelectedRoomController.provider.future);
|
||||
if (room == null) return null;
|
||||
|
||||
final event = await room.roomData.getEventById(id);
|
||||
return (await event?.toMessage(mustBeText: true)) as TextMessage;
|
||||
return (await event?.toMessage(mustBeText: true)) as TextMessage?;
|
||||
}
|
||||
|
||||
static final provider =
|
||||
|
|
|
|||
|
|
@ -1,12 +1,33 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/key_controller.dart";
|
||||
import "package:nexus/controllers/selected_space_controller.dart";
|
||||
import "package:nexus/models/full_room.dart";
|
||||
|
||||
class SelectedRoomController extends Notifier<int> {
|
||||
class SelectedRoomController extends AsyncNotifier<FullRoom?> {
|
||||
@override
|
||||
int build() => 0;
|
||||
bool updateShouldNotify(
|
||||
AsyncValue<FullRoom?> previous,
|
||||
AsyncValue<FullRoom?> next,
|
||||
) =>
|
||||
previous.value?.avatar != next.value?.avatar ||
|
||||
previous.value?.title != next.value?.title;
|
||||
|
||||
void set(int value) => state = value;
|
||||
@override
|
||||
Future<FullRoom?> build() async {
|
||||
final space = await ref.watch(SelectedSpaceController.provider.future);
|
||||
final selectedRoomId = ref.watch(
|
||||
KeyController.provider(KeyController.roomKey),
|
||||
);
|
||||
|
||||
static final provider = NotifierProvider<SelectedRoomController, int>(
|
||||
SelectedRoomController.new,
|
||||
);
|
||||
return space.children.firstWhereOrNull(
|
||||
(room) => room.roomData.id == selectedRoomId,
|
||||
) ??
|
||||
space.children.firstOrNull;
|
||||
}
|
||||
|
||||
static final provider =
|
||||
AsyncNotifierProvider<SelectedRoomController, FullRoom?>(
|
||||
SelectedRoomController.new,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,22 @@
|
|||
import "package:collection/collection.dart";
|
||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:nexus/controllers/key_controller.dart";
|
||||
import "package:nexus/controllers/spaces_controller.dart";
|
||||
import "package:nexus/models/space.dart";
|
||||
|
||||
class SelectedSpaceController extends Notifier<int> {
|
||||
class SelectedSpaceController extends AsyncNotifier<Space> {
|
||||
@override
|
||||
int build() => 0;
|
||||
Future<Space> build() async {
|
||||
final spaces = await ref.watch(SpacesController.provider.future);
|
||||
final selectedSpaceId = ref.watch(
|
||||
KeyController.provider(KeyController.spaceKey),
|
||||
);
|
||||
|
||||
void set(int value) => state = value;
|
||||
return spaces.firstWhereOrNull((space) => space.id == selectedSpaceId) ??
|
||||
spaces.first;
|
||||
}
|
||||
|
||||
static final provider = NotifierProvider<SelectedSpaceController, int>(
|
||||
static final provider = AsyncNotifierProvider<SelectedSpaceController, Space>(
|
||||
SelectedSpaceController.new,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
12
lib/controllers/shared_prefs_controller.dart
Normal file
12
lib/controllers/shared_prefs_controller.dart
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:shared_preferences/shared_preferences.dart";
|
||||
|
||||
class SharedPrefsController extends AsyncNotifier<SharedPreferences> {
|
||||
@override
|
||||
Future<SharedPreferences> build() => SharedPreferences.getInstance();
|
||||
|
||||
static final provider =
|
||||
AsyncNotifierProvider<SharedPrefsController, SharedPreferences>(
|
||||
SharedPrefsController.new,
|
||||
);
|
||||
}
|
||||
|
|
@ -11,6 +11,10 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
|
|||
Future<IList<Space>> build() async {
|
||||
final client = await ref.watch(ClientController.provider.future);
|
||||
|
||||
ref.onDispose(
|
||||
client.onSync.stream.listen((_) => ref.invalidateSelf()).cancel,
|
||||
);
|
||||
|
||||
final topLevel = await Future.wait(
|
||||
client.rooms
|
||||
.where((room) => !room.isDirectChat)
|
||||
|
|
@ -33,12 +37,14 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
|
|||
Space(
|
||||
client: client,
|
||||
title: "Home",
|
||||
id: "home",
|
||||
children: topLevelRooms,
|
||||
icon: Icon(Icons.home),
|
||||
),
|
||||
Space(
|
||||
client: client,
|
||||
title: "Direct Messages",
|
||||
id: "dms",
|
||||
children: await Future.wait(
|
||||
client.rooms
|
||||
.where((room) => room.isDirectChat)
|
||||
|
|
@ -52,6 +58,7 @@ class SpacesController extends AsyncNotifier<IList<Space>> {
|
|||
client: client,
|
||||
title: space.title,
|
||||
avatar: space.avatar,
|
||||
id: space.roomData.id,
|
||||
roomData: space.roomData,
|
||||
children: await Future.wait(
|
||||
space.roomData.spaceChildren
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue