findOrCreateSoloConversation static method
Implementation
static Future<ChatModel> findOrCreateSoloConversation(
String username, {
bool isAnonymouslyOfFirebaseId = false,
bool isAnonymouslyOfMime = false,
}) async {
UserStatusHelper.setMyLastSeenAt();
try {
chatV2Print(
'findOrCreateSoloConversation called with username: $username');
// Tìm cuộc trò chuyện 1-1 hiện có
final existingChat = await supabase
.from('chats')
.select('''
*,
chat_members!inner (
user_id,
is_admin,
joined_at,
latest_seen_at
),
messages!chats_latest_message_id_fkey(*)
''')
.eq('is_group', false)
.inFilter('chat_members.user_id', [loggedUsername, username]);
chatV2Print('Existing chats found: ${existingChat.length}');
// Kiểm tra xem có chat với user được chỉ định không
final existingChatWithUser = existingChat.firstWhere(
(chat) =>
(chat['chat_members'] as List)
.any((member) => member['user_id'] == username) &&
(chat['chat_members'] as List)
.any((member) => member['user_id'] == loggedUsername),
orElse: () => {},
);
chatV2Print(
'Existing chat with user: ${existingChatWithUser.isNotEmpty ? 'found' : 'not found'}');
if (existingChatWithUser.isNotEmpty) {
chatV2Print('Returning existing chat data: ${existingChatWithUser}');
return ChatModel.fromJson(existingChatWithUser);
} else {
chatV2Print('Creating new chat');
// Tạo cuộc trò chuyện mới
final int id = DateTime.now().millisecondsSinceEpoch;
final String encryptKey = EncryptionHelper.generateEncryptKey();
chatV2Print('Generated new chat ID: $id');
// 1. Tạo chat mới
await getFromTable('chats').insert({
'id': id,
'is_group': false,
'created_at': id,
'encryption_key': encryptKey,
});
chatV2Print('Created new chat in database');
// 2. Thêm thành viên
await getFromTable('chat_members').insert([
{
'chat_id': id,
'user_id': username,
'joined_at': id,
'latest_seen_at': id,
},
{
'chat_id': id,
'user_id': loggedUsername,
'joined_at': id,
'latest_seen_at': id,
}
]);
chatV2Print('Added members to new chat');
return (await findConversationById(id))!;
}
} catch (e) {
chatV2Print('Error in findOrCreateSoloConversation: $e');
throw e;
}
}