Messaging
Implemented Chat Screens, Profile Pages, Search Pages WIP: User profile, new chat button Intended: Groups, Calls, Voice Messages Properly deleting chats, offline storage of messages
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite/models.dart' as model;
|
||||
@@ -30,6 +31,7 @@ class MessagingProviders extends ChangeNotifier {
|
||||
late model.User? user;
|
||||
|
||||
static MessagingProviders instance = MessagingProviders();
|
||||
|
||||
|
||||
MessagingProviders() {
|
||||
_init();
|
||||
@@ -99,12 +101,13 @@ class MessagingProviders extends ChangeNotifier {
|
||||
|
||||
void logout() async {
|
||||
try {
|
||||
await updateLastSeen();
|
||||
await account.deleteSession(sessionId: 'current');
|
||||
user = null;
|
||||
status = AuthStatus.notAuthenticated;
|
||||
// await onSuccess();
|
||||
await NavigationService.instance.navigateToReplacement("login");
|
||||
SnackBarService.instance.showSnackBarError("Logged out Successfully");
|
||||
SnackBarService.instance.showSnackBarError("logged out successfully");
|
||||
} on AppwriteException catch (e) {
|
||||
SnackBarService.instance.showSnackBarError(e.message!);
|
||||
} on Exception catch (e) {
|
||||
@@ -122,8 +125,8 @@ class MessagingProviders extends ChangeNotifier {
|
||||
|
||||
status = AuthStatus.authenticated;
|
||||
await onSuccess(user!.$id);
|
||||
SnackBarService.instance.showSnackBarSuccess("Welcome! ${user!.name}");
|
||||
await updateLastSeen();
|
||||
SnackBarService.instance.showSnackBarSuccess("welcome! ${user!.name}");
|
||||
// await updateLastSeen();
|
||||
NavigationService.instance.goBack();
|
||||
NavigationService.instance.navigateToReplacement("home");
|
||||
} on AppwriteException catch (e) {
|
||||
@@ -181,7 +184,8 @@ class MessagingProviders extends ChangeNotifier {
|
||||
);
|
||||
}
|
||||
|
||||
Stream<Users> getUser(String userId) {
|
||||
Stream<User> getUser(String userId) {
|
||||
//
|
||||
var _userData = database.getDocument(
|
||||
databaseId: Constants.instance.databaseId,
|
||||
collectionId: Constants.instance.userCollectionId,
|
||||
@@ -189,12 +193,14 @@ class MessagingProviders extends ChangeNotifier {
|
||||
);
|
||||
|
||||
return _userData.asStream().map((_document) {
|
||||
return Users.fromData(_document);
|
||||
return User.fromData(_document);
|
||||
});
|
||||
}
|
||||
|
||||
Stream<List<Users>> getAllUsers(String _searchText) {
|
||||
List<Users> _returnValue = [];
|
||||
Stream<List<User>> getAllUsers(String _searchText) async* {
|
||||
//
|
||||
// while (true) {
|
||||
List<User> _returnValue = [];
|
||||
if (_searchText.isNotEmpty) {
|
||||
var _usersData = database.listDocuments(
|
||||
databaseId: Constants.instance.databaseId,
|
||||
@@ -204,23 +210,27 @@ class MessagingProviders extends ChangeNotifier {
|
||||
],
|
||||
);
|
||||
|
||||
return _usersData.asStream().map(
|
||||
yield* _usersData.asStream().map(
|
||||
(_documentList) {
|
||||
for (var _document in _documentList.documents) {
|
||||
_returnValue.add(Users.fromData(_document));
|
||||
_returnValue.add(User.fromData(_document));
|
||||
}
|
||||
_returnValue.sort((a,b) => b.lastSeen.compareTo(a.lastSeen));
|
||||
return _returnValue;
|
||||
},
|
||||
);
|
||||
} else {
|
||||
return Stream.empty();
|
||||
yield* Stream.empty();
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
Stream<List<Conversations>> getUserConversation(String userId) {
|
||||
//
|
||||
Stream<List<Conversations>> getUserConversation(String userId) async* {
|
||||
//
|
||||
// while (true) {
|
||||
List<dynamic> _chatId = [];
|
||||
List<dynamic> _details = [];
|
||||
List<dynamic> _lastModified = [];
|
||||
List<Conversations> _returnValue = [];
|
||||
|
||||
var _conversationData = database.getDocument(
|
||||
@@ -229,32 +239,117 @@ class MessagingProviders extends ChangeNotifier {
|
||||
documentId: userId.trim(),
|
||||
);
|
||||
|
||||
return _conversationData.asStream().map(
|
||||
yield* _conversationData.asStream().map(
|
||||
(_snapshot) {
|
||||
_chatId = _snapshot.data['chatId'];
|
||||
_details = _snapshot.data['details'];
|
||||
_lastModified = _snapshot.data['lastModified'];
|
||||
|
||||
for (int i = 0; i < _chatId.length; i++) {
|
||||
_returnValue.add(Conversations.fromData(_chatId[i], _details[i]));
|
||||
_returnValue.add(Conversations.fromData(
|
||||
_chatId[i], _details[i], _lastModified[i]));
|
||||
}
|
||||
_returnValue.sort((a, b) => b.lastModified!.compareTo(a.lastModified!));
|
||||
return _returnValue;
|
||||
},
|
||||
);
|
||||
// }
|
||||
}
|
||||
|
||||
Stream<Chats> getChat(String _chatId) {
|
||||
|
||||
// Stream<List<Conversations>> getUserConversations(String userId) async* {
|
||||
// //
|
||||
// // while (true) {
|
||||
// List<dynamic> _chatId = [];
|
||||
// List<dynamic> _details = [];
|
||||
// List<dynamic> _lastModified = [];
|
||||
// List<Conversations> _returnValue = [];
|
||||
|
||||
// var _conversationData = await database.getDocument(
|
||||
// databaseId: Constants.instance.databaseId,
|
||||
// collectionId: Constants.instance.convCollectionId,
|
||||
// documentId: userId.trim(),
|
||||
// );
|
||||
|
||||
// yield _conversationData.toMap map(
|
||||
// (_snapshot) {
|
||||
// _chatId = _snapshot.data['chatId'];
|
||||
// _details = _snapshot.data['details'];
|
||||
// _lastModified = _snapshot.data['lastModified'];
|
||||
|
||||
// for (int i = 0; i < _chatId.length; i++) {
|
||||
// _returnValue.add(Conversations.fromData(
|
||||
// _chatId[i], _details[i], _lastModified[i]));
|
||||
// }
|
||||
// _returnValue.sort((a, b) => b.lastModified!.compareTo(a.lastModified!));
|
||||
// return _returnValue;
|
||||
// },
|
||||
// );
|
||||
// // }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
Stream<Chats> getMessage(String _chatId) async* {
|
||||
//
|
||||
// while (true) {
|
||||
var _chat = database.getDocument(
|
||||
databaseId: Constants.instance.databaseId,
|
||||
collectionId: Constants.instance.chatsCollectionId,
|
||||
documentId: _chatId,
|
||||
);
|
||||
|
||||
return _chat.asStream().map((_document) {
|
||||
return Chats.fromData(_document);
|
||||
});
|
||||
yield* _chat.asStream().map(
|
||||
(_document) {
|
||||
return Chats.fromDocument(_document);
|
||||
},
|
||||
);
|
||||
// }
|
||||
}
|
||||
|
||||
uploadUserImage(XFile? file, String _uid) async {
|
||||
Future<String> getConversationLink(var _linkId) async {
|
||||
//
|
||||
try {
|
||||
var _conversationLinkDetail = await database.getDocument(
|
||||
databaseId: Constants.instance.databaseId,
|
||||
collectionId: Constants.instance.conversationLinkId,
|
||||
documentId: _linkId,
|
||||
);
|
||||
notifyListeners();
|
||||
return _conversationLinkDetail.data['chatId'];
|
||||
} on AppwriteException catch (e) {
|
||||
notifyListeners();
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> newMesaage(Map<String, dynamic> _chat) async {
|
||||
//
|
||||
var chatId = ID.unique();
|
||||
await database.createDocument(
|
||||
databaseId: Constants.instance.databaseId,
|
||||
collectionId: Constants.instance.chatsCollectionId,
|
||||
documentId: chatId,
|
||||
data: _chat,
|
||||
);
|
||||
notifyListeners();
|
||||
return chatId;
|
||||
}
|
||||
|
||||
Future<void> sendMessage(
|
||||
String chatId, Map<String, dynamic> _messages) async {
|
||||
//
|
||||
await database.updateDocument(
|
||||
databaseId: Constants.instance.databaseId,
|
||||
collectionId: Constants.instance.chatsCollectionId,
|
||||
documentId: chatId,
|
||||
data: _messages,
|
||||
);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<String> uploadUserImage(XFile? file, String _uid) async {
|
||||
//
|
||||
notifyListeners();
|
||||
try {
|
||||
File _file = File(file!.path);
|
||||
@@ -279,5 +374,6 @@ class MessagingProviders extends ChangeNotifier {
|
||||
//
|
||||
}
|
||||
notifyListeners();
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user