From 4a0ee3665f75d6b926d39232608a5249fe3e40e7 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 17 Jun 2024 10:02:41 -0400 Subject: [PATCH 1/8] Can't add subclass as parent space --- lib/pages/chat_list/chat_list.dart | 4 ++-- .../children_and_parents_extension.dart | 10 ++++++++++ .../pangea_room_extension/pangea_room_extension.dart | 2 ++ lib/pangea/widgets/class/add_space_toggles.dart | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 47fb51235..77df5b07f 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -815,8 +815,8 @@ class ChatListController extends State && selectedRoomIds .map((id) => Matrix.of(context).client.getRoomById(id)) - .where((e) => !(e?.isPangeaClass ?? true)) - .every((e) => r.canIAddSpaceChild(e)), + // .where((e) => !(e?.isPangeaClass ?? true)) + .every((e) => r.canAddAsParentOf(e)), //Pangea# ) .map( diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index 78ab91cc8..e5e7e6003 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -127,4 +127,14 @@ extension ChildrenAndParentsRoomExtension on Room { } return childIds; } + + // Checks if can add chat as child + // Or whether potential child space is ancestor of this + bool _canAddAsParentOf(Room? child) { + if (child == null || !child.isSpace) { + return _canIAddSpaceChild(child); + } + if (id == child.id) return false; + return !child._allSpaceChildRoomIds.contains(id); + } } diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index edcd80b04..25694901c 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -114,6 +114,8 @@ extension PangeaRoom on Room { List get allSpaceChildRoomIds => _allSpaceChildRoomIds; + bool canAddAsParentOf(Room? child) => _canAddAsParentOf(child); + // class_and_exchange_settings DateTime? get rulesUpdatedAt => _rulesUpdatedAt; diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index cfea4dd7b..69122356b 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -146,7 +146,7 @@ class AddToSpaceState extends State { final Room possibleParent = possibleParents[index]; final bool canAdd = !(!possibleParent.isRoomAdmin && widget.mode == AddToClassMode.exchange) && - possibleParent.canIAddSpaceChild(room); + possibleParent.canAddAsParentOf(room); return Opacity( opacity: canAdd ? 1 : 0.5, From aa5d09407ec27d58fe59a5de6996b90488bc540d Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 17 Jun 2024 10:16:43 -0400 Subject: [PATCH 2/8] Make sure user has permission to add space child --- lib/pages/chat_list/chat_list.dart | 1 - .../children_and_parents_extension.dart | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 77df5b07f..58b3f9223 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -815,7 +815,6 @@ class ChatListController extends State && selectedRoomIds .map((id) => Matrix.of(context).client.getRoomById(id)) - // .where((e) => !(e?.isPangeaClass ?? true)) .every((e) => r.canAddAsParentOf(e)), //Pangea# ) diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index e5e7e6003..b0350853d 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -128,13 +128,15 @@ extension ChildrenAndParentsRoomExtension on Room { return childIds; } - // Checks if can add chat as child - // Or whether potential child space is ancestor of this + // Checks if has permissions to add child to space + // And whether potential child space is ancestor of this bool _canAddAsParentOf(Room? child) { if (child == null || !child.isSpace) { return _canIAddSpaceChild(child); } if (id == child.id) return false; - return !child._allSpaceChildRoomIds.contains(id); + return _isRoomAdmin && + child._isRoomAdmin && + !child._allSpaceChildRoomIds.contains(id); } } From a2a31e526aa107612c21902deb3f0f182b379c49 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 17 Jun 2024 12:25:05 -0400 Subject: [PATCH 3/8] Gray out buttons for spaces user isn't admin for --- assets/l10n/intl_en.arb | 5 ++++- lib/pages/chat_list/chat_list.dart | 22 ++++++++++++++++++- .../children_and_parents_extension.dart | 8 +++---- .../widgets/class/add_space_toggles.dart | 10 ++++++--- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 84703a551..c8224dccb 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3970,5 +3970,8 @@ "capacitySetTooLow": "Room capacity cannot be set below the current number of non-admins.", "roomCapacityExplanation": "Room capacity limits the number of non-admins allowed in a room.", "enterNumber": "Please enter a whole number value.", - "buildTranslation": "Build your translation from the choices above" + "buildTranslation": "Build your translation from the choices above", + "nonexistentSelection": "Selection no longer exists.", + "cantAddSpaceChild": "You do not have permission to add a child to this space.", + "roomAddedToSpace": "Room(s) have been added to the selected space." } \ No newline at end of file diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 58b3f9223..f8faceec5 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -797,6 +797,10 @@ class ChatListController extends State // Pangea# Future addToSpace() async { + // #Pangea + final firstSelectedRoom = + Matrix.of(context).client.getRoomById(selectedRoomIds.toList().first); + // Pangea# final selectedSpace = await showConfirmationDialog( context: context, title: L10n.of(context)!.addToSpace, @@ -825,6 +829,12 @@ class ChatListController extends State // label: space // .getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), label: space.nameIncludingParents(context), + textStyle: TextStyle( + color: (firstSelectedRoom == null || + (firstSelectedRoom.isSpace && !space.isRoomAdmin)) + ? Theme.of(context).colorScheme.outline + : Theme.of(context).colorScheme.surfaceTint, + ), // Pangea# ), ) @@ -836,12 +846,19 @@ class ChatListController extends State future: () async { final space = Matrix.of(context).client.getRoomById(selectedSpace)!; // #Pangea + if (firstSelectedRoom == null) { + throw L10n.of(context)!.nonexistentSelection; + } + if (firstSelectedRoom.isSpace && !space.isRoomAdmin) { + throw L10n.of(context)!.cantAddSpaceChild; + } await pangeaAddToSpace( space, selectedRoomIds.toList(), context, pangeaController, ); + // if (space.canSendDefaultStates) { // for (final roomId in selectedRoomIds) { // await space.setSpaceChild(roomId); @@ -854,7 +871,10 @@ class ChatListController extends State if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(L10n.of(context)!.chatHasBeenAddedToThisSpace), + // #Pangea + // content: Text(L10n.of(context)!.chatHasBeenAddedToThisSpace), + content: Text(L10n.of(context)!.roomAddedToSpace), + // Pangea# ), ); } diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index b0350853d..24dad6c41 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -128,15 +128,13 @@ extension ChildrenAndParentsRoomExtension on Room { return childIds; } - // Checks if has permissions to add child to space - // And whether potential child space is ancestor of this + // Checks if has permissions to add child chat + // Or whether potential child space is ancestor of this bool _canAddAsParentOf(Room? child) { if (child == null || !child.isSpace) { return _canIAddSpaceChild(child); } if (id == child.id) return false; - return _isRoomAdmin && - child._isRoomAdmin && - !child._allSpaceChildRoomIds.contains(id); + return !child._allSpaceChildRoomIds.contains(id); } } diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index 69122356b..c2ed32efe 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -144,9 +144,13 @@ class AddToSpaceState extends State { Widget getAddToSpaceToggleItem(int index) { final Room possibleParent = possibleParents[index]; - final bool canAdd = !(!possibleParent.isRoomAdmin && - widget.mode == AddToClassMode.exchange) && - possibleParent.canAddAsParentOf(room); + final bool canAdd = (room?.isSpace ?? false) + // Room is space + ? possibleParent.isRoomAdmin && + room!.isRoomAdmin && + possibleParent.canAddAsParentOf(room) + // Room is null or chat + : possibleParent.canAddAsParentOf(room); return Opacity( opacity: canAdd ? 1 : 0.5, From c2245f045f21be458b651bcf8889bf97b6301da4 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 18 Jun 2024 10:16:17 -0400 Subject: [PATCH 4/8] enables recording on web --- lib/pages/chat/chat.dart | 13 ++++++-- lib/pages/chat/recording_dialog.dart | 46 ++++++++++++++++++++++++++-- lib/utils/platform_infos.dart | 6 ++-- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 69afab2aa..87194da6f 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -808,11 +808,18 @@ class ChatController extends State builder: (c) => const RecordingDialog(), ); if (result == null) return; - final audioFile = File(result.path); + // #Pangea + // enable web recording + // final audioFile = File(result.path); + // final file = MatrixAudioFile( + // bytes: audioFile.readAsBytesSync(), + // name: audioFile.path, + // ); final file = MatrixAudioFile( - bytes: audioFile.readAsBytesSync(), - name: audioFile.path, + bytes: result.bytes, + name: result.path, ); + // Pangea# await room.sendFileEvent( file, inReplyTo: replyEvent, diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart index 805f090df..f0a57b73c 100644 --- a/lib/pages/chat/recording_dialog.dart +++ b/lib/pages/chat/recording_dialog.dart @@ -1,11 +1,14 @@ import 'dart:async'; +import 'dart:io'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/utils/update_version_dialog.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:http/http.dart' as http; import 'package:path_provider/path_provider.dart'; import 'package:record/record.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; @@ -39,9 +42,15 @@ class RecordingDialogState extends State { Future startRecording() async { try { - final tempDir = await getTemporaryDirectory(); + // #Pangea + // enable recording on web + // final tempDir = await getTemporaryDirectory(); + // final path = _recordedPath = + // '${tempDir.path}/recording${DateTime.now().microsecondsSinceEpoch}.${RecordingDialog.recordingFileType}'; + final tempDirPath = kIsWeb ? "." : (await getTemporaryDirectory()).path; _recordedPath = - '${tempDir.path}/recording${DateTime.now().microsecondsSinceEpoch}.${RecordingDialog.recordingFileType}'; + '$tempDirPath/recording${DateTime.now().microsecondsSinceEpoch}.${RecordingDialog.recordingFileType}'; + // Pangea# final result = await _audioRecorder.hasPermission(); if (result != true) { @@ -105,9 +114,25 @@ class RecordingDialogState extends State { void _stopAndSend() async { _recorderSubscription?.cancel(); - await _audioRecorder.stop(); + // #Pangea + // await _audioRecorder.stop(); + final outputPath = await _audioRecorder.stop(); + // Pangea# final path = _recordedPath; if (path == null) throw ('Recording failed!'); + + // #Pangea + Uint8List bytes; + if (kIsWeb) { + if (outputPath == null) throw ('Recording failed!'); + final response = await http.get(Uri.parse(outputPath)); + bytes = response.bodyBytes; + } else { + final audioFile = File(path); + bytes = audioFile.readAsBytesSync(); + } + // Pangea# + const waveCount = AudioPlayerWidget.wavesCount; final step = amplitudeTimeline.length < waveCount ? 1 @@ -121,6 +146,9 @@ class RecordingDialogState extends State { path: path, duration: _duration.inMilliseconds, waveform: waveform, + // #Pangea + bytes: bytes, + // Pangea# ), ); } @@ -231,11 +259,17 @@ class RecordingResult { final String path; final int duration; final List waveform; + // #Pangea + final Uint8List bytes; + // Pangea# const RecordingResult({ required this.path, required this.duration, required this.waveform, + // #Pangea + required this.bytes, + // Pangea# }); factory RecordingResult.fromJson(Map json) => @@ -243,11 +277,17 @@ class RecordingResult { path: json['path'], duration: json['duration'], waveform: List.from(json['waveform']), + // #Pangea + bytes: Uint8List.fromList(json['bytes']), + // Pangea# ); Map toJson() => { 'path': path, 'duration': duration, 'waveform': waveform, + // #Pangea + 'bytes': bytes, + // Pangea# }; } diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 9094b774b..350fc914f 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; @@ -29,7 +28,10 @@ abstract class PlatformInfos { static bool get usesTouchscreen => !isMobile; - static bool get platformCanRecord => (isMobile || isMacOS); + // #Pangea + // static bool get platformCanRecord => (isMobile || isMacOS); + static bool get platformCanRecord => (isMobile || isMacOS || kIsWeb); + // Pangea# static String get clientName => '${AppConfig.applicationName} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; From 59ab741168da320d368448a859a6dfb9eb3fce14 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 18 Jun 2024 14:10:18 -0400 Subject: [PATCH 5/8] Added explanatory comments --- lib/pages/chat_list/chat_list.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index f8faceec5..6397846dd 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -819,6 +819,8 @@ class ChatListController extends State && selectedRoomIds .map((id) => Matrix.of(context).client.getRoomById(id)) + // Only show non-recursion-causing spaces + // Performs a few other checks as well .every((e) => r.canAddAsParentOf(e)), //Pangea# ) @@ -829,6 +831,7 @@ class ChatListController extends State // label: space // .getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), label: space.nameIncludingParents(context), + // If user is not admin of space, button is grayed out textStyle: TextStyle( color: (firstSelectedRoom == null || (firstSelectedRoom.isSpace && !space.isRoomAdmin)) @@ -849,6 +852,7 @@ class ChatListController extends State if (firstSelectedRoom == null) { throw L10n.of(context)!.nonexistentSelection; } + // If user is not admin of the would-be parent space, does not allow if (firstSelectedRoom.isSpace && !space.isRoomAdmin) { throw L10n.of(context)!.cantAddSpaceChild; } From 1cf0caf48dd7b8174f12770e1de9315f5b8137a5 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 18 Jun 2024 15:15:30 -0400 Subject: [PATCH 6/8] Fix archiving bugs --- lib/pages/chat_list/space_view.dart | 10 ++++++++++ .../pangea_room_extension/events_extension.dart | 9 +++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 66c07b135..6a1b93889 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -338,6 +338,16 @@ class _SpaceViewState extends State { widget.controller.cancelAction(); // #Pangea if (room == null || room.membership == Membership.leave) return; + if (room.isSpace) { + await room.archiveSpace( + context, + Matrix.of(context).client, + onlyAdmin: false, + ); + } else { + widget.controller.toggleSelection(room.id); + await widget.controller.archiveAction(); + } // Pangea# _refresh(); break; diff --git a/lib/pangea/extensions/pangea_room_extension/events_extension.dart b/lib/pangea/extensions/pangea_room_extension/events_extension.dart index 631d21478..f878bc3cb 100644 --- a/lib/pangea/extensions/pangea_room_extension/events_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/events_extension.dart @@ -60,9 +60,14 @@ extension EventsRoomExtension on Room { future: () async { final List children = await getChildRooms(); for (final Room child in children) { - await child.archive(); + if (!child.isAnalyticsRoom) { + if (child.membership != Membership.join) { + child.join; + } + await child.archive(); + } } - await archive(); + await _archive(); }, ); MatrixState.pangeaController.classController From 718a998576af34305740a6f51f9f6590bb09cba6 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 18 Jun 2024 15:57:06 -0400 Subject: [PATCH 7/8] Fix room locking bugs --- .../room_information_extension.dart | 10 ++++------ lib/pangea/utils/lock_room.dart | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart b/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart index e204e3f83..a6c5af180 100644 --- a/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/room_information_extension.dart @@ -71,18 +71,16 @@ extension RoomInformationRoomExtension on Room { return (eventsDefaultPowerLevel ?? 0) >= ClassDefaultValues.powerLevelOfAdmin; } - int joinedRooms = 0; for (final child in spaceChildren) { if (child.roomId == null) continue; final Room? room = client.getRoomById(child.roomId!); - if (room?.isLocked == false) { + if (room == null || room.isAnalyticsRoom || room.isArchived) continue; + if (!room._isLocked) { return false; } - if (room != null) { - joinedRooms += 1; - } } - return joinedRooms > 0 ? true : false; + return (eventsDefaultPowerLevel ?? 0) >= + ClassDefaultValues.powerLevelOfAdmin; } bool get _isPangeaClass => isSpace && languageSettingsStateEvent != null; diff --git a/lib/pangea/utils/lock_room.dart b/lib/pangea/utils/lock_room.dart index 420cc07ff..2bd803093 100644 --- a/lib/pangea/utils/lock_room.dart +++ b/lib/pangea/utils/lock_room.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:matrix/matrix.dart'; Future lockRoom(Room room, Client client) async { @@ -65,7 +66,7 @@ Future lockSpace(Room space, Client client) async { continue; } } - if (child == null) continue; + if (child == null || child.isArchived || child.isAnalyticsRoom) continue; child.isSpace ? await lockSpace(child, client) : await lockChat(child, client); From ebf6c889327e56cc0fc51b0956283a87372c140e Mon Sep 17 00:00:00 2001 From: Kelrap Date: Wed, 19 Jun 2024 11:16:57 -0400 Subject: [PATCH 8/8] Fix edited messages not showing --- lib/pages/chat/events/message_content.dart | 5 ++-- lib/pangea/widgets/chat/overlay_message.dart | 29 ++++++-------------- lib/pangea/widgets/igc/pangea_rich_text.dart | 11 ++++---- 3 files changed, 16 insertions(+), 29 deletions(-) diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index ee6753e8b..01ae471f8 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -286,6 +286,8 @@ class MessageContent extends StatelessWidget { final bigEmotes = event.onlyEmotes && event.numberEmotes > 0 && event.numberEmotes <= 10; + // #Pangea + // return Linkify( final messageTextStyle = TextStyle( color: textColor, fontSize: bigEmotes ? fontSize * 3 : fontSize, @@ -301,11 +303,10 @@ class MessageContent extends StatelessWidget { ); } else if (pangeaMessageEvent != null) { toolbarController?.toolbar?.textSelection.setMessageText( - pangeaMessageEvent!.body, + (event.getDisplayEvent(pangeaMessageEvent!.timeline).body), ); } - // return Linkify( return SelectableLinkify( onSelectionChanged: (selection, cause) { if (cause == SelectionChangedCause.longPress && diff --git a/lib/pangea/widgets/chat/overlay_message.dart b/lib/pangea/widgets/chat/overlay_message.dart index bc25ffe14..d7c99f07b 100644 --- a/lib/pangea/widgets/chat/overlay_message.dart +++ b/lib/pangea/widgets/chat/overlay_message.dart @@ -15,14 +15,12 @@ class OverlayMessage extends StatelessWidget { final Event? previousEvent; final bool selected; final Timeline timeline; - // #Pangea // final LanguageModel? selectedDisplayLang; final bool immersionMode; // final bool definitions; final bool ownMessage; final ToolbarDisplayController toolbarController; final double? width; - // Pangea# const OverlayMessage( this.event, { @@ -30,12 +28,10 @@ class OverlayMessage extends StatelessWidget { this.previousEvent, this.selected = false, required this.timeline, - // #Pangea required this.immersionMode, required this.ownMessage, required this.toolbarController, this.width, - // Pangea# super.key, }); @@ -46,14 +42,12 @@ class OverlayMessage extends StatelessWidget { return const SizedBox.shrink(); } - var color = Theme.of(context).colorScheme.surfaceVariant; - // #Pangea + var color = Theme.of(context).colorScheme.surfaceContainerHighest; final isLight = Theme.of(context).brightness == Brightness.light; var lightness = isLight ? .05 : .85; - // Pangea# final textColor = ownMessage ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground; + : Theme.of(context).colorScheme.onSurface; const hardCorner = Radius.circular(4); @@ -118,13 +112,11 @@ class OverlayMessage extends StatelessWidget { : (color.blue * lightness).round(), ); - // #Pangea final pangeaMessageEvent = PangeaMessageEvent( event: event, timeline: timeline, ownMessage: ownMessage, ); - // Pangea# return Material( color: noBubble ? Colors.transparent : color, @@ -152,7 +144,7 @@ class OverlayMessage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ MessageContent( - event, + event.getDisplayEvent(timeline), textColor: textColor, borderRadius: borderRadius, selected: selected, @@ -162,13 +154,10 @@ class OverlayMessage extends StatelessWidget { isOverlay: true, ), if (event.hasAggregatedEvents( - timeline, - RelationshipTypes.edit, - ) // #Pangea - || - (pangeaMessageEvent.showUseType) - // Pangea# - ) + timeline, + RelationshipTypes.edit, + ) || + (pangeaMessageEvent.showUseType)) Padding( padding: const EdgeInsets.only( top: 4.0, @@ -176,7 +165,6 @@ class OverlayMessage extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: [ - // #Pangea if (pangeaMessageEvent.showUseType) ...[ pangeaMessageEvent.useType.iconView( context, @@ -188,14 +176,13 @@ class OverlayMessage extends StatelessWidget { timeline, RelationshipTypes.edit, )) ...[ - // Pangea# Icon( Icons.edit_outlined, color: textColor.withAlpha(164), size: 14, ), Text( - ' - ${event.originServerTs.localizedTimeShort(context)}', + ' - ${event.getDisplayEvent(timeline).originServerTs.localizedTimeShort(context)}', style: TextStyle( color: textColor.withAlpha(164), fontSize: 12, diff --git a/lib/pangea/widgets/igc/pangea_rich_text.dart b/lib/pangea/widgets/igc/pangea_rich_text.dart index 262f37824..5f8dc615e 100644 --- a/lib/pangea/widgets/igc/pangea_rich_text.dart +++ b/lib/pangea/widgets/igc/pangea_rich_text.dart @@ -70,12 +70,11 @@ class PangeaRichTextState extends State { void setTextSpan() { if (_fetchingRepresentation == true) { - _setTextSpan(textSpan = widget.pangeaMessageEvent.body); - return; - } - - if (repEvent != null) { - _setTextSpan(repEvent!.text); + _setTextSpan( + textSpan = widget.pangeaMessageEvent.event + .getDisplayEvent(widget.pangeaMessageEvent.timeline) + .body, + ); return; }