Add the ability to open attachments in their own view

This commit is contained in:
Henry Hiles 2026-01-13 14:10:17 -05:00
commit dd724b04b1
No known key found for this signature in database
5 changed files with 63 additions and 5 deletions

View file

@ -60,7 +60,7 @@ A simple and user-friendly Matrix client made with Flutter and the Matrix Dart S
- [x] Attachments - [x] Attachments
- [x] Blurhashing - [x] Blurhashing
- [ ] Downloading attachments - [ ] Downloading attachments
- [ ] Opening attachments in their own view - [x] Opening attachments in their own view
- [ ] Polls - [ ] Polls
- [x] Mentions - [x] Mentions
- [x] Users - [x] Users

View file

@ -0,0 +1,14 @@
import "package:cross_cache/cross_cache.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
class CrossCacheController extends Notifier<CrossCache> {
static const String spaceKey = "space";
static const String roomKey = "room";
@override
CrossCache build() => CrossCache();
static final provider = NotifierProvider<CrossCacheController, CrossCache>(
CrossCacheController.new,
);
}

View file

@ -1,5 +1,4 @@
import "dart:async"; import "package:cross_cache/cross_cache.dart";
import "package:dynamic_polls/dynamic_polls.dart"; import "package:dynamic_polls/dynamic_polls.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_chat_core/flutter_chat_core.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:flyer_chat_text_message/flyer_chat_text_message.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:matrix/matrix.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/selected_room_controller.dart";
import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/better_when.dart";
@ -224,6 +224,39 @@ class RoomChat extends HookConsumerWidget {
globalPosition: details.globalPosition, globalPosition: details.globalPosition,
children: getMessageOptions(message), 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( builders: Builders(
loadMoreBuilder: (_) => Loading(), loadMoreBuilder: (_) => Loading(),
chatAnimatedListBuilder: (_, itemBuilder) => chatAnimatedListBuilder: (_, itemBuilder) =>
@ -432,6 +465,17 @@ class RoomChat extends HookConsumerWidget {
groupStatus: groupStatus, groupStatus: groupStatus,
alwaysShow: true, alwaysShow: true,
), ),
customImageProvider:
CachedNetworkImage(
message.source,
ref.watch(
CrossCacheController.provider,
),
headers: room
.roomData
.client
.headers,
),
errorBuilder: errorBuilder:
(context, error, stackTrace) => (context, error, stackTrace) =>
Center( Center(
@ -446,7 +490,6 @@ class RoomChat extends HookConsumerWidget {
), ),
message: message, message: message,
index: index, index: index,
headers: room.roomData.client.headers,
), ),
fileMessageBuilder: fileMessageBuilder:
( (

View file

@ -258,7 +258,7 @@ packages:
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
cross_cache: cross_cache:
dependency: transitive dependency: "direct main"
description: description:
name: cross_cache name: cross_cache
sha256: "4983a16603cc99b0a14de6a772fa8ee4533411f46f3c423f1386fea7566049c5" sha256: "4983a16603cc99b0a14de6a772fa8ee4533411f46f3c423f1386fea7566049c5"

View file

@ -73,6 +73,7 @@ dependencies:
flutter_secure_storage: ^10.0.0 flutter_secure_storage: ^10.0.0
dynamic_polls: ^0.0.6 dynamic_polls: ^0.0.6
flutter_hooks: ^0.21.3+1 flutter_hooks: ^0.21.3+1
cross_cache: ^1.1.0
dev_dependencies: dev_dependencies:
build_runner: ^2.4.11 build_runner: ^2.4.11