Отображение чатов

This commit is contained in:
Халимов Рустам
2026-05-14 22:56:42 +03:00
parent ccffc5a53c
commit 0b013def2e
29 changed files with 6365 additions and 842 deletions
@@ -0,0 +1,116 @@
import 'package:isar/isar.dart';
import '../../domain/entities/chat.dart';
import '../../domain/entities/user.dart';
import '../../domain/entities/message.dart';
import 'message_model.dart';
part 'chat_model.g.dart';
@collection
class ChatModel {
Id isarId = Isar.autoIncrement;
@Index(unique: true, replace: true)
late String id;
late String type;
late String title;
String? avatarUrl;
late List<UserModel> participants;
LastMessageModel? lastMessage;
DateTime? lastMessageTime;
int unreadCount = 0;
bool isMuted = false;
bool isPinned = false;
Chat toEntity() {
return Chat(
id: id,
type: type,
title: title,
avatarUrl: avatarUrl,
participants: participants.map((u) => u.toEntity()).toList(),
lastMessage: lastMessage?.toEntity(),
lastMessageTime: lastMessageTime,
unreadCount: unreadCount,
isMuted: isMuted,
isPinned: isPinned,
);
}
static ChatModel fromEntity(Chat chat) {
return ChatModel()
..id = chat.id
..type = chat.type
..title = chat.title
..avatarUrl = chat.avatarUrl
..participants = chat.participants?.map((u) => UserModel.fromEntity(u)).toList() ?? []
..lastMessage = chat.lastMessage != null ? LastMessageModel.fromEntity(chat.lastMessage!) : null
..lastMessageTime = chat.lastMessageTime
..unreadCount = chat.unreadCount
..isMuted = chat.isMuted
..isPinned = chat.isPinned;
}
}
@embedded
class LastMessageModel {
late String id;
late String content;
late String messageType;
DateTime? createdAt;
Message toEntity() {
return Message(
id: id,
chatId: '', // Не критично для превью в списке чатов
senderId: '',
content: content,
messageType: messageType,
createdAt: createdAt,
);
}
static LastMessageModel fromEntity(Message message) {
return LastMessageModel()
..id = message.id
..content = message.content
..messageType = message.messageType
..createdAt = message.createdAt;
}
}
@embedded
class UserModel {
late String id;
late String name;
String? avatarUrl;
String? role;
DateTime? lastSeen;
bool? isOnline;
User toEntity() {
return User(
id: id,
name: name,
avatarUrl: avatarUrl,
role: role,
lastSeen: lastSeen,
isOnline: isOnline,
);
}
static UserModel fromEntity(User user) {
return UserModel()
..id = user.id
..name = user.name
..avatarUrl = user.avatarUrl
..role = user.role
..lastSeen = user.lastSeen
..isOnline = user.isOnline;
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,53 @@
import 'package:isar/isar.dart';
import '../../domain/entities/message.dart';
part 'message_model.g.dart';
@collection
class MessageModel {
Id isarId = Isar.autoIncrement;
@Index(unique: true, replace: true)
late String id;
@Index()
late String chatId;
late String senderId;
late String content;
late String messageType;
@Index()
DateTime? createdAt;
DateTime? updatedAt;
bool isRead = false;
// For simplicity, store media as a JSON string or ignore for now
String? mediaJson;
Message toEntity() {
return Message(
id: id,
chatId: chatId,
senderId: senderId,
content: content,
messageType: messageType,
createdAt: createdAt,
updatedAt: updatedAt,
isRead: isRead,
);
}
static MessageModel fromEntity(Message message) {
return MessageModel()
..id = message.id
..chatId = message.chatId
..senderId = message.senderId
..content = message.content
..messageType = message.messageType
..createdAt = message.createdAt
..updatedAt = message.updatedAt
..isRead = message.isRead ?? false;
}
}
File diff suppressed because it is too large Load Diff