Skip to content

Commit 69d884a

Browse files
Wahid NasriWahid Nasri
Wahid Nasri
authored and
Wahid Nasri
committed
implement send a reply to message
1 parent 71a7417 commit 69d884a

File tree

3 files changed

+147
-10
lines changed

3 files changed

+147
-10
lines changed

lib/ui/extensions/UiMessages.dart

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,48 @@ import 'package:flutter_mqtt/db/tables/ExtendedDbContact.dart';
1111
import 'package:cached_network_image/cached_network_image.dart';
1212
import 'package:intl/intl.dart';
1313

14+
extension UIMessageExtensions on types.Message {
15+
Widget toRespondedWidget(Function() onDelete) {
16+
String imageUri = "";
17+
String text = "File";
18+
if (this is types.ImageMessage) {
19+
imageUri = (this as types.ImageMessage).uri;
20+
text = "Image";
21+
} else if (this is types.TextMessage) {
22+
text = (this as types.TextMessage).text;
23+
}
24+
return Container(
25+
margin: EdgeInsets.all(5),
26+
decoration: BoxDecoration(
27+
color: Color(0xE0E0E2E8),
28+
borderRadius: BorderRadius.all(Radius.circular(10))),
29+
child: Row(
30+
mainAxisSize: MainAxisSize.max,
31+
crossAxisAlignment: CrossAxisAlignment.center,
32+
children: [
33+
IconButton(onPressed: onDelete, icon: Icon(Icons.close)),
34+
imageUri.isNotEmpty
35+
? CircleAvatar(
36+
foregroundImage: NetworkImage(imageUri.toString()),
37+
radius: 20)
38+
: SizedBox(),
39+
Expanded(
40+
child: Column(
41+
crossAxisAlignment: CrossAxisAlignment.start,
42+
children: [
43+
Text(
44+
author.firstName ?? "",
45+
style: TextStyle(fontWeight: FontWeight.bold),
46+
),
47+
Text(text)
48+
],
49+
))
50+
],
51+
),
52+
);
53+
}
54+
}
55+
1456
extension MessageConversions on ChatMessage {
1557
types.Message toUiMessage() {
1658
var author = types.User(id: fromId ?? "", firstName: fromName);
@@ -53,7 +95,7 @@ extension MessageConversions on ChatMessage {
5395
return SizedBox();
5496
}
5597

56-
Widget toPagerItem(){
98+
Widget toPagerItem() {
5799
if (type == MessageType.ChatImage) {
58100
return CachedNetworkImage(
59101
progressIndicatorBuilder: (context, url, downloadProgress) =>
@@ -67,8 +109,9 @@ extension MessageConversions on ChatMessage {
67109
return SizedBox();
68110
}
69111

70-
String formatDate(String format){
71-
return DateFormat(format).format(DateTime.fromMillisecondsSinceEpoch(sendTime));
112+
String formatDate(String format) {
113+
return DateFormat(format)
114+
.format(DateTime.fromMillisecondsSinceEpoch(sendTime));
72115
}
73116
}
74117

lib/ui/screens/fromdb/chat_db_pages.dart

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async';
22

33
import 'package:file_picker/file_picker.dart';
4+
import 'package:flutter/cupertino.dart';
45
import 'package:flutter/material.dart';
56
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
67
import 'package:flutter_mqtt/abstraction/models/ChatMessage.dart';
@@ -12,6 +13,7 @@ import 'package:flutter_mqtt/global/ChatApp.dart';
1213
import 'package:flutter_mqtt/ui/screens/fromdb/contact_page.dart';
1314
import 'package:flutter_mqtt/ui/viewers/document_viewer.dart';
1415
import 'package:flutter_mqtt/ui/viewers/media_viewer.dart';
16+
import 'package:flutter_mqtt/ui/widgets/message_typing.dart';
1517
import 'package:image_picker/image_picker.dart';
1618
import 'package:mime/mime.dart';
1719
import 'package:open_file/open_file.dart';
@@ -31,6 +33,7 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
3133
bool isTyping = false;
3234
final subscriptions = List<StreamSubscription<dynamic>>.empty(growable: true);
3335
types.User? _user;
36+
types.Message? respondToMessage;
3437

3538
@override
3639
void initState() {
@@ -155,7 +158,6 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
155158
}
156159
//TODO: Handle DOC/DOCX/ODT/...
157160
//TODO: Handle TXT
158-
//TODO: HANDLE IMAGES
159161
}
160162

161163
/*
@@ -182,9 +184,26 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
182184
fromId: _user!.id,
183185
sendTime: DateTime.now().millisecondsSinceEpoch,
184186
fromName: _user!.firstName);
185-
ChatApp.instance()!
186-
.messageSender
187-
.sendChatMessage(nm, widget.contactChat.roomId);
187+
if (respondToMessage == null) {
188+
ChatApp.instance()!
189+
.messageSender
190+
.sendChatMessage(nm, widget.contactChat.roomId);
191+
} else {
192+
final rep = ChatMessage(
193+
id: respondToMessage!.id,
194+
text: (respondToMessage! is types.TextMessage)
195+
? (respondToMessage! as types.TextMessage).text
196+
: "File",
197+
type: MessageType.ChatText,
198+
sendTime: respondToMessage!.createdAt ?? 0,
199+
roomId: widget.contactChat.roomId);
200+
ChatApp.instance()!
201+
.messageSender
202+
.replyToMessage(rep, nm, widget.contactChat.roomId);
203+
setState(() {
204+
respondToMessage = null;
205+
});
206+
}
188207
}
189208

190209
@override
@@ -193,11 +212,12 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
193212
appBar: AppBar(
194213
centerTitle: false,
195214
title: InkWell(
196-
onTap: (){
215+
onTap: () {
197216
Navigator.push(
198217
context,
199218
MaterialPageRoute(
200-
builder: (context) => ContactDetailsPage(contactChat: widget.contactChat)),
219+
builder: (context) =>
220+
ContactDetailsPage(contactChat: widget.contactChat)),
201221
);
202222
},
203223
child: Row(
@@ -249,9 +269,10 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
249269
//onPreviewDataFetched: _handlePreviewDataFetched,
250270
onSendPressed: _handleSendPressed,
251271
onTextChanged: _handleTextChanged,
272+
onMessageLongPress: _handleLongPress,
252273
showUserNames: true,
253274
showUserAvatars: true,
254-
275+
customBottomWidget: bottom(),
255276
user: _user!,
256277
);
257278
}
@@ -260,6 +281,20 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
260281
);
261282
}
262283

284+
Widget bottom() {
285+
return MessageTyping(
286+
topWidget: respondToMessage != null
287+
? respondToMessage!.toRespondedWidget(() => {
288+
setState(() {
289+
respondToMessage = null;
290+
})
291+
})
292+
: null,
293+
onSendPressed: _handleSendPressed,
294+
onTextChanged: _handleTextChanged,
295+
onAttachmentPressed: _handleAtachmentPressed);
296+
}
297+
263298
void _handleTextChanged(String text) {
264299
if (text.length > 0 && text.length % 3 == 0) {
265300
ChatApp.instance()!
@@ -275,4 +310,37 @@ class _ChatUIPageState extends State<ChatUIDBPage> {
275310
});
276311
super.dispose();
277312
}
313+
314+
void _handleLongPress(types.Message message) {
315+
showCupertinoModalPopup<void>(
316+
context: context,
317+
builder: (BuildContext context) => CupertinoActionSheet(
318+
title: const Text('Title'),
319+
message: const Text('Message'),
320+
actions: <CupertinoActionSheetAction>[
321+
CupertinoActionSheetAction(
322+
child: const Text('Reply'),
323+
onPressed: () {
324+
setState(() {
325+
respondToMessage = message;
326+
});
327+
Navigator.pop(context);
328+
},
329+
),
330+
CupertinoActionSheetAction(
331+
child: const Text('Forward'),
332+
onPressed: () {
333+
Navigator.pop(context);
334+
},
335+
),
336+
CupertinoActionSheetAction(
337+
child: const Text('Delete'),
338+
onPressed: () {
339+
Navigator.pop(context);
340+
},
341+
)
342+
],
343+
),
344+
);
345+
}
278346
}

lib/ui/widgets/message_typing.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:flutter/cupertino.dart';
2+
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
3+
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
4+
5+
class MessageTyping extends StatelessWidget {
6+
final Function()? onAttachmentPressed;
7+
final Function(types.PartialText) onSendPressed;
8+
final Function(String)? onTextChanged;
9+
final Widget? topWidget;
10+
const MessageTyping({Key? key, this.onAttachmentPressed, required this.onSendPressed, this.onTextChanged, this.topWidget}) : super(key: key);
11+
12+
@override
13+
Widget build(BuildContext context) {
14+
return Column(children: [
15+
topWidget ?? SizedBox(),
16+
Input(
17+
isAttachmentUploading: false,
18+
onAttachmentPressed: onAttachmentPressed,
19+
onSendPressed: onSendPressed,
20+
onTextChanged: onTextChanged,
21+
//onTextFieldTap: widget.onTextFieldTap,
22+
sendButtonVisibilityMode: SendButtonVisibilityMode.editing,
23+
)
24+
]);
25+
}
26+
}

0 commit comments

Comments
 (0)