Use timelines, encryption now works, except not fetching keys from old devices
This commit is contained in:
parent
1539235d7d
commit
3fd0d5f461
4 changed files with 24 additions and 42 deletions
|
|
@ -1,30 +1,18 @@
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
import "package:matrix/matrix.dart";
|
import "package:matrix/matrix.dart";
|
||||||
import "package:nexus/controllers/from_controller.dart";
|
|
||||||
|
|
||||||
class EventsController extends AsyncNotifier<GetRoomEventsResponse> {
|
class EventsController extends AsyncNotifier<Timeline> {
|
||||||
EventsController(this.room);
|
EventsController(this.room);
|
||||||
final Room room;
|
final Room room;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<GetRoomEventsResponse> build({String? from}) async {
|
Future<Timeline> build({String? from}) => room.getTimeline();
|
||||||
final response = await room.client.getRoomEvents(
|
|
||||||
room.id,
|
|
||||||
Direction.b,
|
|
||||||
from: from,
|
|
||||||
limit: 32,
|
|
||||||
);
|
|
||||||
if (ref.mounted) {
|
|
||||||
ref.watch(FromController.provider(room).notifier).set(response.end);
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<GetRoomEventsResponse> prev() async =>
|
Future<void> prev() async {
|
||||||
build(from: ref.read(FromController.provider(room)));
|
final timeline = await future;
|
||||||
|
await timeline.requestHistory();
|
||||||
|
}
|
||||||
|
|
||||||
static final provider = AsyncNotifierProvider.autoDispose
|
static final provider = AsyncNotifierProvider.autoDispose
|
||||||
.family<EventsController, GetRoomEventsResponse, Room>(
|
.family<EventsController, Timeline, Room>(EventsController.new);
|
||||||
EventsController.new,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
|
||||||
import "package:matrix/matrix.dart";
|
|
||||||
|
|
||||||
class FromController extends Notifier<String?> {
|
|
||||||
FromController(_);
|
|
||||||
@override
|
|
||||||
String? build() => null;
|
|
||||||
|
|
||||||
void set(String? value) => state = value;
|
|
||||||
|
|
||||||
static final provider =
|
|
||||||
NotifierProvider.family<FromController, String?, Room>(
|
|
||||||
FromController.new,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -60,7 +60,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
);
|
);
|
||||||
|
|
||||||
return InMemoryChatController(
|
return InMemoryChatController(
|
||||||
messages: await response.chunk.toMessages(room),
|
messages: await response.events.toMessages(room),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,14 +85,22 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> loadOlder() async {
|
Future<void> loadOlder() async {
|
||||||
|
final currentEvents = await future;
|
||||||
|
await ref.watch(EventsController.provider(room).notifier).prev();
|
||||||
|
final newEvents = await ref.watch(EventsController.provider(room).future);
|
||||||
|
|
||||||
final controller = await future;
|
final controller = await future;
|
||||||
final response = await ref
|
await controller.insertAllMessages(
|
||||||
.watch(EventsController.provider(room).notifier)
|
await newEvents.events
|
||||||
.prev();
|
.where(
|
||||||
|
(event) => !currentEvents.messages.any(
|
||||||
final messages = await response.chunk.toMessages(room);
|
(existingEvent) => existingEvent.id == event.eventId,
|
||||||
|
),
|
||||||
await controller.insertAllMessages(messages, index: 0);
|
)
|
||||||
|
.toList()
|
||||||
|
.toMessages(room),
|
||||||
|
index: 0,
|
||||||
|
);
|
||||||
ref.notifyListeners();
|
ref.notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ New Value: ${newValue is AsyncData ? newValue.value : newValue}
|
||||||
void showError(Object error, [StackTrace? stackTrace]) {
|
void showError(Object error, [StackTrace? stackTrace]) {
|
||||||
if (error.toString().contains("DioException")) return;
|
if (error.toString().contains("DioException")) return;
|
||||||
if (error.toString().contains("UTF-16")) return;
|
if (error.toString().contains("UTF-16")) return;
|
||||||
|
if (error.toString().contains("HTTP request failed")) return;
|
||||||
if (error.toString().contains("Invalid image data")) return;
|
if (error.toString().contains("Invalid image data")) return;
|
||||||
|
|
||||||
debugPrintStack(stackTrace: stackTrace, label: error.toString());
|
debugPrintStack(stackTrace: stackTrace, label: error.toString());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue