feat: allow reacting to activity messages, give activity message unique styling (#1564)

This commit is contained in:
ggurdin 2025-01-23 14:32:27 -05:00 committed by GitHub
parent 98aeb60f3a
commit 3424f90672
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 107 additions and 83 deletions

View file

@ -6,6 +6,7 @@ import 'package:swipe_to_action/swipe_to_action.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat/events/message_content.dart';
import 'package:fluffychat/pages/chat/events/message_reactions.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/widgets/matrix.dart';
import '../../../config/app_config.dart';
@ -35,12 +36,8 @@ class ActivityPlanMessage extends StatelessWidget {
});
final theme = Theme.of(context);
final color = Color.alphaBlend(
Colors.white.withAlpha(180),
ThemeData.dark().colorScheme.primary,
);
final textColor = ThemeData.dark().colorScheme.onPrimary;
final color = ThemeData.light().colorScheme.primary;
final textColor = ThemeData.light().colorScheme.onPrimary;
final displayEvent = event.getDisplayEvent(timeline);
const roundedCorner = Radius.circular(AppConfig.borderRadius);
@ -68,94 +65,114 @@ class ActivityPlanMessage extends StatelessWidget {
? const SizedBox(height: 0, width: double.infinity)
: Container(
alignment: Alignment.center,
child: AnimatedOpacity(
opacity: animateIn
? 0
: event.messageType == MessageTypes.BadEncrypted ||
event.status.isSending
? 0.5
: 1,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: Container(
decoration: BoxDecoration(
color: color,
borderRadius: borderRadius,
),
clipBehavior: Clip.antiAlias,
child: CompositedTransformTarget(
link: MatrixState.pAnyState
.layerLinkAndKey(
event.eventId,
)
.link,
child: Container(
key: MatrixState.pAnyState
.layerLinkAndKey(
event.eventId,
)
.key,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
AppConfig.borderRadius,
),
),
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 1.5,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
MessageContent(
displayEvent,
textColor: textColor,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
AnimatedOpacity(
opacity: animateIn
? 0
: event.messageType ==
MessageTypes.BadEncrypted ||
event.status.isSending
? 0.5
: 1,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: Container(
decoration: BoxDecoration(
color: color,
borderRadius: borderRadius,
controller: controller,
immersionMode: false,
),
if (event.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
))
Padding(
padding: const EdgeInsets.only(
top: 4.0,
clipBehavior: Clip.antiAlias,
child: CompositedTransformTarget(
link: MatrixState.pAnyState
.layerLinkAndKey(
event.eventId,
)
.link,
child: Container(
key: MatrixState.pAnyState
.layerLinkAndKey(
event.eventId,
)
.key,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
AppConfig.borderRadius,
),
),
child: Row(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 1.5,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
MessageContent(
displayEvent,
textColor: textColor,
borderRadius: borderRadius,
controller: controller,
immersionMode: false,
),
if (event.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
)) ...[
Icon(
Icons.edit_outlined,
color: textColor.withAlpha(164),
size: 14,
),
Text(
' - ${displayEvent.originServerTs.localizedTimeShort(context)}',
style: TextStyle(
color: textColor.withAlpha(
164,
),
fontSize: 12,
))
Padding(
padding: const EdgeInsets.only(
top: 4.0,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (event.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
)) ...[
Icon(
Icons.edit_outlined,
color:
textColor.withAlpha(164),
size: 14,
),
Text(
' - ${displayEvent.originServerTs.localizedTimeShort(context)}',
style: TextStyle(
color: textColor.withAlpha(
164,
),
fontSize: 12,
),
),
],
],
),
),
],
],
),
),
],
),
),
),
),
Padding(
padding: const EdgeInsets.only(
top: 4.0,
right: 4.0,
),
child: MessageReactions(event, timeline),
),
],
),
),
],
),
),
);

View file

@ -7,6 +7,7 @@ import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat/events/message_content.dart';
import 'package:fluffychat/pages/chat/events/reply_content.dart';
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart';
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/widgets/matrix.dart';
@ -88,6 +89,10 @@ class OverlayMessage extends StatelessWidget {
);
}
if (event.isActivityMessage) {
color = ThemeData.light().colorScheme.primary;
}
final noBubble = {
MessageTypes.Video,
MessageTypes.Image,
@ -99,9 +104,11 @@ class OverlayMessage extends StatelessWidget {
MessageTypes.Audio,
}.contains(event.messageType);
final textColor = ownMessage
? ThemeData.dark().colorScheme.onPrimary
: theme.colorScheme.onSurface;
final textColor = event.isActivityMessage
? ThemeData.light().colorScheme.onPrimary
: ownMessage
? ThemeData.dark().colorScheme.onPrimary
: theme.colorScheme.onSurface;
return Material(
color: color,