double tap on messages to show options #63
@ -99,90 +99,7 @@ class _ChatBubbleState extends State<ChatBubble> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void showOptionsDialog() {
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
message = ChatMessage(originalMessage: widget.bubbleData.message, originalData: widget.bubbleData.messageParameters);
|
|
||||||
var showActorDisplayName = widget.bubbleData.messageType == GetRoomResponseObjectMessageType.comment && widget.chatData.type != GetRoomResponseObjectConversationType.oneToOne;
|
|
||||||
var showBubbleTime = widget.bubbleData.messageType != GetRoomResponseObjectMessageType.system;
|
|
||||||
|
|
||||||
var actorText = Text(
|
|
||||||
widget.bubbleData.actorDisplayName,
|
|
||||||
textAlign: TextAlign.start,
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
style: TextStyle(color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold),
|
|
||||||
);
|
|
||||||
|
|
||||||
var timeText = Text(
|
|
||||||
Jiffy.parseFromMillisecondsSinceEpoch(widget.bubbleData.timestamp * 1000).format(pattern: 'HH:mm'),
|
|
||||||
textAlign: TextAlign.end,
|
|
||||||
style: TextStyle(color: widget.timeIconColor, fontSize: widget.timeIconSize),
|
|
||||||
);
|
|
||||||
|
|
||||||
return Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
|
||||||
|
|
||||||
children: [
|
|
||||||
GestureDetector(
|
|
||||||
child: Bubble(
|
|
||||||
style: getStyle(),
|
|
||||||
child: Container(
|
|
||||||
constraints: BoxConstraints(
|
|
||||||
maxWidth: MediaQuery.of(context).size.width * 0.9,
|
|
||||||
minWidth: showActorDisplayName
|
|
||||||
? actorText.size.width
|
|
||||||
: timeText.size.width + (widget.isSender ? widget.spacing + widget.timeIconSize : 0) + 3,
|
|
||||||
),
|
|
||||||
child: Stack(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(bottom: showBubbleTime ? 18 : 0, top: showActorDisplayName ? 18 : 0),
|
|
||||||
child: message.getWidget()
|
|
||||||
),
|
|
||||||
Visibility(
|
|
||||||
visible: showActorDisplayName,
|
|
||||||
child: Positioned(
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
child: actorText
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Visibility(
|
|
||||||
visible: showBubbleTime,
|
|
||||||
child: Positioned(
|
|
||||||
bottom: 0,
|
|
||||||
right: 0,
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
timeText,
|
|
||||||
if(widget.isSender) ...[
|
|
||||||
SizedBox(width: widget.spacing),
|
|
||||||
if(widget.isRead)
|
|
||||||
Icon(Icons.done_all_outlined, size: widget.timeIconSize, color: widget.timeIconColor)
|
|
||||||
else
|
|
||||||
Icon(Icons.done_outlined, size: widget.timeIconSize, color: widget.timeIconColor)
|
|
||||||
]
|
|
||||||
],
|
|
||||||
)
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Visibility(
|
|
||||||
visible: downloadProgress > 0,
|
|
||||||
child: Positioned(
|
|
||||||
bottom: 0,
|
|
||||||
right: 0,
|
|
||||||
left: 0,
|
|
||||||
child: LinearProgressIndicator(value: downloadProgress/100),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onLongPress: () {
|
|
||||||
showDialog(context: context, builder: (context) {
|
showDialog(context: context, builder: (context) {
|
||||||
var commonReactions = <String>['👍', '👎', '😆', '❤️', '👀'];
|
var commonReactions = <String>['👍', '👎', '😆', '❤️', '👀'];
|
||||||
var canReact = widget.bubbleData.messageType == GetRoomResponseObjectMessageType.comment;
|
var canReact = widget.bubbleData.messageType == GetRoomResponseObjectMessageType.comment;
|
||||||
@ -341,7 +258,38 @@ class _ChatBubbleState extends State<ChatBubble> {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
message = ChatMessage(originalMessage: widget.bubbleData.message, originalData: widget.bubbleData.messageParameters);
|
||||||
|
var showActorDisplayName = widget.bubbleData.messageType == GetRoomResponseObjectMessageType.comment && widget.chatData.type != GetRoomResponseObjectConversationType.oneToOne;
|
||||||
|
var showBubbleTime = widget.bubbleData.messageType != GetRoomResponseObjectMessageType.system;
|
||||||
|
|
||||||
|
var actorText = Text(
|
||||||
|
widget.bubbleData.actorDisplayName,
|
||||||
|
textAlign: TextAlign.start,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
style: TextStyle(color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
);
|
||||||
|
|
||||||
|
var timeText = Text(
|
||||||
|
Jiffy.parseFromMillisecondsSinceEpoch(widget.bubbleData.timestamp * 1000).format(pattern: 'HH:mm'),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
style: TextStyle(color: widget.timeIconColor, fontSize: widget.timeIconSize),
|
||||||
|
);
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
|
|
||||||
|
children: [
|
||||||
|
GestureDetector(
|
||||||
|
onLongPress: showOptionsDialog,
|
||||||
|
onDoubleTap: showOptionsDialog,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if(message.file == null) return;
|
if(message.file == null) return;
|
||||||
|
|
||||||
@ -388,6 +336,61 @@ class _ChatBubbleState extends State<ChatBubble> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
child: Bubble(
|
||||||
|
style: getStyle(),
|
||||||
|
child: Container(
|
||||||
|
constraints: BoxConstraints(
|
||||||
|
maxWidth: MediaQuery.of(context).size.width * 0.9,
|
||||||
|
minWidth: showActorDisplayName
|
||||||
|
? actorText.size.width
|
||||||
|
: timeText.size.width + (widget.isSender ? widget.spacing + widget.timeIconSize : 0) + 3,
|
||||||
|
),
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(bottom: showBubbleTime ? 18 : 0, top: showActorDisplayName ? 18 : 0),
|
||||||
|
child: message.getWidget()
|
||||||
|
),
|
||||||
|
Visibility(
|
||||||
|
visible: showActorDisplayName,
|
||||||
|
child: Positioned(
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
child: actorText
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Visibility(
|
||||||
|
visible: showBubbleTime,
|
||||||
|
child: Positioned(
|
||||||
|
bottom: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
timeText,
|
||||||
|
if(widget.isSender) ...[
|
||||||
|
SizedBox(width: widget.spacing),
|
||||||
|
if(widget.isRead)
|
||||||
|
Icon(Icons.done_all_outlined, size: widget.timeIconSize, color: widget.timeIconColor)
|
||||||
|
else
|
||||||
|
Icon(Icons.done_outlined, size: widget.timeIconSize, color: widget.timeIconColor)
|
||||||
|
]
|
||||||
|
],
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Visibility(
|
||||||
|
visible: downloadProgress > 0,
|
||||||
|
child: Positioned(
|
||||||
|
bottom: 0,
|
||||||
|
right: 0,
|
||||||
|
left: 0,
|
||||||
|
child: LinearProgressIndicator(value: downloadProgress/100),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Visibility(
|
Visibility(
|
||||||
visible: widget.bubbleData.reactions != null,
|
visible: widget.bubbleData.reactions != null,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user