|
|
@ -10,7 +10,6 @@ import 'package:fluffychat/utils/string_color.dart';
|
|
|
|
import 'package:fluffychat/widgets/avatar.dart';
|
|
|
|
import 'package:fluffychat/widgets/avatar.dart';
|
|
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
|
|
import '../../../config/app_config.dart';
|
|
|
|
import '../../../config/app_config.dart';
|
|
|
|
import '../../../widgets/hover_builder.dart';
|
|
|
|
|
|
|
|
import 'message_content.dart';
|
|
|
|
import 'message_content.dart';
|
|
|
|
import 'message_reactions.dart';
|
|
|
|
import 'message_reactions.dart';
|
|
|
|
import 'reply_content.dart';
|
|
|
|
import 'reply_content.dart';
|
|
|
@ -21,10 +20,10 @@ class Message extends StatelessWidget {
|
|
|
|
final Event event;
|
|
|
|
final Event event;
|
|
|
|
final Event? nextEvent;
|
|
|
|
final Event? nextEvent;
|
|
|
|
final bool displayReadMarker;
|
|
|
|
final bool displayReadMarker;
|
|
|
|
final void Function(Event)? onSelect;
|
|
|
|
final void Function(Event) onSelect;
|
|
|
|
final void Function(Event)? onAvatarTab;
|
|
|
|
final void Function(Event) onAvatarTab;
|
|
|
|
final void Function(Event)? onInfoTab;
|
|
|
|
final void Function(Event) onInfoTab;
|
|
|
|
final void Function(String)? scrollToEventId;
|
|
|
|
final void Function(String) scrollToEventId;
|
|
|
|
final void Function() onSwipe;
|
|
|
|
final void Function() onSwipe;
|
|
|
|
final bool longPressSelect;
|
|
|
|
final bool longPressSelect;
|
|
|
|
final bool selected;
|
|
|
|
final bool selected;
|
|
|
@ -35,10 +34,10 @@ class Message extends StatelessWidget {
|
|
|
|
this.nextEvent,
|
|
|
|
this.nextEvent,
|
|
|
|
this.displayReadMarker = false,
|
|
|
|
this.displayReadMarker = false,
|
|
|
|
this.longPressSelect = false,
|
|
|
|
this.longPressSelect = false,
|
|
|
|
this.onSelect,
|
|
|
|
required this.onSelect,
|
|
|
|
this.onInfoTab,
|
|
|
|
required this.onInfoTab,
|
|
|
|
this.onAvatarTab,
|
|
|
|
required this.onAvatarTab,
|
|
|
|
this.scrollToEventId,
|
|
|
|
required this.scrollToEventId,
|
|
|
|
required this.onSwipe,
|
|
|
|
required this.onSwipe,
|
|
|
|
this.selected = false,
|
|
|
|
this.selected = false,
|
|
|
|
required this.timeline,
|
|
|
|
required this.timeline,
|
|
|
@ -114,21 +113,11 @@ class Message extends StatelessWidget {
|
|
|
|
: Theme.of(context).colorScheme.primaryContainer;
|
|
|
|
: Theme.of(context).colorScheme.primaryContainer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
final row = HoverBuilder(
|
|
|
|
final row = Row(
|
|
|
|
builder: (context, hovered) => Row(
|
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
mainAxisAlignment: rowMainAxisAlignment,
|
|
|
|
mainAxisAlignment: rowMainAxisAlignment,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
if (hovered || selected)
|
|
|
|
if (sameSender || ownMessage)
|
|
|
|
SizedBox(
|
|
|
|
|
|
|
|
width: Avatar.defaultSize,
|
|
|
|
|
|
|
|
height: Avatar.defaultSize - 8,
|
|
|
|
|
|
|
|
child: Checkbox.adaptive(
|
|
|
|
|
|
|
|
value: selected,
|
|
|
|
|
|
|
|
onChanged: (_) => onSelect?.call(event),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
else if (sameSender || ownMessage)
|
|
|
|
|
|
|
|
SizedBox(
|
|
|
|
SizedBox(
|
|
|
|
width: Avatar.defaultSize,
|
|
|
|
width: Avatar.defaultSize,
|
|
|
|
child: Center(
|
|
|
|
child: Center(
|
|
|
@ -153,7 +142,7 @@ class Message extends StatelessWidget {
|
|
|
|
return Avatar(
|
|
|
|
return Avatar(
|
|
|
|
mxContent: user.avatarUrl,
|
|
|
|
mxContent: user.avatarUrl,
|
|
|
|
name: user.calcDisplayname(),
|
|
|
|
name: user.calcDisplayname(),
|
|
|
|
onTap: () => onAvatarTab!(event),
|
|
|
|
onTap: () => onAvatarTab(event),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
@ -232,11 +221,8 @@ class Message extends StatelessWidget {
|
|
|
|
originServerTs: DateTime.now(),
|
|
|
|
originServerTs: DateTime.now(),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
return InkWell(
|
|
|
|
return InkWell(
|
|
|
|
onTap: () {
|
|
|
|
onTap: () =>
|
|
|
|
if (scrollToEventId != null) {
|
|
|
|
scrollToEventId(replyEvent.eventId),
|
|
|
|
scrollToEventId!(replyEvent.eventId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
child: AbsorbPointer(
|
|
|
|
child: AbsorbPointer(
|
|
|
|
child: Container(
|
|
|
|
child: Container(
|
|
|
|
margin: const EdgeInsets.symmetric(
|
|
|
|
margin: const EdgeInsets.symmetric(
|
|
|
@ -292,7 +278,6 @@ class Message extends StatelessWidget {
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
|
|
|
|
);
|
|
|
|
);
|
|
|
|
Widget container;
|
|
|
|
Widget container;
|
|
|
|
if (event.hasAggregatedEvents(timeline, RelationshipTypes.reaction) ||
|
|
|
|
if (event.hasAggregatedEvents(timeline, RelationshipTypes.reaction) ||
|
|
|
@ -391,10 +376,8 @@ class Message extends StatelessWidget {
|
|
|
|
),
|
|
|
|
),
|
|
|
|
direction: SwipeDirection.endToStart,
|
|
|
|
direction: SwipeDirection.endToStart,
|
|
|
|
onSwipe: (_) => onSwipe(),
|
|
|
|
onSwipe: (_) => onSwipe(),
|
|
|
|
child: Center(
|
|
|
|
|
|
|
|
child: InkWell(
|
|
|
|
child: InkWell(
|
|
|
|
onTap: longPressSelect ? () => onSelect!(event) : null,
|
|
|
|
onTap: () => onSelect(event),
|
|
|
|
onLongPress: () => onSelect!(event),
|
|
|
|
|
|
|
|
child: Container(
|
|
|
|
child: Container(
|
|
|
|
color: selected
|
|
|
|
color: selected
|
|
|
|
? Theme.of(context).primaryColor.withAlpha(100)
|
|
|
|
? Theme.of(context).primaryColor.withAlpha(100)
|
|
|
@ -409,7 +392,6 @@ class Message extends StatelessWidget {
|
|
|
|
child: container,
|
|
|
|
child: container,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|