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,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user