fix read indicators
This commit is contained in:
parent
919e8d11b2
commit
e55d7c4c58
6 changed files with 36 additions and 14 deletions
|
|
@ -1,21 +1,20 @@
|
||||||
import "dart:convert";
|
import "dart:convert";
|
||||||
import "dart:io";
|
import "dart:io";
|
||||||
import "package:flutter/foundation.dart";
|
import "package:flutter/foundation.dart";
|
||||||
|
import "package:nexus/controllers/database_controller.dart";
|
||||||
import "package:vodozemac/vodozemac.dart" as voz;
|
import "package:vodozemac/vodozemac.dart" as voz;
|
||||||
import "package:flutter_vodozemac/flutter_vodozemac.dart" as voz_fl;
|
import "package:flutter_vodozemac/flutter_vodozemac.dart" as voz_fl;
|
||||||
import "package:matrix/matrix.dart";
|
import "package:matrix/matrix.dart";
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
import "package:nexus/controllers/secure_storage_controller.dart";
|
import "package:nexus/controllers/secure_storage_controller.dart";
|
||||||
import "package:nexus/models/session_backup.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> {
|
class ClientController extends AsyncNotifier<Client> {
|
||||||
static const sessionBackupKey = "sessionBackup";
|
static const sessionBackupKey = "sessionBackup";
|
||||||
@override
|
@override
|
||||||
Future<Client> build() async {
|
Future<Client> build() async {
|
||||||
if (!voz.isInitialized()) await voz_fl.init();
|
if (!voz.isInitialized()) await voz_fl.init();
|
||||||
|
|
||||||
final client = Client(
|
final client = Client(
|
||||||
"nexus",
|
"nexus",
|
||||||
logLevel: kReleaseMode ? Level.warning : Level.verbose,
|
logLevel: kReleaseMode ? Level.warning : Level.verbose,
|
||||||
|
|
@ -23,9 +22,7 @@ class ClientController extends AsyncNotifier<Client> {
|
||||||
supportedLoginTypes: {AuthenticationTypes.password},
|
supportedLoginTypes: {AuthenticationTypes.password},
|
||||||
database: await MatrixSdkDatabase.init(
|
database: await MatrixSdkDatabase.init(
|
||||||
"nexus",
|
"nexus",
|
||||||
database: await databaseFactoryFfi.openDatabase(
|
database: await ref.watch(DatabaseController.provider.future),
|
||||||
join((await getApplicationSupportDirectory()).path, "database.db"),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
18
lib/controllers/database_controller.dart
Normal file
18
lib/controllers/database_controller.dart
Normal 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,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -64,7 +64,8 @@ class RoomChatController extends AsyncNotifier<ChatController> {
|
||||||
|
|
||||||
Future<void> markRead() async {
|
Future<void> markRead() async {
|
||||||
final controller = await future;
|
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 =>
|
Future<void> updateMessage(Message message, Message newMessage) async =>
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,7 @@ extension ToMessage on Event {
|
||||||
return switch (type) {
|
return switch (type) {
|
||||||
EventTypes.Encrypted => asText.copyWith(
|
EventTypes.Encrypted => asText.copyWith(
|
||||||
text: "Unable to decrypt message.",
|
text: "Unable to decrypt message.",
|
||||||
|
metadata: {"formatted": "Unable to decrypt message.", ...metadata},
|
||||||
),
|
),
|
||||||
EventTypes.Message => switch (messageType) {
|
EventTypes.Message => switch (messageType) {
|
||||||
MessageTypes.Image => Message.image(
|
MessageTypes.Image => Message.image(
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,13 @@ class AvatarOrHash extends StatelessWidget {
|
||||||
width: height,
|
width: height,
|
||||||
height: height,
|
height: height,
|
||||||
child: Center(
|
child: Center(
|
||||||
child: ClipRRect(
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(4)),
|
|
||||||
child: Badge(
|
child: Badge(
|
||||||
isLabelVisible: hasBadge,
|
isLabelVisible: hasBadge,
|
||||||
smallSize: 10,
|
label: SizedBox.shrink(),
|
||||||
|
offset: Offset(8, -8),
|
||||||
backgroundColor: Theme.of(context).colorScheme.primary,
|
backgroundColor: Theme.of(context).colorScheme.primary,
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(4)),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: height,
|
width: height,
|
||||||
height: height,
|
height: height,
|
||||||
|
|
|
||||||
|
|
@ -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/spoiler_text.dart";
|
||||||
import "package:nexus/widgets/chat_page/top_widget.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:flutter_widget_from_html_core/flutter_widget_from_html_core.dart";
|
||||||
|
import "package:nexus/widgets/loading.dart";
|
||||||
|
|
||||||
class RoomChat extends HookConsumerWidget {
|
class RoomChat extends HookConsumerWidget {
|
||||||
final bool isDesktop;
|
final bool isDesktop;
|
||||||
|
|
@ -110,12 +111,15 @@ class RoomChat extends HookConsumerWidget {
|
||||||
onTap: () => replyToMessage.value = message,
|
onTap: () => replyToMessage.value = message,
|
||||||
),
|
),
|
||||||
builders: Builders(
|
builders: Builders(
|
||||||
|
loadMoreBuilder: (_) => Loading(),
|
||||||
chatAnimatedListBuilder: (_, itemBuilder) =>
|
chatAnimatedListBuilder: (_, itemBuilder) =>
|
||||||
ChatAnimatedList(
|
ChatAnimatedList(
|
||||||
itemBuilder:
|
itemBuilder:
|
||||||
itemBuilder, // TODO: Load earlier
|
itemBuilder, // TODO: Load earlier
|
||||||
onEndReached: notifier.loadOlder,
|
onEndReached: notifier.loadOlder,
|
||||||
onStartReached: () => notifier.markRead(),
|
onStartReached: () async {
|
||||||
|
notifier.markRead();
|
||||||
|
},
|
||||||
),
|
),
|
||||||
composerBuilder: (_) => ChatBox(
|
composerBuilder: (_) => ChatBox(
|
||||||
replyToMessage: replyToMessage.value,
|
replyToMessage: replyToMessage.value,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue