Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#170 feat] : users can delete messages sent by them #177

Merged
merged 1 commit into from
Jun 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions lib/data/chat_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,53 @@ class ChatData {
responseStatus: false, response: 'Failed to send message.');
}
}

static Future<CustomResponse> unsendMessage(
Message message, String firstUser, String secondUser) async {
try {
// Remove the message from 'messages' subcollection of the appropriate chat document
await Database.chatDatabase
.doc(message.chatId)
.collection('messages')
.doc(message.id)
.delete();

var lastChatDetail =
await Database.chatDatabase.doc(message.chatId).get();
Chat chat = Chat.fromMap(lastChatDetail.data()!);

// Update the lastMessage and timeOfLastMessage fields in the chat document only if deleted message was the last message
if (chat.timeOfLastMessage == message.createdAt) {
Database.chatDatabase.doc(message.chatId).update({
'lastMessage': 'Last message was deleted',
});
}

// Update the latest message for both the users only if deleted message was the last message
if (chat.timeOfLastMessage == message.createdAt) {
Database.userDatabase
.doc(firstUser)
.collection('chats')
.doc(message.chatId)
.update({
'lastMessage': message.message,
});

Database.userDatabase
.doc(secondUser)
.collection('chats')
.doc(message.chatId)
.update({
'lastMessage': message.message,
});
}

return CustomResponse(
responseStatus: true, response: 'Message deleted successfully.');
} catch (e) {
print('Error deleting message: $e');
return CustomResponse(
responseStatus: false, response: 'Failed to deleted message.');
}
}
}
39 changes: 26 additions & 13 deletions lib/view/screens/ChatScreen/inbox_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,14 @@ import 'package:wave/models/message_model.dart';
import 'package:wave/models/response_model.dart';
import 'package:wave/models/user_model.dart';
import 'package:wave/services/custom_notification_service.dart';
import 'package:wave/services/notification_service.dart';
import 'package:wave/utils/constants/custom_colors.dart';
import 'package:wave/utils/constants/custom_fonts.dart';
import 'package:wave/utils/constants/custom_icons.dart';
import 'package:wave/utils/constants/database_endpoints.dart';
import 'package:wave/utils/device_size.dart';
import 'package:wave/utils/enums.dart';
import 'package:wave/view/reusable_components/custom_textbox_for_comment.dart';
import 'package:wave/view/reusable_components/message_container.dart';
import 'package:wave/view/screens/NotificationScreen/notification_screen.dart';
import 'package:wave/view/screens/ChatScreen/more_options_message.dart';

class InboxScreen extends StatefulWidget {
const InboxScreen({
Expand All @@ -38,7 +36,6 @@ class _InboxScreenState extends State<InboxScreen> {
TextEditingController? messageController;
@override
void initState() {
// TODO: implement initState
super.initState();
messageController = TextEditingController();
otherUser = Get.arguments['otherUser'];
Expand Down Expand Up @@ -122,7 +119,8 @@ class _InboxScreenState extends State<InboxScreen> {
CustomNotificationService.sendNotificationForMessage(
otherUser: otherUser!,
me: selfUser!,
message: message.message, chatId: chatId!);
message: message.message,
chatId: chatId!);
} else {
log(customResponse.response.toString());
}
Expand All @@ -143,7 +141,8 @@ class _InboxScreenState extends State<InboxScreen> {
messageSnap.connectionState == ConnectionState.done) &&
messageSnap.hasData) {
return ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 12),
padding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
reverse: true,
itemCount: messageSnap.data!.docs.length,
itemBuilder: (BuildContext context, int index) {
Expand All @@ -152,17 +151,31 @@ class _InboxScreenState extends State<InboxScreen> {
as Map<String, dynamic>);
return Padding(
padding: const EdgeInsets.only(bottom: 4.0),
child: MessageContainer(
currentUser: selfUser!,
sender: message.sender == selfUser!.id
? selfUser!
: otherUser!,
message: message),
child: InkWell(
onLongPress: () async {
showModalBottomSheet(
context: context,
builder: (context) {
return MoreOptionsForMessage(
message: message,
firstUser: selfUser!.id,
secondUser: otherUser!.id,
);
},
);
},
child: MessageContainer(
currentUser: selfUser!,
sender: message.sender == selfUser!.id
? selfUser!
: otherUser!,
message: message),
),
);
},
);
} else {
return Center(
return const Center(
child: CircularProgressIndicator(),
);
}
Expand Down
102 changes: 102 additions & 0 deletions lib/view/screens/ChatScreen/more_options_message.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:wave/data/chat_data.dart';
import 'package:wave/models/message_model.dart';
import 'package:wave/utils/constants/custom_fonts.dart';

class MoreOptionsForMessage extends StatelessWidget {
final Message message;
final String firstUser;
final String secondUser;
const MoreOptionsForMessage(
{super.key,
required this.message,
required this.firstUser,
required this.secondUser});

@override
Widget build(BuildContext context) {
return Container(
child: Wrap(
children: [
Visibility(
visible: message.sender == FirebaseAuth.instance.currentUser!.uid,
child: ListTile(
leading: const Icon(AntDesign.edit_outline),
title: Text('Edit',
style: TextStyle(fontFamily: CustomFont.poppins, fontSize: 14)),
onTap: () {
// TODO : Edit Message
},
),
),
Visibility(
visible: message.sender == FirebaseAuth.instance.currentUser!.uid,
child: ListTile(
leading: const Icon(AntDesign.delete_fill),
title: Text('Delete',
style: TextStyle(fontFamily: CustomFont.poppins, fontSize: 14)),
onTap: () async {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6)),
title: Text(
"Unsend Message?",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
fontFamily: CustomFont.inter,
),
),
content: Text(
"Are you sure you want to delete this message ? The message will be deleted from both the devices and cannot be retreived.",
style: TextStyle(
fontSize: 13,
color: Colors.grey,
fontFamily: CustomFont.poppins),
),
actions: [
TextButton(
onPressed: () async {
Navigator.pop(context);
},
child: Text(
"Cancel",
style: TextStyle(
fontFamily: CustomFont.poppins,
color: Colors.black87),
)),
TextButton(
onPressed: () async {
ChatData.unsendMessage(
message, firstUser, secondUser);
},
child: Text(
"Delete",
style: TextStyle(
fontFamily: CustomFont.poppins,
color: Colors.red),
))
],
);
},
);
},
),
),
ListTile(
leading: const Icon(AntDesign.block_outline),
title: Text('Report',
style: TextStyle(fontFamily: CustomFont.poppins, fontSize: 14)),
onTap: () {
// TODO : Report Message
},
),
],
));
}
}