mirror of
https://github.com/Iconica-Development/flutter_chat.git
synced 2025-05-19 10:53:51 +02:00
feature: added custom dialog and the option to make a chat not deletable
This commit is contained in:
parent
d0933ac252
commit
d90185a480
13 changed files with 120 additions and 61 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
## 0.5.0 - November 29 2023
|
||||||
|
|
||||||
|
- Added the option to add your own dialog on chat delete and addded the option to make the chat not deletable
|
||||||
|
|
||||||
## 0.4.2 - November 24 2023
|
## 0.4.2 - November 24 2023
|
||||||
|
|
||||||
- Fix groupchats seen as personal chat when there are unread messages
|
- Fix groupchats seen as personal chat when there are unread messages
|
||||||
|
|
|
@ -4,31 +4,29 @@
|
||||||
|
|
||||||
name: flutter_community_chat
|
name: flutter_community_chat
|
||||||
description: A new Flutter package project.
|
description: A new Flutter package project.
|
||||||
version: 0.4.2
|
version: 0.5.0
|
||||||
|
|
||||||
publish_to: none
|
publish_to: none
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.1.0 <4.0.0'
|
sdk: ">=3.1.0 <4.0.0"
|
||||||
flutter: ">=1.17.0"
|
flutter: ">=1.17.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_community_chat_view:
|
flutter_community_chat_view:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Iconica-Development/flutter_community_chat
|
url: https://github.com/Iconica-Development/flutter_community_chat
|
||||||
path: packages/flutter_community_chat_view
|
path: packages/flutter_community_chat_view
|
||||||
ref: 0.4.2
|
ref: 0.5.0
|
||||||
flutter_community_chat_interface:
|
flutter_community_chat_interface:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Iconica-Development/flutter_community_chat
|
url: https://github.com/Iconica-Development/flutter_community_chat
|
||||||
path: packages/flutter_community_chat_interface
|
path: packages/flutter_community_chat_interface
|
||||||
ref: 0.4.2
|
ref: 0.5.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ import 'package:flutter_community_chat_firebase/dto/firebase_message_document.da
|
||||||
class FirebaseChatDocument {
|
class FirebaseChatDocument {
|
||||||
const FirebaseChatDocument({
|
const FirebaseChatDocument({
|
||||||
required this.personal,
|
required this.personal,
|
||||||
|
required this.canBeDeleted,
|
||||||
this.users = const [],
|
this.users = const [],
|
||||||
this.id,
|
this.id,
|
||||||
this.lastUsed,
|
this.lastUsed,
|
||||||
|
@ -22,6 +23,7 @@ class FirebaseChatDocument {
|
||||||
final String? title;
|
final String? title;
|
||||||
final String? imageUrl;
|
final String? imageUrl;
|
||||||
final bool personal;
|
final bool personal;
|
||||||
|
final bool canBeDeleted;
|
||||||
final Timestamp? lastUsed;
|
final Timestamp? lastUsed;
|
||||||
final List<String> users;
|
final List<String> users;
|
||||||
final FirebaseMessageDocument? lastMessage;
|
final FirebaseMessageDocument? lastMessage;
|
||||||
|
@ -30,6 +32,7 @@ class FirebaseChatDocument {
|
||||||
: title = json['title'],
|
: title = json['title'],
|
||||||
imageUrl = json['image_url'],
|
imageUrl = json['image_url'],
|
||||||
personal = json['personal'],
|
personal = json['personal'],
|
||||||
|
canBeDeleted = json['can_be_deleted'] ?? true,
|
||||||
lastUsed = json['last_used'],
|
lastUsed = json['last_used'],
|
||||||
users = json['users'] != null ? List<String>.from(json['users']) : [],
|
users = json['users'] != null ? List<String>.from(json['users']) : [],
|
||||||
lastMessage = json['last_message'] == null
|
lastMessage = json['last_message'] == null
|
||||||
|
@ -44,6 +47,7 @@ class FirebaseChatDocument {
|
||||||
'image_url': imageUrl,
|
'image_url': imageUrl,
|
||||||
'personal': personal,
|
'personal': personal,
|
||||||
'last_used': lastUsed,
|
'last_used': lastUsed,
|
||||||
|
'can_be_deleted': canBeDeleted,
|
||||||
'users': users,
|
'users': users,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,6 +111,7 @@ class FirebaseChatService implements ChatService {
|
||||||
user: otherUser,
|
user: otherUser,
|
||||||
lastMessage: messages.isNotEmpty ? messages.last : null,
|
lastMessage: messages.isNotEmpty ? messages.last : null,
|
||||||
messages: messages,
|
messages: messages,
|
||||||
|
canBeDeleted: chatData.canBeDeleted,
|
||||||
lastUsed: chatData.lastUsed == null
|
lastUsed: chatData.lastUsed == null
|
||||||
? null
|
? null
|
||||||
: DateTime.fromMillisecondsSinceEpoch(
|
: DateTime.fromMillisecondsSinceEpoch(
|
||||||
|
@ -134,6 +135,7 @@ class FirebaseChatService implements ChatService {
|
||||||
lastMessage: messages.isNotEmpty ? messages.last : null,
|
lastMessage: messages.isNotEmpty ? messages.last : null,
|
||||||
messages: messages,
|
messages: messages,
|
||||||
users: users,
|
users: users,
|
||||||
|
canBeDeleted: chatData.canBeDeleted,
|
||||||
lastUsed: chatData.lastUsed == null
|
lastUsed: chatData.lastUsed == null
|
||||||
? null
|
? null
|
||||||
: DateTime.fromMillisecondsSinceEpoch(
|
: DateTime.fromMillisecondsSinceEpoch(
|
||||||
|
@ -297,6 +299,7 @@ class FirebaseChatService implements ChatService {
|
||||||
return PersonalChatModel(
|
return PersonalChatModel(
|
||||||
id: chatId,
|
id: chatId,
|
||||||
user: user!,
|
user: user!,
|
||||||
|
canBeDeleted: chatCollection.data()?['can_be_deleted'] ?? true,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
var groupChatCollection = await _db
|
var groupChatCollection = await _db
|
||||||
|
@ -321,6 +324,7 @@ class FirebaseChatService implements ChatService {
|
||||||
title: chat?.title ?? '',
|
title: chat?.title ?? '',
|
||||||
imageUrl: chat?.imageUrl ?? '',
|
imageUrl: chat?.imageUrl ?? '',
|
||||||
users: users,
|
users: users,
|
||||||
|
canBeDeleted: chat?.canBeDeleted ?? true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -391,6 +395,7 @@ class FirebaseChatService implements ChatService {
|
||||||
.add(
|
.add(
|
||||||
FirebaseChatDocument(
|
FirebaseChatDocument(
|
||||||
personal: true,
|
personal: true,
|
||||||
|
canBeDeleted: chat.canBeDeleted,
|
||||||
users: userIds,
|
users: userIds,
|
||||||
lastUsed: Timestamp.now(),
|
lastUsed: Timestamp.now(),
|
||||||
),
|
),
|
||||||
|
@ -426,6 +431,7 @@ class FirebaseChatService implements ChatService {
|
||||||
.add(
|
.add(
|
||||||
FirebaseChatDocument(
|
FirebaseChatDocument(
|
||||||
personal: false,
|
personal: false,
|
||||||
|
canBeDeleted: chat.canBeDeleted,
|
||||||
users: userIds,
|
users: userIds,
|
||||||
lastUsed: Timestamp.now(),
|
lastUsed: Timestamp.now(),
|
||||||
),
|
),
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
name: flutter_community_chat_firebase
|
name: flutter_community_chat_firebase
|
||||||
description: A new Flutter package project.
|
description: A new Flutter package project.
|
||||||
version: 0.4.2
|
version: 0.5.0
|
||||||
publish_to: none
|
publish_to: none
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.1.0 <4.0.0'
|
sdk: ">=3.1.0 <4.0.0"
|
||||||
flutter: ">=1.17.0"
|
flutter: ">=1.17.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -19,14 +19,13 @@ dependencies:
|
||||||
firebase_storage: ^11.0.5
|
firebase_storage: ^11.0.5
|
||||||
firebase_auth: ^4.1.2
|
firebase_auth: ^4.1.2
|
||||||
uuid: ^4.0.0
|
uuid: ^4.0.0
|
||||||
flutter_community_chat_interface:
|
flutter_community_chat_interface:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Iconica-Development/flutter_community_chat
|
url: https://github.com/Iconica-Development/flutter_community_chat
|
||||||
path: packages/flutter_community_chat_interface
|
path: packages/flutter_community_chat_interface
|
||||||
ref: 0.4.2
|
ref: 0.5.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ abstract class ChatModel {
|
||||||
this.unreadMessages,
|
this.unreadMessages,
|
||||||
this.lastUsed,
|
this.lastUsed,
|
||||||
this.lastMessage,
|
this.lastMessage,
|
||||||
|
this.canBeDeleted = true,
|
||||||
});
|
});
|
||||||
|
|
||||||
String? id;
|
String? id;
|
||||||
|
@ -18,4 +19,5 @@ abstract class ChatModel {
|
||||||
int? unreadMessages;
|
int? unreadMessages;
|
||||||
DateTime? lastUsed;
|
DateTime? lastUsed;
|
||||||
ChatMessageModel? lastMessage;
|
ChatMessageModel? lastMessage;
|
||||||
|
bool canBeDeleted;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ class GroupChatModel extends ChatModel {
|
||||||
super.lastUsed,
|
super.lastUsed,
|
||||||
super.lastMessage,
|
super.lastMessage,
|
||||||
super.unreadMessages,
|
super.unreadMessages,
|
||||||
|
super.canBeDeleted,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String title;
|
final String title;
|
||||||
|
@ -29,6 +30,7 @@ class GroupChatModel extends ChatModel {
|
||||||
String? title,
|
String? title,
|
||||||
String? imageUrl,
|
String? imageUrl,
|
||||||
List<ChatUserModel>? users,
|
List<ChatUserModel>? users,
|
||||||
|
bool? canBeDeleted,
|
||||||
}) =>
|
}) =>
|
||||||
GroupChatModel(
|
GroupChatModel(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
|
@ -39,5 +41,6 @@ class GroupChatModel extends ChatModel {
|
||||||
title: title ?? this.title,
|
title: title ?? this.title,
|
||||||
imageUrl: imageUrl ?? this.imageUrl,
|
imageUrl: imageUrl ?? this.imageUrl,
|
||||||
users: users ?? this.users,
|
users: users ?? this.users,
|
||||||
|
canBeDeleted: canBeDeleted ?? this.canBeDeleted,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ class PersonalChatModel extends ChatModel {
|
||||||
super.unreadMessages,
|
super.unreadMessages,
|
||||||
super.lastUsed,
|
super.lastUsed,
|
||||||
super.lastMessage,
|
super.lastMessage,
|
||||||
|
super.canBeDeleted,
|
||||||
});
|
});
|
||||||
|
|
||||||
final ChatUserModel user;
|
final ChatUserModel user;
|
||||||
|
@ -23,6 +24,7 @@ class PersonalChatModel extends ChatModel {
|
||||||
DateTime? lastUsed,
|
DateTime? lastUsed,
|
||||||
ChatMessageModel? lastMessage,
|
ChatMessageModel? lastMessage,
|
||||||
ChatUserModel? user,
|
ChatUserModel? user,
|
||||||
|
bool? canBeDeleted,
|
||||||
}) =>
|
}) =>
|
||||||
PersonalChatModel(
|
PersonalChatModel(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
|
@ -31,5 +33,6 @@ class PersonalChatModel extends ChatModel {
|
||||||
lastUsed: lastUsed ?? this.lastUsed,
|
lastUsed: lastUsed ?? this.lastUsed,
|
||||||
lastMessage: lastMessage ?? this.lastMessage,
|
lastMessage: lastMessage ?? this.lastMessage,
|
||||||
user: user ?? this.user,
|
user: user ?? this.user,
|
||||||
|
canBeDeleted: canBeDeleted ?? this.canBeDeleted,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
name: flutter_community_chat_interface
|
name: flutter_community_chat_interface
|
||||||
description: A new Flutter package project.
|
description: A new Flutter package project.
|
||||||
version: 0.4.2
|
version: 0.5.0
|
||||||
publish_to: none
|
publish_to: none
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -5,20 +5,20 @@
|
||||||
name: flutter_community_chat_view_example
|
name: flutter_community_chat_view_example
|
||||||
description: A standard flutter package.
|
description: A standard flutter package.
|
||||||
|
|
||||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||||
|
|
||||||
version: 1.0.0+1
|
version: 1.0.0+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.1.0 <4.0.0'
|
sdk: ">=3.1.0 <4.0.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_community_chat_view:
|
flutter_community_chat_view:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Iconica-Development/flutter_community_chat
|
url: https://github.com/Iconica-Development/flutter_community_chat
|
||||||
path: packages/flutter_community_chat_view
|
path: packages/flutter_community_chat_view
|
||||||
ref: 0.4.2
|
ref: 0.5.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
@ -21,6 +21,7 @@ class ChatTranslations {
|
||||||
this.deleteChatModalConfirm = 'Delete',
|
this.deleteChatModalConfirm = 'Delete',
|
||||||
this.noUsersFound = 'No users found',
|
this.noUsersFound = 'No users found',
|
||||||
this.anonymousUser = 'Anonymous user',
|
this.anonymousUser = 'Anonymous user',
|
||||||
|
this.chatCantBeDeleted = 'This chat can\'t be deleted',
|
||||||
});
|
});
|
||||||
|
|
||||||
final String chatsTitle;
|
final String chatsTitle;
|
||||||
|
@ -38,6 +39,7 @@ class ChatTranslations {
|
||||||
final String deleteChatModalCancel;
|
final String deleteChatModalCancel;
|
||||||
final String deleteChatModalConfirm;
|
final String deleteChatModalConfirm;
|
||||||
final String noUsersFound;
|
final String noUsersFound;
|
||||||
|
final String chatCantBeDeleted;
|
||||||
|
|
||||||
/// Shown when the user has no name
|
/// Shown when the user has no name
|
||||||
final String anonymousUser;
|
final String anonymousUser;
|
||||||
|
|
|
@ -13,6 +13,7 @@ class ChatScreen extends StatefulWidget {
|
||||||
required this.onPressStartChat,
|
required this.onPressStartChat,
|
||||||
required this.onPressChat,
|
required this.onPressChat,
|
||||||
required this.onDeleteChat,
|
required this.onDeleteChat,
|
||||||
|
this.deleteChatDialog,
|
||||||
this.unreadChats,
|
this.unreadChats,
|
||||||
this.translations = const ChatTranslations(),
|
this.translations = const ChatTranslations(),
|
||||||
super.key,
|
super.key,
|
||||||
|
@ -26,6 +27,8 @@ class ChatScreen extends StatefulWidget {
|
||||||
final void Function(ChatModel chat) onDeleteChat;
|
final void Function(ChatModel chat) onDeleteChat;
|
||||||
final void Function(ChatModel chat) onPressChat;
|
final void Function(ChatModel chat) onPressChat;
|
||||||
|
|
||||||
|
/// Method to optionally change the bottomsheetdialog
|
||||||
|
final Future<bool?> Function(BuildContext, ChatModel)? deleteChatDialog;
|
||||||
@override
|
@override
|
||||||
State<ChatScreen> createState() => _ChatScreenState();
|
State<ChatScreen> createState() => _ChatScreenState();
|
||||||
}
|
}
|
||||||
|
@ -74,33 +77,69 @@ class _ChatScreenState extends State<ChatScreen> {
|
||||||
for (ChatModel chat in snapshot.data ?? []) ...[
|
for (ChatModel chat in snapshot.data ?? []) ...[
|
||||||
Builder(
|
Builder(
|
||||||
builder: (context) => Dismissible(
|
builder: (context) => Dismissible(
|
||||||
confirmDismiss: (_) => showDialog(
|
confirmDismiss: (_) =>
|
||||||
context: context,
|
widget.deleteChatDialog?.call(context, chat) ??
|
||||||
builder: (BuildContext context) => AlertDialog(
|
showModalBottomSheet(
|
||||||
title: Text(
|
context: context,
|
||||||
translations.deleteChatModalTitle,
|
builder: (BuildContext context) => Container(
|
||||||
),
|
padding: const EdgeInsets.all(16.0),
|
||||||
content: Text(
|
child: Column(
|
||||||
translations.deleteChatModalDescription,
|
mainAxisSize: MainAxisSize.min,
|
||||||
),
|
children: [
|
||||||
actions: [
|
Text(
|
||||||
TextButton(
|
chat.canBeDeleted
|
||||||
child: Text(
|
? translations
|
||||||
translations.deleteChatModalCancel,
|
.deleteChatModalTitle
|
||||||
),
|
: translations.chatCantBeDeleted,
|
||||||
onPressed: () =>
|
style: const TextStyle(
|
||||||
Navigator.of(context).pop(false),
|
fontSize: 20,
|
||||||
),
|
fontWeight: FontWeight.bold,
|
||||||
ElevatedButton(
|
),
|
||||||
onPressed: () =>
|
),
|
||||||
Navigator.of(context).pop(true),
|
const SizedBox(height: 16),
|
||||||
child: Text(
|
if (chat.canBeDeleted)
|
||||||
translations.deleteChatModalConfirm,
|
Text(
|
||||||
|
translations
|
||||||
|
.deleteChatModalDescription,
|
||||||
|
style:
|
||||||
|
const TextStyle(fontSize: 16),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
TextButton(
|
||||||
|
child: Text(
|
||||||
|
translations
|
||||||
|
.deleteChatModalCancel,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onPressed: () =>
|
||||||
|
Navigator.of(context)
|
||||||
|
.pop(false),
|
||||||
|
),
|
||||||
|
if (chat.canBeDeleted)
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () =>
|
||||||
|
Navigator.of(context)
|
||||||
|
.pop(true),
|
||||||
|
child: Text(
|
||||||
|
translations
|
||||||
|
.deleteChatModalConfirm,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
|
||||||
),
|
|
||||||
onDismissed: (_) => widget.onDeleteChat(chat),
|
onDismissed: (_) => widget.onDeleteChat(chat),
|
||||||
background: Container(
|
background: Container(
|
||||||
color: Colors.red,
|
color: Colors.red,
|
||||||
|
|
|
@ -4,23 +4,23 @@
|
||||||
|
|
||||||
name: flutter_community_chat_view
|
name: flutter_community_chat_view
|
||||||
description: A standard flutter package.
|
description: A standard flutter package.
|
||||||
version: 0.4.2
|
version: 0.5.0
|
||||||
|
|
||||||
publish_to: none
|
publish_to: none
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.1.0 <4.0.0'
|
sdk: ">=3.1.0 <4.0.0"
|
||||||
flutter: ">=1.17.0"
|
flutter: ">=1.17.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
intl: any
|
intl: any
|
||||||
flutter_community_chat_interface:
|
flutter_community_chat_interface:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Iconica-Development/flutter_community_chat
|
url: https://github.com/Iconica-Development/flutter_community_chat
|
||||||
path: packages/flutter_community_chat_interface
|
path: packages/flutter_community_chat_interface
|
||||||
ref: 0.4.2
|
ref: 0.5.0
|
||||||
cached_network_image: ^3.2.2
|
cached_network_image: ^3.2.2
|
||||||
flutter_image_picker:
|
flutter_image_picker:
|
||||||
git:
|
git:
|
||||||
|
@ -33,4 +33,3 @@ dev_dependencies:
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue