diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index c07f0ad..e66e45a 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -23,13 +23,6 @@ jobs: - name: Set up Go uses: actions/setup-go@v6 - with: - go-version-file: gomuks/go.mod - - - name: Go build - run: | - cd gomuks/pkg/ffi - go build -tags goolm -o ../../../libgomuks.dll -buildmode=c-shared - name: Build with Flutter run: | diff --git a/hook/build.dart b/hook/build.dart index 165e613..13eb804 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -18,6 +18,7 @@ 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"; @@ -55,8 +56,9 @@ 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"; + print( - "Building Gomuks shared library $libFileName (${targetOS.name}/${targetArch.name}) to ${libFile.path}...", + "Building Gomuks shared library $libFileName (${targetOS.name}/${targetArch.name}) from source...", ); final result = await Process.run( "go", diff --git a/lib/controllers/author_controller.dart b/lib/controllers/author_controller.dart index 72b0f72..c7e4e05 100644 --- a/lib/controllers/author_controller.dart +++ b/lib/controllers/author_controller.dart @@ -2,7 +2,6 @@ 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"; @@ -13,7 +12,7 @@ class AuthorController extends AsyncNotifier { @override Future build() async { - final member = await ref.watch( + var member = await ref.watch( MembersController.provider(config.room).selectAsync( (value) => value.firstWhereOrNull( (membership) => membership.userId == config.message.authorId, @@ -26,12 +25,6 @@ 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 8d79f71..80e73a0 100644 --- a/lib/controllers/members_controller.dart +++ b/lib/controllers/members_controller.dart @@ -1,7 +1,6 @@ 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"; @@ -27,16 +26,8 @@ class MembersController extends AsyncNotifier> { return state.nonNulls .where((member) => member.content["membership"] == "join") .map( - (membership) => Membership.fromContent( - membership.content, - membership.stateKey!, - ref.watch( - ClientStateController.provider.select( - (value) => value?.homeserverUrl, - ), - ) ?? - "", - ), + (membership) => + Membership.fromContent(membership.content, membership.stateKey!), ) .toIList(); } diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index 27eb18e..3c6e287 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -1,9 +1,7 @@ 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"; @@ -12,13 +10,6 @@ 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; @@ -46,13 +37,7 @@ class RoomsController extends Notifier> { roomId, existing?.copyWith( hasMore: incoming.hasMore, - metadata: - incoming.metadata?.copyWith( - avatar: - incoming.metadata?.avatar?.mxcToHttps(homeserver) ?? - existing.metadata?.avatar, - ) ?? - existing.metadata, + metadata: incoming.metadata ?? existing.metadata, events: events!, state: incoming.state.entries.fold( existing.state, @@ -82,11 +67,7 @@ class RoomsController extends Notifier> { ), ), ) ?? - incoming.copyWith( - metadata: incoming.metadata?.copyWith( - avatar: incoming.metadata?.avatar?.mxcToHttps(homeserver), - ), - ), + incoming, ); }); diff --git a/lib/controllers/spaces_controller.dart b/lib/controllers/spaces_controller.dart index 7a503ad..ca217a5 100644 --- a/lib/controllers/spaces_controller.dart +++ b/lib/controllers/spaces_controller.dart @@ -1,4 +1,3 @@ -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"; @@ -100,37 +99,15 @@ 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, - ] - .map( - (space) => space.copyWith( - children: space.children - .sortedBy( - (element) => - element - .metadata - ?.sortingTimestamp - .millisecondsSinceEpoch ?? - 0, - ) - .sortedBy((room) => room.metadata?.unreadMessages ?? 0) - .reversed - .toIList(), - ), - ) - .toIList(); + Space(id: "home", title: "Home", icon: Icons.home, children: homeRooms), + Space( + id: "dms", + title: "Direct Messages", + icon: Icons.people, + children: dmRooms, + ), + ...topLevelSpacesList, + ].toIList(); } static final provider = NotifierProvider>( diff --git a/lib/helpers/extensions/mxc_to_https.dart b/lib/helpers/extensions/mxc_to_https.dart index 910f87d..468da12 100644 --- a/lib/helpers/extensions/mxc_to_https.dart +++ b/lib/helpers/extensions/mxc_to_https.dart @@ -1,5 +1,4 @@ extension MxcToHttps on Uri { - Uri mxcToHttps(String homeserver) => Uri.parse( - homeserver, - ).resolve("_matrix/client/v1/media/download/$host$path"); + Uri mxcToHttps(String homeserver) => + Uri.parse("${homeserver}_matrix/client/v1/media/download/$host$path"); } diff --git a/lib/models/membership.dart b/lib/models/membership.dart index 4e2bf4c..ec18be7 100644 --- a/lib/models/membership.dart +++ b/lib/models/membership.dart @@ -1,6 +1,5 @@ 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 @@ -15,11 +14,8 @@ abstract class Membership with _$Membership { factory Membership.fromContent( IMap content, String userId, - String homeserver, ) => Membership( - avatarUrl: Uri.tryParse( - content["avatar_url"] ?? "", - )?.mxcToHttps(homeserver), + avatarUrl: Uri.tryParse(content["avatar_url"] ?? ""), 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 147c249..8e93b6b 100644 --- a/lib/widgets/avatar_or_hash.dart +++ b/lib/widgets/avatar_or_hash.dart @@ -2,8 +2,10 @@ 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; @@ -46,7 +48,16 @@ class AvatarOrHash extends ConsumerWidget { ? fallback ?? box : Image( image: CachedNetworkImage( - avatar.toString(), + avatar! + .mxcToHttps( + ref.watch( + ClientStateController.provider.select( + (value) => value?.homeserverUrl, + ), + ) ?? + "", + ) + .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 deleted file mode 100644 index ac5bbe1..0000000 --- a/lib/widgets/chat_page/expandable_image.dart +++ /dev/null @@ -1,48 +0,0 @@ -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/image_message.dart similarity index 55% rename from lib/widgets/chat_page/expandable_image_message.dart rename to lib/widgets/chat_page/image_message.dart index f6e8a03..103fdd2 100644 --- a/lib/widgets/chat_page/expandable_image_message.dart +++ b/lib/widgets/chat_page/image_message.dart @@ -1,3 +1,4 @@ +import "dart:math"; import "package:cross_cache/cross_cache.dart"; import "package:flutter/material.dart"; import "package:flutter_chat_core/flutter_chat_core.dart"; @@ -5,7 +6,6 @@ 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; @@ -14,8 +14,31 @@ class ExpandableImageMessage extends ConsumerWidget { const ExpandableImageMessage(this.message, {required this.index, super.key}); @override - Widget build(BuildContext context, WidgetRef ref) => ExpandableImage( - message.source, + 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, + image: CachedNetworkImage( + message.source, + ref.watch(CrossCacheController.provider), + headers: ref.headers, + ), + ), + ), + ), + ), + ), + ), child: FlyerChatImageMessage( customImageProvider: CachedNetworkImage( message.source, diff --git a/lib/widgets/chat_page/room_appbar.dart b/lib/widgets/chat_page/room_appbar.dart index 03cd994..436bcb9 100644 --- a/lib/widgets/chat_page/room_appbar.dart +++ b/lib/widgets/chat_page/room_appbar.dart @@ -3,7 +3,6 @@ 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 { @@ -25,14 +24,11 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget { @override Widget build(BuildContext context) => Appbar( leading: isDesktop - ? ExpandableImage( - room.metadata?.avatar?.toString(), - child: AvatarOrHash( - room.metadata?.avatar, - room.metadata?.name ?? "Unnamed Rooms", - height: 24, - fallback: Icon(Icons.numbers), - ), + ? 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 cfbd1a8..6b3839a 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/expandable_image_message.dart"; +import "package:nexus/widgets/chat_page/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"; diff --git a/linux/runner/my_application.cc b/linux/runner/my_application.cc index abf5dc5..c702551 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), 250, -1); + gtk_widget_set_size_request(GTK_WIDGET(window), 500, 500); if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar));