mirror of
https://github.com/Iconica-Development/flutter_chat.git
synced 2025-05-19 10:53:51 +02:00
feat: create chat after sending first message
This commit is contained in:
parent
7b03c934cf
commit
3480b97ba0
15 changed files with 241 additions and 214 deletions
|
@ -38,26 +38,32 @@ class CommunityChat extends StatelessWidget {
|
||||||
NewChatScreen(
|
NewChatScreen(
|
||||||
options: options,
|
options: options,
|
||||||
translations: translations,
|
translations: translations,
|
||||||
onPressCreateChat: (user) => dataProvider.createChat(
|
onPressCreateChat: (user) {
|
||||||
|
_onPressChat(
|
||||||
|
context,
|
||||||
PersonalChatModel(user: user),
|
PersonalChatModel(user: user),
|
||||||
),
|
);
|
||||||
|
},
|
||||||
users: users,
|
users: users,
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
Future<void> _onPressChat(BuildContext context, ChatModel chat) => _push(
|
Future<void> _onPressChat(BuildContext context, ChatModel chat) async {
|
||||||
|
dataProvider.setChat(chat);
|
||||||
|
_push(
|
||||||
context,
|
context,
|
||||||
ChatDetailScreen(
|
ChatDetailScreen(
|
||||||
options: options,
|
options: options,
|
||||||
translations: translations,
|
translations: translations,
|
||||||
chat: chat,
|
chat: chat,
|
||||||
chatMessages: dataProvider.getMessagesStream(chat),
|
chatMessages: dataProvider.getMessagesStream(),
|
||||||
onPressSelectImage: (ChatModel chat) =>
|
onPressSelectImage: (ChatModel chat) =>
|
||||||
_onPressSelectImage(context, chat),
|
_onPressSelectImage(context, chat),
|
||||||
onMessageSubmit: (ChatModel chat, String content) =>
|
onMessageSubmit: (ChatModel chat, String content) =>
|
||||||
dataProvider.sendTextMessage(chat, content),
|
dataProvider.sendTextMessage(content),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _onPressSelectImage(BuildContext context, ChatModel chat) =>
|
Future<void> _onPressSelectImage(BuildContext context, ChatModel chat) =>
|
||||||
showModalBottomSheet<Uint8List?>(
|
showModalBottomSheet<Uint8List?>(
|
||||||
|
@ -76,7 +82,7 @@ class CommunityChat extends StatelessWidget {
|
||||||
).then(
|
).then(
|
||||||
(image) {
|
(image) {
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
return dataProvider.sendImageMessage(chat, image);
|
return dataProvider.sendImageMessage(image);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -179,7 +179,7 @@ packages:
|
||||||
description:
|
description:
|
||||||
path: "packages/flutter_community_chat_interface"
|
path: "packages/flutter_community_chat_interface"
|
||||||
ref: HEAD
|
ref: HEAD
|
||||||
resolved-ref: bfca7ca229a0f9e6749d079a5b447e50bef6d56f
|
resolved-ref: "7b03c934cfa28fc5d85f3d59974bb0757a439911"
|
||||||
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
|
@ -188,7 +188,7 @@ packages:
|
||||||
description:
|
description:
|
||||||
path: "packages/flutter_community_chat_view"
|
path: "packages/flutter_community_chat_view"
|
||||||
ref: HEAD
|
ref: HEAD
|
||||||
resolved-ref: "4af8360850b7d8d220f3052e4be25d6eb45ef963"
|
resolved-ref: "7b03c934cfa28fc5d85f3d59974bb0757a439911"
|
||||||
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
|
|
|
@ -38,38 +38,40 @@ class FirebaseCommunityChatDataProvider extends CommunityChatInterface {
|
||||||
options: firebaseChatOptoons,
|
options: firebaseChatOptoons,
|
||||||
);
|
);
|
||||||
|
|
||||||
_messageService = FirebaseMessageService(
|
|
||||||
db: db,
|
|
||||||
storage: storage,
|
|
||||||
userService: _userService,
|
|
||||||
options: firebaseChatOptoons,
|
|
||||||
);
|
|
||||||
|
|
||||||
_chatService = FirebaseChatService(
|
_chatService = FirebaseChatService(
|
||||||
db: db,
|
db: db,
|
||||||
userService: _userService,
|
userService: _userService,
|
||||||
options: firebaseChatOptoons,
|
options: firebaseChatOptoons,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
_messageService = FirebaseMessageService(
|
||||||
|
db: db,
|
||||||
|
storage: storage,
|
||||||
|
userService: _userService,
|
||||||
|
chatService: _chatService,
|
||||||
|
options: firebaseChatOptoons,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<List<ChatMessageModel>> getMessagesStream(ChatModel chat) =>
|
Stream<List<ChatMessageModel>> getMessagesStream() =>
|
||||||
_messageService.getMessagesStream(chat);
|
_messageService.getMessagesStream();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<ChatUserModel>> getChatUsers() => _userService.getNewUsers();
|
Future<List<ChatUserModel>> getChatUsers() => _userService.getAllUsers();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<List<ChatModel>> getChatsStream() => _chatService.getChatsStream();
|
Stream<List<ChatModel>> getChatsStream() => _chatService.getChatsStream();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> createChat(ChatModel chat) => _chatService.createChat(chat);
|
Future<void> sendTextMessage(String text) =>
|
||||||
|
_messageService.sendTextMessage(text);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> sendTextMessage(ChatModel chat, String text) =>
|
Future<void> sendImageMessage(Uint8List image) =>
|
||||||
_messageService.sendTextMessage(chat, text);
|
_messageService.sendImageMessage(image);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> sendImageMessage(ChatModel chat, Uint8List image) =>
|
Future<void> setChat(ChatModel chat) async =>
|
||||||
_messageService.sendImageMessage(chat, image);
|
await _messageService.setChat(chat);
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,43 +197,28 @@ class FirebaseChatService {
|
||||||
return controller.stream;
|
return controller.stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> createChat(ChatModel chat) async {
|
Future<ChatModel?> getChatByUser(ChatUserModel user) async {
|
||||||
if (chat is! PersonalChatModel) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var currentUser = await userService.getCurrentUser();
|
var currentUser = await userService.getCurrentUser();
|
||||||
|
var chatCollection = await db
|
||||||
if (currentUser?.id == null || chat.user.id == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> userIds = [
|
|
||||||
currentUser!.id!,
|
|
||||||
chat.user.id!,
|
|
||||||
];
|
|
||||||
|
|
||||||
var reference = await db
|
|
||||||
.collection(options.chatsCollectionName)
|
|
||||||
.withConverter(
|
|
||||||
fromFirestore: (snapshot, _) =>
|
|
||||||
FirebaseChatDocument.fromJson(snapshot.data()!, snapshot.id),
|
|
||||||
toFirestore: (chat, _) => chat.toJson(),
|
|
||||||
)
|
|
||||||
.add(
|
|
||||||
FirebaseChatDocument(
|
|
||||||
personal: true,
|
|
||||||
users: userIds,
|
|
||||||
lastUsed: Timestamp.now(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
for (var userId in userIds) {
|
|
||||||
await db
|
|
||||||
.collection(options.usersCollectionName)
|
.collection(options.usersCollectionName)
|
||||||
.doc(userId)
|
.doc(currentUser?.id)
|
||||||
.collection('chats')
|
.collection('chats')
|
||||||
.add({'id': reference.id});
|
.get();
|
||||||
|
|
||||||
|
for (var element in chatCollection.docs) {
|
||||||
|
var data = element.data();
|
||||||
|
if (data.containsKey('id') &&
|
||||||
|
data.containsKey('users') &&
|
||||||
|
data['users'] is List) {
|
||||||
|
if (data['users'].contains(user.id)) {
|
||||||
|
return PersonalChatModel(
|
||||||
|
id: data['id'],
|
||||||
|
user: user,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,12 @@
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:firebase_storage/firebase_storage.dart';
|
import 'package:firebase_storage/firebase_storage.dart';
|
||||||
import 'package:flutter_community_chat_firebase/config/firebase_chat_options.dart';
|
import 'package:flutter_community_chat_firebase/config/firebase_chat_options.dart';
|
||||||
|
import 'package:flutter_community_chat_firebase/dto/firebase_chat_document.dart';
|
||||||
import 'package:flutter_community_chat_firebase/dto/firebase_message_document.dart';
|
import 'package:flutter_community_chat_firebase/dto/firebase_message_document.dart';
|
||||||
|
import 'package:flutter_community_chat_firebase/service/firebase_chat_service.dart';
|
||||||
import 'package:flutter_community_chat_firebase/service/firebase_user_service.dart';
|
import 'package:flutter_community_chat_firebase/service/firebase_user_service.dart';
|
||||||
import 'package:flutter_community_chat_interface/flutter_community_chat_interface.dart';
|
import 'package:flutter_community_chat_interface/flutter_community_chat_interface.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
@ -18,37 +19,35 @@ class FirebaseMessageService {
|
||||||
required this.db,
|
required this.db,
|
||||||
required this.storage,
|
required this.storage,
|
||||||
required this.userService,
|
required this.userService,
|
||||||
|
required this.chatService,
|
||||||
required this.options,
|
required this.options,
|
||||||
});
|
});
|
||||||
|
|
||||||
final FirebaseFirestore db;
|
final FirebaseFirestore db;
|
||||||
final FirebaseStorage storage;
|
final FirebaseStorage storage;
|
||||||
final FirebaseUserService userService;
|
final FirebaseUserService userService;
|
||||||
|
final FirebaseChatService chatService;
|
||||||
FirebaseChatOptoons options;
|
FirebaseChatOptoons options;
|
||||||
|
late StreamController<List<ChatMessageModel>> _controller;
|
||||||
|
StreamSubscription<QuerySnapshot>? _subscription;
|
||||||
|
ChatModel? _chat;
|
||||||
|
|
||||||
Future<void> sendTextMessage(ChatModel chat, String text) =>
|
Future<void> setChat(ChatModel chat) async {
|
||||||
_sendMessage(chat, {'text': text});
|
if (chat is PersonalChatModel) {
|
||||||
|
_chat = await chatService.getChatByUser(chat.user) ?? chat;
|
||||||
Future<void> sendImageMessage(ChatModel chat, Uint8List image) async {
|
}
|
||||||
var ref = storage
|
|
||||||
.ref('${options.chatsCollectionName}/${chat.id}/${const Uuid().v4()}');
|
|
||||||
|
|
||||||
return ref.putData(image).then(
|
|
||||||
(_) => ref.getDownloadURL().then(
|
|
||||||
(url) {
|
|
||||||
_sendMessage(chat, {'image_url': url});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _sendMessage(
|
Future<void> _beforeSendMessage() async {
|
||||||
ChatModel chat,
|
if (_chat != null) {
|
||||||
Map<String, dynamic> data,
|
_chat = await createChatIfNotExists(_chat!);
|
||||||
) async {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _sendMessage(Map<String, dynamic> data) async {
|
||||||
var currentUser = await userService.getCurrentUser();
|
var currentUser = await userService.getCurrentUser();
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (_chat?.id == null || currentUser == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,9 +57,17 @@ class FirebaseMessageService {
|
||||||
...data
|
...data
|
||||||
};
|
};
|
||||||
|
|
||||||
var chatReference = db.collection(options.chatsCollectionName).doc(chat.id);
|
var chatReference = db
|
||||||
|
.collection(
|
||||||
|
options.chatsCollectionName,
|
||||||
|
)
|
||||||
|
.doc(_chat!.id);
|
||||||
|
|
||||||
await chatReference.collection(options.messagesCollectionName).add(message);
|
await chatReference
|
||||||
|
.collection(
|
||||||
|
options.messagesCollectionName,
|
||||||
|
)
|
||||||
|
.add(message);
|
||||||
|
|
||||||
await chatReference.update({
|
await chatReference.update({
|
||||||
'last_used': DateTime.now(),
|
'last_used': DateTime.now(),
|
||||||
|
@ -68,6 +75,29 @@ class FirebaseMessageService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> sendTextMessage(String text) => _beforeSendMessage().then(
|
||||||
|
(_) => _sendMessage({'text': text}),
|
||||||
|
);
|
||||||
|
|
||||||
|
Future<void> sendImageMessage(Uint8List image) => _beforeSendMessage().then(
|
||||||
|
(_) {
|
||||||
|
if (_chat?.id == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ref = storage.ref(
|
||||||
|
'${options.chatsCollectionName}/${_chat!.id}/${const Uuid().v4()}');
|
||||||
|
|
||||||
|
return ref.putData(image).then(
|
||||||
|
(_) => ref.getDownloadURL().then(
|
||||||
|
(url) {
|
||||||
|
_sendMessage({'image_url': url});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
Query<FirebaseMessageDocument> _getMessagesQuery(String chatId) => db
|
Query<FirebaseMessageDocument> _getMessagesQuery(String chatId) => db
|
||||||
.collection(options.chatsCollectionName)
|
.collection(options.chatsCollectionName)
|
||||||
.doc(chatId)
|
.doc(chatId)
|
||||||
|
@ -79,14 +109,23 @@ class FirebaseMessageService {
|
||||||
toFirestore: (user, _) => user.toJson(),
|
toFirestore: (user, _) => user.toJson(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Stream<List<ChatMessageModel>> getMessagesStream(ChatModel chat) {
|
Stream<List<ChatMessageModel>> getMessagesStream() {
|
||||||
late StreamController<List<ChatMessageModel>> controller;
|
_controller = StreamController<List<ChatMessageModel>>(
|
||||||
StreamSubscription<QuerySnapshot>? subscription;
|
|
||||||
controller = StreamController<List<ChatMessageModel>>(
|
|
||||||
onListen: () {
|
onListen: () {
|
||||||
|
if (_chat?.id != null) {
|
||||||
|
_subscription = _startListeningForMessages(_chat!);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onCancel: () => _subscription?.cancel(),
|
||||||
|
);
|
||||||
|
|
||||||
|
return _controller.stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamSubscription<QuerySnapshot> _startListeningForMessages(ChatModel chat) {
|
||||||
var snapshots = _getMessagesQuery(chat.id!).snapshots();
|
var snapshots = _getMessagesQuery(chat.id!).snapshots();
|
||||||
|
|
||||||
subscription = snapshots.listen(
|
return snapshots.listen(
|
||||||
(snapshot) async {
|
(snapshot) async {
|
||||||
List<ChatMessageModel> messages = [];
|
List<ChatMessageModel> messages = [];
|
||||||
|
|
||||||
|
@ -116,12 +155,57 @@ class FirebaseMessageService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
controller.add(messages);
|
_controller.add(messages);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
}
|
||||||
onCancel: () => subscription?.cancel(),
|
|
||||||
|
Future<ChatModel?> createChatIfNotExists(ChatModel chat) async {
|
||||||
|
if (chat.id == null) {
|
||||||
|
if (chat is! PersonalChatModel) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentUser = await userService.getCurrentUser();
|
||||||
|
|
||||||
|
if (currentUser?.id == null || chat.user.id == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> userIds = [
|
||||||
|
currentUser!.id!,
|
||||||
|
chat.user.id!,
|
||||||
|
];
|
||||||
|
|
||||||
|
var reference = await db
|
||||||
|
.collection(options.chatsCollectionName)
|
||||||
|
.withConverter(
|
||||||
|
fromFirestore: (snapshot, _) =>
|
||||||
|
FirebaseChatDocument.fromJson(snapshot.data()!, snapshot.id),
|
||||||
|
toFirestore: (chat, _) => chat.toJson(),
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
FirebaseChatDocument(
|
||||||
|
personal: true,
|
||||||
|
users: userIds,
|
||||||
|
lastUsed: Timestamp.now(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
return controller.stream;
|
|
||||||
|
for (var userId in userIds) {
|
||||||
|
await db
|
||||||
|
.collection(options.usersCollectionName)
|
||||||
|
.doc(userId)
|
||||||
|
.collection('chats')
|
||||||
|
.add({'id': reference.id, 'users': userIds});
|
||||||
|
}
|
||||||
|
|
||||||
|
chat.id = reference.id;
|
||||||
|
|
||||||
|
_subscription?.cancel();
|
||||||
|
_subscription = _startListeningForMessages(chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
return chat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'package:flutter_community_chat_firebase/config/firebase_chat_options.dart';
|
import 'package:flutter_community_chat_firebase/config/firebase_chat_options.dart';
|
||||||
import 'package:flutter_community_chat_firebase/dto/firebase_chat_document.dart';
|
|
||||||
import 'package:flutter_community_chat_firebase/dto/firebase_user_document.dart';
|
import 'package:flutter_community_chat_firebase/dto/firebase_user_document.dart';
|
||||||
import 'package:flutter_community_chat_interface/flutter_community_chat_interface.dart';
|
import 'package:flutter_community_chat_interface/flutter_community_chat_interface.dart';
|
||||||
|
|
||||||
|
@ -19,7 +18,6 @@ class FirebaseUserService {
|
||||||
FirebaseFirestore db;
|
FirebaseFirestore db;
|
||||||
FirebaseAuth auth;
|
FirebaseAuth auth;
|
||||||
FirebaseChatOptoons options;
|
FirebaseChatOptoons options;
|
||||||
|
|
||||||
ChatUserModel? _currentUser;
|
ChatUserModel? _currentUser;
|
||||||
final Map<String, ChatUserModel> _users = {};
|
final Map<String, ChatUserModel> _users = {};
|
||||||
|
|
||||||
|
@ -33,16 +31,6 @@ class FirebaseUserService {
|
||||||
toFirestore: (user, _) => user.toJson(),
|
toFirestore: (user, _) => user.toJson(),
|
||||||
);
|
);
|
||||||
|
|
||||||
CollectionReference<FirebaseChatDocument> get _chatsCollection => db
|
|
||||||
.collection(options.chatsCollectionName)
|
|
||||||
.withConverter<FirebaseChatDocument>(
|
|
||||||
fromFirestore: (snapshot, _) => FirebaseChatDocument.fromJson(
|
|
||||||
snapshot.data()!,
|
|
||||||
snapshot.id,
|
|
||||||
),
|
|
||||||
toFirestore: (chat, _) => chat.toJson(),
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<ChatUserModel?> getUser(String id) async {
|
Future<ChatUserModel?> getUser(String id) async {
|
||||||
if (_users.containsKey(id)) {
|
if (_users.containsKey(id)) {
|
||||||
return _users[id]!;
|
return _users[id]!;
|
||||||
|
@ -65,46 +53,17 @@ class FirebaseUserService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<ChatUserModel?> getCurrentUser() async {
|
Future<ChatUserModel?> getCurrentUser() async =>
|
||||||
return _currentUser == null && auth.currentUser?.uid != null
|
_currentUser == null && auth.currentUser?.uid != null
|
||||||
? _currentUser = await getUser(auth.currentUser!.uid)
|
? _currentUser = await getUser(auth.currentUser!.uid)
|
||||||
: _currentUser;
|
: _currentUser;
|
||||||
}
|
|
||||||
|
|
||||||
Future<List<ChatUserModel>> getNewUsers() async {
|
Future<List<ChatUserModel>> getAllUsers() async {
|
||||||
var currentUser = await getCurrentUser();
|
var currentUser = await getCurrentUser();
|
||||||
var existingUserIds = [];
|
|
||||||
|
|
||||||
var existingChatCollection = await db
|
|
||||||
.collection(options.usersCollectionName)
|
|
||||||
.doc(currentUser?.id)
|
|
||||||
.collection('chats')
|
|
||||||
.get();
|
|
||||||
|
|
||||||
var existingChatsIds =
|
|
||||||
existingChatCollection.docs.map((chat) => chat['id']).toList();
|
|
||||||
|
|
||||||
if (existingChatsIds.isNotEmpty) {
|
|
||||||
for (var existingChatsId in existingChatsIds) {
|
|
||||||
var existingChat = await _chatsCollection.doc(existingChatsId).get();
|
|
||||||
var existingChatData = existingChat.data();
|
|
||||||
|
|
||||||
if (existingChatData != null) {
|
|
||||||
existingUserIds.addAll(
|
|
||||||
existingChatData.users,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = await _userCollection.get();
|
var data = await _userCollection.get();
|
||||||
|
|
||||||
return data.docs
|
return data.docs.where((user) => user.id != currentUser?.id).map((user) {
|
||||||
.where(
|
|
||||||
(user) =>
|
|
||||||
user.id != currentUser?.id && !existingUserIds.contains(user.id),
|
|
||||||
)
|
|
||||||
.map((user) {
|
|
||||||
var userData = user.data();
|
var userData = user.data();
|
||||||
return ChatUserModel(
|
return ChatUserModel(
|
||||||
id: user.id,
|
id: user.id,
|
||||||
|
|
|
@ -226,11 +226,9 @@ packages:
|
||||||
flutter_community_chat_interface:
|
flutter_community_chat_interface:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "packages/flutter_community_chat_interface"
|
path: "/Users/steinmilder/documents/packages/chat/flutter_community_chat/packages/flutter_community_chat_interface"
|
||||||
ref: HEAD
|
relative: false
|
||||||
resolved-ref: "43805605932f617103af8895c7bc57703a7fbac7"
|
source: path
|
||||||
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
|
||||||
source: git
|
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
flutter_data_interface:
|
flutter_data_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
|
|
|
@ -12,10 +12,10 @@ abstract class CommunityChatInterface extends DataInterface {
|
||||||
|
|
||||||
static final Object _token = Object();
|
static final Object _token = Object();
|
||||||
|
|
||||||
Future<void> createChat(ChatModel chat);
|
Future<void> setChat(ChatModel chat);
|
||||||
Future<void> sendTextMessage(ChatModel chat, String text);
|
Future<void> sendTextMessage(String text);
|
||||||
Future<void> sendImageMessage(ChatModel chat, Uint8List image);
|
Future<void> sendImageMessage(Uint8List image);
|
||||||
Stream<List<ChatMessageModel>> getMessagesStream(ChatModel chat);
|
Stream<List<ChatMessageModel>> getMessagesStream();
|
||||||
Stream<List<ChatModel>> getChatsStream();
|
Stream<List<ChatModel>> getChatsStream();
|
||||||
Future<List<ChatUserModel>> getChatUsers();
|
Future<List<ChatUserModel>> getChatUsers();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,15 +5,15 @@
|
||||||
import 'package:flutter_community_chat_interface/src/model/chat_message.dart';
|
import 'package:flutter_community_chat_interface/src/model/chat_message.dart';
|
||||||
|
|
||||||
abstract class ChatModel {
|
abstract class ChatModel {
|
||||||
const ChatModel({
|
ChatModel({
|
||||||
this.id,
|
this.id,
|
||||||
this.messages = const [],
|
this.messages = const [],
|
||||||
this.lastUsed,
|
this.lastUsed,
|
||||||
this.lastMessage,
|
this.lastMessage,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String? id;
|
String? id;
|
||||||
final List<ChatMessageModel>? messages;
|
List<ChatMessageModel>? messages;
|
||||||
final DateTime? lastUsed;
|
DateTime? lastUsed;
|
||||||
final ChatMessageModel? lastMessage;
|
ChatMessageModel? lastMessage;
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,11 +184,9 @@ packages:
|
||||||
flutter_community_chat_interface:
|
flutter_community_chat_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
path: "packages/flutter_community_chat_interface"
|
path: "/Users/steinmilder/documents/packages/chat/flutter_community_chat/packages/flutter_community_chat_interface"
|
||||||
ref: HEAD
|
relative: false
|
||||||
resolved-ref: "43805605932f617103af8895c7bc57703a7fbac7"
|
source: path
|
||||||
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
|
||||||
source: git
|
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
flutter_community_chat_view:
|
flutter_community_chat_view:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
|
|
|
@ -86,10 +86,7 @@ class _NewChatScreenState extends State<NewChatScreen> {
|
||||||
title: user.name ?? '',
|
title: user.name ?? '',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () => widget.onPressCreateChat(user),
|
||||||
widget.onPressCreateChat(user);
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -177,11 +177,9 @@ packages:
|
||||||
flutter_community_chat_interface:
|
flutter_community_chat_interface:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "packages/flutter_community_chat_interface"
|
path: "/Users/steinmilder/documents/packages/chat/flutter_community_chat/packages/flutter_community_chat_interface"
|
||||||
ref: HEAD
|
relative: false
|
||||||
resolved-ref: "43805605932f617103af8895c7bc57703a7fbac7"
|
source: path
|
||||||
url: "https://github.com/Iconica-Development/flutter_community_chat.git"
|
|
||||||
source: git
|
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
flutter_data_interface:
|
flutter_data_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
|
|
Loading…
Reference in a new issue