From a51c869d7e1359e416d35c6e6e52f360947ba2fa Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 21:13:18 -0400 Subject: [PATCH 01/13] Change min size for window --- linux/runner/my_application.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/runner/my_application.cc b/linux/runner/my_application.cc index c702551..abf5dc5 100644 --- a/linux/runner/my_application.cc +++ b/linux/runner/my_application.cc @@ -43,7 +43,7 @@ static void my_application_activate(GApplication* application) { } } #endif - gtk_widget_set_size_request(GTK_WIDGET(window), 500, 500); + gtk_widget_set_size_request(GTK_WIDGET(window), 250, -1); if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); From 2c4d5670e55f54617b2c41e003b387fc0b54707e Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 21:51:11 -0400 Subject: [PATCH 02/13] sort room list for unread first then recent --- lib/controllers/spaces_controller.dart | 41 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/lib/controllers/spaces_controller.dart b/lib/controllers/spaces_controller.dart index ca217a5..7a503ad 100644 --- a/lib/controllers/spaces_controller.dart +++ b/lib/controllers/spaces_controller.dart @@ -1,3 +1,4 @@ +import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; @@ -99,15 +100,37 @@ class SpacesController extends Notifier> { .toIList(); return [ - Space(id: "home", title: "Home", icon: Icons.home, children: homeRooms), - Space( - id: "dms", - title: "Direct Messages", - icon: Icons.people, - children: dmRooms, - ), - ...topLevelSpacesList, - ].toIList(); + Space( + id: "home", + title: "Home", + icon: Icons.home, + children: homeRooms, + ), + Space( + id: "dms", + title: "Direct Messages", + icon: Icons.people, + children: dmRooms, + ), + ...topLevelSpacesList, + ] + .map( + (space) => space.copyWith( + children: space.children + .sortedBy( + (element) => + element + .metadata + ?.sortingTimestamp + .millisecondsSinceEpoch ?? + 0, + ) + .sortedBy((room) => room.metadata?.unreadMessages ?? 0) + .reversed + .toIList(), + ), + ) + .toIList(); } static final provider = NotifierProvider>( From 6c064cfceffe7e49f60905cae5c1f8a1978bd72e Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:03:55 -0400 Subject: [PATCH 03/13] add more logging to build hook [skip ci] --- hook/build.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hook/build.dart b/hook/build.dart index 13eb804..5eddb6e 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -58,7 +58,7 @@ Future main(List args) => build(args, (input, output) async { final tags = targetOS == OS.android ? "goolm,noheic" : "goolm"; print( - "Building Gomuks shared library $libFileName (${targetOS.name}/${targetArch.name}) from source...", + "Building Gomuks shared library $libFileName (${targetOS.name}/${targetArch.name}) to ${libFile.path}...", ); final result = await Process.run( "go", From 84bed896329e0c49ac81cdb7c3a175caa4fefa9a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:11:04 -0400 Subject: [PATCH 04/13] temp, dont use this --- hook/build.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hook/build.dart b/hook/build.dart index 5eddb6e..59ffec3 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -56,7 +56,7 @@ Future main(List args) => build(args, (input, output) async { // goheif/dav1d supported on Android would need to fix upstream final tags = targetOS == OS.android ? "goolm,noheic" : "goolm"; - + throw "dir is: ${gomuksBuildDir.resolve("pkg/ffi/").toFilePath()}"; print( "Building Gomuks shared library $libFileName (${targetOS.name}/${targetArch.name}) to ${libFile.path}...", ); From f5c277e8b0a70079080aecec3789f312aeae41b5 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:29:24 -0400 Subject: [PATCH 05/13] go build early --- .github/workflows/windows.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e66e45a..5df6277 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -21,6 +21,11 @@ jobs: with: flutter-version: 3.41.5 + - name: test + run: | + cd gomuks/pkg/ffi + go build -tags goolm -o ../../../libgomuks.dll -buildmode=c-shared + - name: Set up Go uses: actions/setup-go@v6 From c6767863eb06a79a966bb04c925a1466c181b14f Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:35:29 -0400 Subject: [PATCH 06/13] set up go earlier --- .github/workflows/windows.yml | 6 +++--- hook/build.dart | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 5df6277..c6245a7 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -21,14 +21,14 @@ jobs: with: flutter-version: 3.41.5 + - name: Set up Go + uses: actions/setup-go@v6 + - name: test run: | cd gomuks/pkg/ffi go build -tags goolm -o ../../../libgomuks.dll -buildmode=c-shared - - name: Set up Go - uses: actions/setup-go@v6 - - name: Build with Flutter run: | flutter pub get diff --git a/hook/build.dart b/hook/build.dart index 59ffec3..1f45676 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -56,7 +56,6 @@ Future main(List args) => build(args, (input, output) async { // goheif/dav1d supported on Android would need to fix upstream final tags = targetOS == OS.android ? "goolm,noheic" : "goolm"; - throw "dir is: ${gomuksBuildDir.resolve("pkg/ffi/").toFilePath()}"; print( "Building Gomuks shared library $libFileName (${targetOS.name}/${targetArch.name}) to ${libFile.path}...", ); From e6c47c036d2f654c3a6ff8bcb545e84380a13289 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:48:14 -0400 Subject: [PATCH 07/13] fix gomuks path --- .github/workflows/windows.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index c6245a7..453d5ce 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -23,6 +23,8 @@ jobs: - name: Set up Go uses: actions/setup-go@v6 + with: + go-version-file: gomuks/go.mod - name: test run: | From 1d33eed829535b738b4cba80d3d6b292331513d9 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:52:37 -0400 Subject: [PATCH 08/13] fix error messages for images on release build --- lib/widgets/chat_page/image_message.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/widgets/chat_page/image_message.dart b/lib/widgets/chat_page/image_message.dart index 103fdd2..c8504d9 100644 --- a/lib/widgets/chat_page/image_message.dart +++ b/lib/widgets/chat_page/image_message.dart @@ -6,6 +6,7 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flyer_chat_image_message/flyer_chat_image_message.dart"; import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/helpers/extensions/get_headers.dart"; +import "package:nexus/widgets/error_dialog.dart"; class ExpandableImageMessage extends ConsumerWidget { final ImageMessage message; @@ -28,6 +29,8 @@ class ExpandableImageMessage extends ConsumerWidget { child: InteractiveViewer( child: Image( fit: BoxFit.contain, + errorBuilder: (_, error, stackTrace) => + ErrorDialog(error, stackTrace), image: CachedNetworkImage( message.source, ref.watch(CrossCacheController.provider), From c609de827982956879b473f67c8966c0e4430a01 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:54:03 -0400 Subject: [PATCH 09/13] improve errors further --- lib/widgets/chat_page/image_message.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/widgets/chat_page/image_message.dart b/lib/widgets/chat_page/image_message.dart index c8504d9..f197e66 100644 --- a/lib/widgets/chat_page/image_message.dart +++ b/lib/widgets/chat_page/image_message.dart @@ -29,8 +29,10 @@ class ExpandableImageMessage extends ConsumerWidget { child: InteractiveViewer( child: Image( fit: BoxFit.contain, - errorBuilder: (_, error, stackTrace) => - ErrorDialog(error, stackTrace), + errorBuilder: (_, error, stackTrace) => ErrorDialog( + "Loading failed for ${message.source}\nError: $error", + stackTrace, + ), image: CachedNetworkImage( message.source, ref.watch(CrossCacheController.provider), From 1f274307add7652c0ddd6ec0c6aaaecd227e9d9a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 22:59:09 -0400 Subject: [PATCH 10/13] fix Windows CI, though native windows devel may not work Needs looking into once someone wants to help develop on Windows --- .github/workflows/windows.yml | 2 +- hook/build.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 453d5ce..6266653 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -26,7 +26,7 @@ jobs: with: go-version-file: gomuks/go.mod - - name: test + - name: Do go build run: | cd gomuks/pkg/ffi go build -tags goolm -o ../../../libgomuks.dll -buildmode=c-shared diff --git a/hook/build.dart b/hook/build.dart index 1f45676..165e613 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -18,7 +18,6 @@ Future main(List args) => build(args, (input, output) async { break; case OS.windows: libFileName = "libgomuks.dll"; - env = {"GOCACHE": r"C:\Users\runneradmin\AppData\Local\go-build"}; break; case OS.android: libFileName = "libgomuks.so"; From 48adf82b7e76893b11daf870b1ada1a8061e5ab7 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 23:10:12 -0400 Subject: [PATCH 11/13] rename windows build step [skip ci] --- .github/workflows/windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 6266653..c07f0ad 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -26,7 +26,7 @@ jobs: with: go-version-file: gomuks/go.mod - - name: Do go build + - name: Go build run: | cd gomuks/pkg/ffi go build -tags goolm -o ../../../libgomuks.dll -buildmode=c-shared From ab613383826d6f1659b06174cbaae06a8339c7e7 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 27 Mar 2026 23:10:15 -0400 Subject: [PATCH 12/13] Use resolve for homeserver, fixing trailing slash issues --- lib/helpers/extensions/mxc_to_https.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/helpers/extensions/mxc_to_https.dart b/lib/helpers/extensions/mxc_to_https.dart index 468da12..910f87d 100644 --- a/lib/helpers/extensions/mxc_to_https.dart +++ b/lib/helpers/extensions/mxc_to_https.dart @@ -1,4 +1,5 @@ extension MxcToHttps on Uri { - Uri mxcToHttps(String homeserver) => - Uri.parse("${homeserver}_matrix/client/v1/media/download/$host$path"); + Uri mxcToHttps(String homeserver) => Uri.parse( + homeserver, + ).resolve("_matrix/client/v1/media/download/$host$path"); } From 690d2549bc31e8fc25137bcacf49b103b641636a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 28 Mar 2026 00:11:24 -0400 Subject: [PATCH 13/13] Expandable room icons --- lib/controllers/author_controller.dart | 9 ++- lib/controllers/members_controller.dart | 13 +++- lib/controllers/rooms_controller.dart | 23 ++++++- lib/models/membership.dart | 6 +- lib/widgets/avatar_or_hash.dart | 13 +--- lib/widgets/chat_page/expandable_image.dart | 48 ++++++++++++++ .../chat_page/expandable_image_message.dart | 35 +++++++++++ lib/widgets/chat_page/image_message.dart | 63 ------------------- lib/widgets/chat_page/room_appbar.dart | 14 +++-- lib/widgets/chat_page/room_chat.dart | 2 +- 10 files changed, 139 insertions(+), 87 deletions(-) create mode 100644 lib/widgets/chat_page/expandable_image.dart create mode 100644 lib/widgets/chat_page/expandable_image_message.dart delete mode 100644 lib/widgets/chat_page/image_message.dart diff --git a/lib/controllers/author_controller.dart b/lib/controllers/author_controller.dart index c7e4e05..72b0f72 100644 --- a/lib/controllers/author_controller.dart +++ b/lib/controllers/author_controller.dart @@ -2,6 +2,7 @@ import "dart:async"; import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/members_controller.dart"; import "package:nexus/models/configs/author_config.dart"; import "package:nexus/models/membership.dart"; @@ -12,7 +13,7 @@ class AuthorController extends AsyncNotifier { @override Future build() async { - var member = await ref.watch( + final member = await ref.watch( MembersController.provider(config.room).selectAsync( (value) => value.firstWhereOrNull( (membership) => membership.userId == config.message.authorId, @@ -25,6 +26,12 @@ class AuthorController extends AsyncNotifier { : Membership.fromContent( IMap(config.message.metadata?["pmp"]), config.message.authorId, + ref.watch( + ClientStateController.provider.select( + (value) => value?.homeserverUrl, + ), + ) ?? + "", ); return Membership( diff --git a/lib/controllers/members_controller.dart b/lib/controllers/members_controller.dart index 80e73a0..8d79f71 100644 --- a/lib/controllers/members_controller.dart +++ b/lib/controllers/members_controller.dart @@ -1,6 +1,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; +import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/models/membership.dart"; import "package:nexus/models/requests/get_room_state_request.dart"; import "package:nexus/models/room.dart"; @@ -26,8 +27,16 @@ class MembersController extends AsyncNotifier> { return state.nonNulls .where((member) => member.content["membership"] == "join") .map( - (membership) => - Membership.fromContent(membership.content, membership.stateKey!), + (membership) => Membership.fromContent( + membership.content, + membership.stateKey!, + ref.watch( + ClientStateController.provider.select( + (value) => value?.homeserverUrl, + ), + ) ?? + "", + ), ) .toIList(); } diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index 3c6e287..27eb18e 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -1,7 +1,9 @@ import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/new_events_controller.dart"; +import "package:nexus/helpers/extensions/mxc_to_https.dart"; import "package:nexus/models/read_receipt.dart"; import "package:nexus/models/room.dart"; @@ -10,6 +12,13 @@ class RoomsController extends Notifier> { IMap build() => const IMap.empty(); void update(IMap rooms, ISet leftRooms) { + final homeserver = + ref.watch( + ClientStateController.provider.select( + (value) => value?.homeserverUrl, + ), + ) ?? + ""; final merged = rooms.entries.fold(state, (acc, entry) { final roomId = entry.key; final incoming = entry.value; @@ -37,7 +46,13 @@ class RoomsController extends Notifier> { roomId, existing?.copyWith( hasMore: incoming.hasMore, - metadata: incoming.metadata ?? existing.metadata, + metadata: + incoming.metadata?.copyWith( + avatar: + incoming.metadata?.avatar?.mxcToHttps(homeserver) ?? + existing.metadata?.avatar, + ) ?? + existing.metadata, events: events!, state: incoming.state.entries.fold( existing.state, @@ -67,7 +82,11 @@ class RoomsController extends Notifier> { ), ), ) ?? - incoming, + incoming.copyWith( + metadata: incoming.metadata?.copyWith( + avatar: incoming.metadata?.avatar?.mxcToHttps(homeserver), + ), + ), ); }); diff --git a/lib/models/membership.dart b/lib/models/membership.dart index ec18be7..4e2bf4c 100644 --- a/lib/models/membership.dart +++ b/lib/models/membership.dart @@ -1,5 +1,6 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/helpers/extensions/mxc_to_https.dart"; part "membership.freezed.dart"; @freezed @@ -14,8 +15,11 @@ abstract class Membership with _$Membership { factory Membership.fromContent( IMap content, String userId, + String homeserver, ) => Membership( - avatarUrl: Uri.tryParse(content["avatar_url"] ?? ""), + avatarUrl: Uri.tryParse( + content["avatar_url"] ?? "", + )?.mxcToHttps(homeserver), userId: userId, displayName: content["displayname"] ?? userId.substring(1).split(":").first, ); diff --git a/lib/widgets/avatar_or_hash.dart b/lib/widgets/avatar_or_hash.dart index 8e93b6b..147c249 100644 --- a/lib/widgets/avatar_or_hash.dart +++ b/lib/widgets/avatar_or_hash.dart @@ -2,10 +2,8 @@ import "package:color_hash/color_hash.dart"; import "package:cross_cache/cross_cache.dart"; import "package:flutter/material.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; -import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/helpers/extensions/get_headers.dart"; -import "package:nexus/helpers/extensions/mxc_to_https.dart"; class AvatarOrHash extends ConsumerWidget { final Uri? avatar; @@ -48,16 +46,7 @@ class AvatarOrHash extends ConsumerWidget { ? fallback ?? box : Image( image: CachedNetworkImage( - avatar! - .mxcToHttps( - ref.watch( - ClientStateController.provider.select( - (value) => value?.homeserverUrl, - ), - ) ?? - "", - ) - .toString(), + avatar.toString(), ref.watch(CrossCacheController.provider), headers: ref.headers, ), diff --git a/lib/widgets/chat_page/expandable_image.dart b/lib/widgets/chat_page/expandable_image.dart new file mode 100644 index 0000000..ac5bbe1 --- /dev/null +++ b/lib/widgets/chat_page/expandable_image.dart @@ -0,0 +1,48 @@ +import "dart:math"; +import "package:cross_cache/cross_cache.dart"; +import "package:flutter/material.dart"; +import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:nexus/controllers/cross_cache_controller.dart"; +import "package:nexus/helpers/extensions/get_headers.dart"; +import "package:nexus/widgets/error_dialog.dart"; + +class ExpandableImage extends ConsumerWidget { + final Widget child; + final String? source; + const ExpandableImage(this.source, {required this.child, super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => InkWell( + onTap: source == null + ? null + : () => showDialog( + context: context, + builder: (_) => LayoutBuilder( + builder: (context, constraints) => Dialog( + backgroundColor: Colors.transparent, + insetPadding: EdgeInsets.all(constraints.maxWidth / 100), + child: ConstrainedBox( + constraints: BoxConstraints( + minWidth: min(constraints.maxWidth, 1000), + ), + child: InteractiveViewer( + child: Image( + fit: BoxFit.contain, + errorBuilder: (_, error, stackTrace) => ErrorDialog( + "Loading failed for $source\nError: $error", + stackTrace, + ), + image: CachedNetworkImage( + source!, + ref.watch(CrossCacheController.provider), + headers: ref.headers, + ), + ), + ), + ), + ), + ), + ), + child: child, + ); +} diff --git a/lib/widgets/chat_page/expandable_image_message.dart b/lib/widgets/chat_page/expandable_image_message.dart new file mode 100644 index 0000000..f6e8a03 --- /dev/null +++ b/lib/widgets/chat_page/expandable_image_message.dart @@ -0,0 +1,35 @@ +import "package:cross_cache/cross_cache.dart"; +import "package:flutter/material.dart"; +import "package:flutter_chat_core/flutter_chat_core.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:flyer_chat_image_message/flyer_chat_image_message.dart"; +import "package:nexus/controllers/cross_cache_controller.dart"; +import "package:nexus/helpers/extensions/get_headers.dart"; +import "package:nexus/widgets/chat_page/expandable_image.dart"; + +class ExpandableImageMessage extends ConsumerWidget { + final ImageMessage message; + final int index; + + const ExpandableImageMessage(this.message, {required this.index, super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => ExpandableImage( + message.source, + child: FlyerChatImageMessage( + customImageProvider: CachedNetworkImage( + message.source, + ref.watch(CrossCacheController.provider), + headers: ref.headers, + ), + errorBuilder: (context, error, stackTrace) => Center( + child: Text( + "Image Failed to Load", + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + ), + message: message, + index: index, + ), + ); +} diff --git a/lib/widgets/chat_page/image_message.dart b/lib/widgets/chat_page/image_message.dart deleted file mode 100644 index f197e66..0000000 --- a/lib/widgets/chat_page/image_message.dart +++ /dev/null @@ -1,63 +0,0 @@ -import "dart:math"; -import "package:cross_cache/cross_cache.dart"; -import "package:flutter/material.dart"; -import "package:flutter_chat_core/flutter_chat_core.dart"; -import "package:flutter_riverpod/flutter_riverpod.dart"; -import "package:flyer_chat_image_message/flyer_chat_image_message.dart"; -import "package:nexus/controllers/cross_cache_controller.dart"; -import "package:nexus/helpers/extensions/get_headers.dart"; -import "package:nexus/widgets/error_dialog.dart"; - -class ExpandableImageMessage extends ConsumerWidget { - final ImageMessage message; - final int index; - - const ExpandableImageMessage(this.message, {required this.index, super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) => InkWell( - onTap: () => showDialog( - context: context, - builder: (_) => LayoutBuilder( - builder: (context, constraints) => Dialog( - backgroundColor: Colors.transparent, - insetPadding: EdgeInsets.all(constraints.maxWidth / 100), - child: ConstrainedBox( - constraints: BoxConstraints( - minWidth: min(constraints.maxWidth, 1000), - ), - child: InteractiveViewer( - child: Image( - fit: BoxFit.contain, - errorBuilder: (_, error, stackTrace) => ErrorDialog( - "Loading failed for ${message.source}\nError: $error", - stackTrace, - ), - image: CachedNetworkImage( - message.source, - ref.watch(CrossCacheController.provider), - headers: ref.headers, - ), - ), - ), - ), - ), - ), - ), - child: FlyerChatImageMessage( - customImageProvider: CachedNetworkImage( - message.source, - ref.watch(CrossCacheController.provider), - headers: ref.headers, - ), - errorBuilder: (context, error, stackTrace) => Center( - child: Text( - "Image Failed to Load", - style: TextStyle(color: Theme.of(context).colorScheme.error), - ), - ), - message: message, - index: index, - ), - ); -} diff --git a/lib/widgets/chat_page/room_appbar.dart b/lib/widgets/chat_page/room_appbar.dart index 436bcb9..03cd994 100644 --- a/lib/widgets/chat_page/room_appbar.dart +++ b/lib/widgets/chat_page/room_appbar.dart @@ -3,6 +3,7 @@ import "package:flutter/material.dart"; import "package:nexus/models/room.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; +import "package:nexus/widgets/chat_page/expandable_image.dart"; import "package:nexus/widgets/chat_page/room_menu.dart"; class RoomAppbar extends StatelessWidget implements PreferredSizeWidget { @@ -24,11 +25,14 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget { @override Widget build(BuildContext context) => Appbar( leading: isDesktop - ? AvatarOrHash( - room.metadata?.avatar, - room.metadata?.name ?? "Unnamed Rooms", - height: 24, - fallback: Icon(Icons.numbers), + ? ExpandableImage( + room.metadata?.avatar?.toString(), + child: AvatarOrHash( + room.metadata?.avatar, + room.metadata?.name ?? "Unnamed Rooms", + height: 24, + fallback: Icon(Icons.numbers), + ), ) : DrawerButton(onPressed: () => onOpenDrawer(context)), scrolledUnderElevation: 0, diff --git a/lib/widgets/chat_page/room_chat.dart b/lib/widgets/chat_page/room_chat.dart index 6b3839a..cfbd1a8 100644 --- a/lib/widgets/chat_page/room_chat.dart +++ b/lib/widgets/chat_page/room_chat.dart @@ -14,7 +14,7 @@ import "package:nexus/helpers/extensions/show_context_menu.dart"; import "package:nexus/models/relation_type.dart"; import "package:nexus/models/requests/report_request.dart"; import "package:nexus/widgets/chat_page/composer/chat_box.dart"; -import "package:nexus/widgets/chat_page/image_message.dart"; +import "package:nexus/widgets/chat_page/expandable_image_message.dart"; import "package:nexus/widgets/chat_page/member_list.dart"; import "package:nexus/widgets/chat_page/wrappers/message_wrapper.dart"; import "package:nexus/widgets/chat_page/room_appbar.dart";