fix read indicators

This commit is contained in:
Henry Hiles 2025-11-23 14:50:38 -05:00
commit e55d7c4c58
No known key found for this signature in database
6 changed files with 36 additions and 14 deletions

View file

@ -1,21 +1,20 @@
import "dart:convert";
import "dart:io";
import "package:flutter/foundation.dart";
import "package:nexus/controllers/database_controller.dart";
import "package:vodozemac/vodozemac.dart" as voz;
import "package:flutter_vodozemac/flutter_vodozemac.dart" as voz_fl;
import "package:matrix/matrix.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/secure_storage_controller.dart";
import "package:nexus/models/session_backup.dart";
import "package:path/path.dart";
import "package:path_provider/path_provider.dart";
import "package:sqflite_common_ffi/sqflite_ffi.dart";
class ClientController extends AsyncNotifier<Client> {
static const sessionBackupKey = "sessionBackup";
@override
Future<Client> build() async {
if (!voz.isInitialized()) await voz_fl.init();
final client = Client(
"nexus",
logLevel: kReleaseMode ? Level.warning : Level.verbose,
@ -23,9 +22,7 @@ class ClientController extends AsyncNotifier<Client> {
supportedLoginTypes: {AuthenticationTypes.password},
database: await MatrixSdkDatabase.init(
"nexus",
database: await databaseFactoryFfi.openDatabase(
join((await getApplicationSupportDirectory()).path, "database.db"),
),
database: await ref.watch(DatabaseController.provider.future),
),
);

View file

@ -0,0 +1,18 @@
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:path/path.dart";
import "package:path_provider/path_provider.dart";
import "package:sqflite_common_ffi/sqflite_ffi.dart";
class DatabaseController extends AsyncNotifier<Database> {
@override
Future<Database> build() async {
databaseFactory = databaseFactoryFfi;
return databaseFactoryFfi.openDatabase(
join((await getApplicationSupportDirectory()).path, "database.db"),
);
}
static final provider = AsyncNotifierProvider<DatabaseController, Database>(
DatabaseController.new,
);
}

View file

@ -64,7 +64,8 @@ class RoomChatController extends AsyncNotifier<ChatController> {
Future<void> markRead() async {
final controller = await future;
await room.setReadMarker(controller.messages.last.id);
final id = controller.messages.last.id;
await room.setReadMarker(id, mRead: id);
}
Future<void> updateMessage(Message message, Message newMessage) async =>

View file

@ -65,6 +65,7 @@ extension ToMessage on Event {
return switch (type) {
EventTypes.Encrypted => asText.copyWith(
text: "Unable to decrypt message.",
metadata: {"formatted": "Unable to decrypt message.", ...metadata},
),
EventTypes.Message => switch (messageType) {
MessageTypes.Image => Message.image(

View file

@ -29,12 +29,13 @@ class AvatarOrHash extends StatelessWidget {
width: height,
height: height,
child: Center(
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(4)),
child: Badge(
isLabelVisible: hasBadge,
smallSize: 10,
backgroundColor: Theme.of(context).colorScheme.primary,
child: Badge(
isLabelVisible: hasBadge,
label: SizedBox.shrink(),
offset: Offset(8, -8),
backgroundColor: Theme.of(context).colorScheme.primary,
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(4)),
child: SizedBox(
width: height,
height: height,

View file

@ -21,6 +21,7 @@ import "package:nexus/widgets/chat_page/room_appbar.dart";
import "package:nexus/widgets/chat_page/spoiler_text.dart";
import "package:nexus/widgets/chat_page/top_widget.dart";
import "package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
import "package:nexus/widgets/loading.dart";
class RoomChat extends HookConsumerWidget {
final bool isDesktop;
@ -110,12 +111,15 @@ class RoomChat extends HookConsumerWidget {
onTap: () => replyToMessage.value = message,
),
builders: Builders(
loadMoreBuilder: (_) => Loading(),
chatAnimatedListBuilder: (_, itemBuilder) =>
ChatAnimatedList(
itemBuilder:
itemBuilder, // TODO: Load earlier
onEndReached: notifier.loadOlder,
onStartReached: () => notifier.markRead(),
onStartReached: () async {
notifier.markRead();
},
),
composerBuilder: (_) => ChatBox(
replyToMessage: replyToMessage.value,