You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fluffychat/lib/pangea/widgets/chat/overlay_message.dart

120 lines
4.0 KiB
Dart

import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat/events/message_content.dart';
import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/pangea/widgets/chat/message_selection_overlay.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
class OverlayMessage extends StatelessWidget {
final PangeaMessageEvent pangeaMessageEvent;
final MessageOverlayController overlayController;
final ChatController controller;
final Event? nextEvent;
final Event? prevEvent;
final Timeline timeline;
final bool immersionMode;
final double messageWidth;
final double messageHeight;
const OverlayMessage(
this.pangeaMessageEvent, {
this.immersionMode = false,
required this.overlayController,
required this.controller,
required this.timeline,
required this.messageWidth,
required this.messageHeight,
this.nextEvent,
this.prevEvent,
super.key,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final bool ownMessage =
pangeaMessageEvent.event.senderId == Matrix.of(context).client.userID;
final displayTime =
pangeaMessageEvent.event.type == EventTypes.RoomCreate ||
nextEvent == null ||
!pangeaMessageEvent.event.originServerTs
.sameEnvironment(nextEvent!.originServerTs);
final nextEventSameSender = nextEvent != null &&
{
EventTypes.Message,
EventTypes.Sticker,
EventTypes.Encrypted,
}.contains(nextEvent!.type) &&
nextEvent!.senderId == pangeaMessageEvent.event.senderId &&
!displayTime;
final previousEventSameSender = prevEvent != null &&
{
EventTypes.Message,
EventTypes.Sticker,
EventTypes.Encrypted,
}.contains(prevEvent!.type) &&
prevEvent!.senderId == pangeaMessageEvent.event.senderId &&
prevEvent!.originServerTs
.sameEnvironment(pangeaMessageEvent.event.originServerTs);
const hardCorner = Radius.circular(4);
const roundedCorner = Radius.circular(AppConfig.borderRadius);
final borderRadius = BorderRadius.only(
topLeft: !ownMessage && nextEventSameSender ? hardCorner : roundedCorner,
topRight: ownMessage && nextEventSameSender ? hardCorner : roundedCorner,
bottomLeft:
!ownMessage && previousEventSameSender ? hardCorner : roundedCorner,
bottomRight:
ownMessage && previousEventSameSender ? hardCorner : roundedCorner,
);
final displayEvent = pangeaMessageEvent.event.getDisplayEvent(timeline);
var color = theme.colorScheme.surfaceContainerHighest;
if (ownMessage) {
color = displayEvent.status.isError
? Colors.redAccent
: theme.colorScheme.primary;
}
return Material(
color: color,
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: borderRadius,
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
AppConfig.borderRadius,
),
),
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
width: messageWidth,
height: messageHeight,
child: MessageContent(
pangeaMessageEvent.event,
textColor: ownMessage
? theme.colorScheme.onPrimary
: theme.colorScheme.onSurface,
pangeaMessageEvent: pangeaMessageEvent,
immersionMode: immersionMode,
overlayController: overlayController,
controller: controller,
nextEvent: nextEvent,
prevEvent: prevEvent,
borderRadius: borderRadius,
),
),
);
}
}