From a6e8a4250012810de245f506c74f5e963972e16b Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 5 Jun 2025 11:23:36 -0400 Subject: [PATCH 1/2] chore: use S3 URLs when available instead of uploading to matrix --- lib/pages/chat/events/image_bubble.dart | 45 ++++++++++++++----- .../activity_planner_builder.dart | 1 - .../activity_room_selection.dart | 2 - .../extensions/room_events_extension.dart | 41 ++++++++++------- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart index ea0439bec..f056366b1 100644 --- a/lib/pages/chat/events/image_bubble.dart +++ b/lib/pages/chat/events/image_bubble.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; @@ -112,17 +113,39 @@ class ImageBubble extends StatelessWidget { borderRadius: borderRadius, child: Hero( tag: event.eventId, - child: MxcImage( - event: event, - width: width, - height: height, - fit: fit, - animated: animated, - isThumbnail: thumbnailOnly, - placeholder: event.messageType == MessageTypes.Sticker - ? null - : _buildPlaceholder, - ), + // #Pangea + child: event.content['url'] is String && + !(event.content['url'] as String).startsWith('mxc') + ? CachedNetworkImage( + imageUrl: event.content['url'] as String, + width: width, + height: height, + fit: fit, + placeholder: (context, url) => _buildPlaceholder(context), + ) + : MxcImage( + event: event, + width: width, + height: height, + fit: fit, + animated: animated, + isThumbnail: thumbnailOnly, + placeholder: event.messageType == MessageTypes.Sticker + ? null + : _buildPlaceholder, + ), + // child: MxcImage( + // event: event, + // width: width, + // height: height, + // fit: fit, + // animated: animated, + // isThumbnail: thumbnailOnly, + // placeholder: event.messageType == MessageTypes.Sticker + // ? null + // : _buildPlaceholder, + // ), + // Pangea# ), ), ), diff --git a/lib/pangea/activity_planner/activity_planner_builder.dart b/lib/pangea/activity_planner/activity_planner_builder.dart index cb0bf261b..d8770d7ca 100644 --- a/lib/pangea/activity_planner/activity_planner_builder.dart +++ b/lib/pangea/activity_planner/activity_planner_builder.dart @@ -225,7 +225,6 @@ class ActivityPlannerBuilderState extends State { updatedActivity, avatar: avatar, filename: filename, - avatarURL: imageURL, ); } diff --git a/lib/pangea/activity_suggestions/activity_room_selection.dart b/lib/pangea/activity_suggestions/activity_room_selection.dart index cc1ed8ad4..45dc9b066 100644 --- a/lib/pangea/activity_suggestions/activity_room_selection.dart +++ b/lib/pangea/activity_suggestions/activity_room_selection.dart @@ -128,7 +128,6 @@ class ActivityRoomSelectionState extends State { widget.controller.updatedActivity, avatar: widget.controller.avatar, filename: widget.controller.filename, - avatarURL: widget.controller.imageURL, ); _launchStatus[room.id] = 1; } catch (e, s) { @@ -205,7 +204,6 @@ class ActivityRoomSelectionState extends State { widget.controller.updatedActivity, avatar: widget.controller.avatar, filename: widget.controller.filename, - avatarURL: widget.controller.imageURL, ); } _launchStatus["placeholder"] = 1; diff --git a/lib/pangea/extensions/room_events_extension.dart b/lib/pangea/extensions/room_events_extension.dart index 283993516..3da8c1272 100644 --- a/lib/pangea/extensions/room_events_extension.dart +++ b/lib/pangea/extensions/room_events_extension.dart @@ -273,15 +273,21 @@ extension EventsRoomExtension on Room { Future sendActivityPlan( ActivityPlanModel activity, { Uint8List? avatar, - String? avatarURL, String? filename, }) async { BookmarkedActivitiesRepo.save(activity); + + String? imageURL = activity.imageURL; + final eventId = await pangeaSendTextEvent( + activity.markdown, + messageTag: ModelKey.messageTagActivityPlan, + ); + Uint8List? bytes = avatar; - if (avatarURL != null && bytes == null) { + if (imageURL != null && bytes == null) { try { final resp = await http - .get(Uri.parse(avatarURL)) + .get(Uri.parse(imageURL)) .timeout(const Duration(seconds: 5)); bytes = resp.bodyBytes; } catch (e, s) { @@ -289,12 +295,20 @@ extension EventsRoomExtension on Room { e: e, s: s, data: { - "avatarURL": avatarURL, + "avatarURL": imageURL, }, ); } } + if (bytes != null && imageURL == null) { + final url = await client.uploadContent( + bytes, + filename: filename, + ); + imageURL = url.toString(); + } + MatrixFile? file; if (filename != null && bytes != null) { file = MatrixFile( @@ -302,19 +316,16 @@ extension EventsRoomExtension on Room { name: filename, ); } - final eventId = await pangeaSendTextEvent( - activity.markdown, - messageTag: ModelKey.messageTagActivityPlan, - ); if (file != null) { - await sendFileEvent( - file, - shrinkImageMaxDimension: 1600, - extraContent: { - ModelKey.messageTags: ModelKey.messageTagActivityPlan, - }, - ); + final content = { + 'msgtype': file.msgType, + 'body': file.name, + 'filename': file.name, + 'url': imageURL, + ModelKey.messageTags: ModelKey.messageTagActivityPlan, + }; + await sendEvent(content); } if (canSendDefaultStates) { From 3a56808a1c89258ce1897b897e36cfd6203cda5a Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 5 Jun 2025 11:36:31 -0400 Subject: [PATCH 2/2] chore: fix double upload on edit bookmarked activity --- lib/pangea/activity_planner/activity_planner_builder.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/pangea/activity_planner/activity_planner_builder.dart b/lib/pangea/activity_planner/activity_planner_builder.dart index d8770d7ca..48948cff0 100644 --- a/lib/pangea/activity_planner/activity_planner_builder.dart +++ b/lib/pangea/activity_planner/activity_planner_builder.dart @@ -1,5 +1,3 @@ -import 'dart:typed_data'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -25,8 +23,6 @@ class ActivityPlannerBuilder extends StatefulWidget { final Future Function( String, ActivityPlanModel, - Uint8List?, - String?, )? onEdit; const ActivityPlannerBuilder({ @@ -204,8 +200,6 @@ class ActivityPlannerBuilderState extends State { await widget.onEdit!( widget.initialActivity.bookmarkId, updatedActivity, - avatar, - filename, ); } }