diff --git a/README.md b/README.md index f67c963..e72e547 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ A simple and user-friendly Matrix client made with Flutter and the Matrix Dart S - [x] Attachments - [x] Blurhashing - [ ] Downloading attachments - - [ ] Opening attachments in their own view + - [x] Opening attachments in their own view - [ ] Polls - [x] Mentions - [x] Users diff --git a/lib/controllers/cross_cache_controller.dart b/lib/controllers/cross_cache_controller.dart new file mode 100644 index 0000000..1d6d4b6 --- /dev/null +++ b/lib/controllers/cross_cache_controller.dart @@ -0,0 +1,14 @@ +import "package:cross_cache/cross_cache.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; + +class CrossCacheController extends Notifier { + static const String spaceKey = "space"; + static const String roomKey = "room"; + + @override + CrossCache build() => CrossCache(); + + static final provider = NotifierProvider( + CrossCacheController.new, + ); +} diff --git a/lib/widgets/chat_page/room_chat.dart b/lib/widgets/chat_page/room_chat.dart index 57cbfe7..9d52f0b 100644 --- a/lib/widgets/chat_page/room_chat.dart +++ b/lib/widgets/chat_page/room_chat.dart @@ -1,5 +1,4 @@ -import "dart:async"; - +import "package:cross_cache/cross_cache.dart"; import "package:dynamic_polls/dynamic_polls.dart"; import "package:flutter/material.dart"; import "package:flutter_chat_core/flutter_chat_core.dart"; @@ -12,6 +11,7 @@ import "package:flyer_chat_system_message/flyer_chat_system_message.dart"; import "package:flyer_chat_text_message/flyer_chat_text_message.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:matrix/matrix.dart"; +import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/controllers/selected_room_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/helpers/extensions/better_when.dart"; @@ -224,6 +224,39 @@ class RoomChat extends HookConsumerWidget { globalPosition: details.globalPosition, children: getMessageOptions(message), ), + onMessageTap: + ( + context, + message, { + required details, + required index, + }) { + if (message is ImageMessage) { + showDialog( + context: context, + builder: (_) => Dialog( + backgroundColor: + Colors.transparent, + insetPadding: EdgeInsets.all(64), + child: InteractiveViewer( + child: Image( + image: CachedNetworkImage( + message.source, + ref.watch( + CrossCacheController + .provider, + ), + headers: room + .roomData + .client + .headers, + ), + ), + ), + ), + ); + } + }, builders: Builders( loadMoreBuilder: (_) => Loading(), chatAnimatedListBuilder: (_, itemBuilder) => @@ -432,6 +465,17 @@ class RoomChat extends HookConsumerWidget { groupStatus: groupStatus, alwaysShow: true, ), + customImageProvider: + CachedNetworkImage( + message.source, + ref.watch( + CrossCacheController.provider, + ), + headers: room + .roomData + .client + .headers, + ), errorBuilder: (context, error, stackTrace) => Center( @@ -446,7 +490,6 @@ class RoomChat extends HookConsumerWidget { ), message: message, index: index, - headers: room.roomData.client.headers, ), fileMessageBuilder: ( diff --git a/pubspec.lock b/pubspec.lock index b299330..01d55a5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,7 +258,7 @@ packages: source: hosted version: "1.15.0" cross_cache: - dependency: transitive + dependency: "direct main" description: name: cross_cache sha256: "4983a16603cc99b0a14de6a772fa8ee4533411f46f3c423f1386fea7566049c5" diff --git a/pubspec.yaml b/pubspec.yaml index c8d465c..e733f2e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,6 +73,7 @@ dependencies: flutter_secure_storage: ^10.0.0 dynamic_polls: ^0.0.6 flutter_hooks: ^0.21.3+1 + cross_cache: ^1.1.0 dev_dependencies: build_runner: ^2.4.11