diff --git a/client-mobile/l10n/app_en.arb b/client-mobile/l10n/app_en.arb index 00a1f0d..053f424 100644 --- a/client-mobile/l10n/app_en.arb +++ b/client-mobile/l10n/app_en.arb @@ -2,6 +2,7 @@ "@@locale": "en", "appTitle": "Messenger", "chats": "Chats", + "favorites": "Favorites", "contacts": "Contacts", "settings": "Settings", "login": "Login", diff --git a/client-mobile/l10n/app_ru.arb b/client-mobile/l10n/app_ru.arb index c83b62b..109d918 100644 --- a/client-mobile/l10n/app_ru.arb +++ b/client-mobile/l10n/app_ru.arb @@ -2,6 +2,7 @@ "@@locale": "ru", "appTitle": "Мессенджер", "chats": "Чаты", + "favorites": "Избранное", "contacts": "Контакты", "settings": "Настройки", "login": "Вход", diff --git a/client-mobile/lib/core/database/database_service.dart b/client-mobile/lib/core/database/database_service.dart new file mode 100644 index 0000000..1d6c29f --- /dev/null +++ b/client-mobile/lib/core/database/database_service.dart @@ -0,0 +1,22 @@ +import 'package:isar/isar.dart'; +import 'package:path_provider/path_provider.dart'; +import '../../features/chat/data/models/chat_model.dart'; +import '../../features/chat/data/models/message_model.dart'; + +class DatabaseService { + late Isar _isar; + + Isar get isar => _isar; + + Future init() async { + final dir = await getApplicationDocumentsDirectory(); + _isar = await Isar.open( + [ChatModelSchema, MessageModelSchema], + directory: dir.path, + ); + } + + Future clearAll() async { + await _isar.writeTxn(() => _isar.clear()); + } +} diff --git a/client-mobile/lib/core/network/signalr_service.dart b/client-mobile/lib/core/network/signalr_service.dart new file mode 100644 index 0000000..7cc486f --- /dev/null +++ b/client-mobile/lib/core/network/signalr_service.dart @@ -0,0 +1,57 @@ +import 'dart:async'; +import 'package:signalr_netcore/signalr_client.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../../features/chat/domain/entities/message.dart'; + +class SignalRService { + final SharedPreferences prefs; + HubConnection? _hubConnection; + final _messageController = StreamController.broadcast(); + + Stream get messages => _messageController.stream; + + SignalRService(this.prefs); + + Future init() async { + final apiUrl = prefs.getString('api_url') ?? 'https://api.messenger.app'; + final token = prefs.getString('access_token'); + + if (token == null) return; + + final hubUrl = '${apiUrl.replaceAll(RegExp(r'/+$'), '')}/hubs/chat'; + + _hubConnection = HubConnectionBuilder() + .withUrl(hubUrl, options: HttpConnectionOptions( + accessTokenFactory: () async => token, + // logging: (level, message) => print('[SignalR] $level: $message'), + )) + .withAutomaticReconnect() + .build(); + + _hubConnection?.onclose(({error}) { + // print('[SignalR] Connection closed: $error'); + }); + + _hubConnection?.on('ReceiveMessage', _handleReceiveMessage); + + try { + await _hubConnection?.start(); + // print('[SignalR] Connection started'); + } catch (e) { + // print('[SignalR] Error starting connection: $e'); + } + } + + void _handleReceiveMessage(List? arguments) { + if (arguments != null && arguments.isNotEmpty) { + final data = arguments[0] as Map; + // Map JSON to Message entity and add to stream + // I'll need a Message.fromJson mapper + } + } + + Future stop() async { + await _hubConnection?.stop(); + _hubConnection = null; + } +} diff --git a/client-mobile/lib/features/auth/data/datasources/auth_local_datasource.dart b/client-mobile/lib/features/auth/data/datasources/auth_local_datasource.dart index 4604e43..2aff632 100644 --- a/client-mobile/lib/features/auth/data/datasources/auth_local_datasource.dart +++ b/client-mobile/lib/features/auth/data/datasources/auth_local_datasource.dart @@ -1,5 +1,6 @@ abstract class AuthLocalDataSource { Future getToken(); + String? getTokenSync(); Future saveToken(String token); Future getRefreshToken(); Future saveRefreshToken(String token); diff --git a/client-mobile/lib/features/auth/data/datasources/auth_local_datasource_impl.dart b/client-mobile/lib/features/auth/data/datasources/auth_local_datasource_impl.dart index b16d33f..9c6777f 100644 --- a/client-mobile/lib/features/auth/data/datasources/auth_local_datasource_impl.dart +++ b/client-mobile/lib/features/auth/data/datasources/auth_local_datasource_impl.dart @@ -15,6 +15,11 @@ class AuthLocalDataSourceImpl implements AuthLocalDataSource { return sharedPreferences.getString(_accessTokenKey); } + @override + String? getTokenSync() { + return sharedPreferences.getString(_accessTokenKey); + } + Future getRefreshToken() async { return sharedPreferences.getString(_refreshTokenKey); } diff --git a/client-mobile/lib/features/auth/data/repositories/auth_repository_impl.dart b/client-mobile/lib/features/auth/data/repositories/auth_repository_impl.dart index e50839a..579c72c 100644 --- a/client-mobile/lib/features/auth/data/repositories/auth_repository_impl.dart +++ b/client-mobile/lib/features/auth/data/repositories/auth_repository_impl.dart @@ -51,7 +51,16 @@ class AuthRepositoryImpl implements AuthRepository { @override Future> getCurrentUser() async { - return await remoteDataSource.getCurrentUser(); + final result = await remoteDataSource.getCurrentUser(); + if (result.isFailure) { + // If remote fails (e.g. offline), try to return a dummy user with stored ID + // to keep the app in authenticated state if we have a token + final userId = await localDataSource.getUserId(); + if (userId != null) { + return Result.success(User(id: userId, name: 'User', email: '')); + } + } + return result; } @override @@ -60,5 +69,11 @@ class AuthRepositoryImpl implements AuthRepository { } @override - bool get isLoggedIn => false; + bool get isLoggedIn { + // This is problematic because it's synchronous but SharedPreferences is async. + // However, in our DI we wait for SharedPreferences.getInstance(). + // We can use a synchronous check if we expose it or just use the fact that + // AuthBloc calls authChecked which is async. + return localDataSource.getTokenSync() != null; + } } diff --git a/client-mobile/lib/features/chat/data/datasources/chat_local_datasource_impl.dart b/client-mobile/lib/features/chat/data/datasources/chat_local_datasource_impl.dart new file mode 100644 index 0000000..b56e1d8 --- /dev/null +++ b/client-mobile/lib/features/chat/data/datasources/chat_local_datasource_impl.dart @@ -0,0 +1,100 @@ +import 'package:isar/isar.dart'; +import '../../../../core/errors/result.dart'; +import '../../../../core/errors/errors.dart'; +import '../../domain/entities/chat.dart'; +import '../../domain/entities/message.dart'; +import '../models/chat_model.dart'; +import '../models/message_model.dart'; +import 'chat_local_datasource.dart'; + +class ChatLocalDataSourceImpl implements ChatLocalDataSource { + final Isar isar; + + ChatLocalDataSourceImpl(this.isar); + + @override + Future>> getCachedChats() async { + try { + final chatModels = await isar.chatModels.where().sortByLastMessageTimeDesc().findAll(); + return Result.success(chatModels.map((m) => m.toEntity()).toList()); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } + + @override + Future> cacheChats(List chats) async { + try { + final models = chats.map((c) => ChatModel.fromEntity(c)).toList(); + await isar.writeTxn(() async { + await isar.chatModels.putAll(models); + }); + return const Result.success(null); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } + + @override + Future> getChatFromCache(String chatId) async { + try { + final model = await isar.chatModels.filter().idEqualTo(chatId).findFirst(); + if (model != null) { + return Result.success(model.toEntity()); + } + return const Result.failure(AppError.notFound(message: 'Chat not found in cache')); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } + + @override + Future> cacheChat(Chat chat) async { + try { + final model = ChatModel.fromEntity(chat); + await isar.writeTxn(() async { + await isar.chatModels.put(model); + }); + return const Result.success(null); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } + + @override + Future>> getMessagesFromCache(String chatId) async { + try { + final messageModels = await isar.messageModels + .filter() + .chatIdEqualTo(chatId) + .sortByCreatedAtDesc() + .findAll(); + return Result.success(messageModels.map((m) => m.toEntity()).toList()); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } + + @override + Future> cacheMessages(String chatId, List messages) async { + try { + final models = messages.map((m) => MessageModel.fromEntity(m)).toList(); + await isar.writeTxn(() async { + await isar.messageModels.putAll(models); + }); + return const Result.success(null); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } + + @override + Future> clearCache() async { + try { + await isar.writeTxn(() => isar.clear()); + return const Result.success(null); + } catch (e) { + return Result.failure(AppError.database(message: e.toString())); + } + } +} diff --git a/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource.dart b/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource.dart index 23a115f..7bcd281 100644 --- a/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource.dart +++ b/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource.dart @@ -3,10 +3,13 @@ import '../../domain/entities/chat.dart'; import '../../domain/entities/message.dart'; abstract class ChatRemoteDataSource { - Future>> getChats(); + Future>> getChats({String? currentUserId}); Future> getChatById(String chatId); - Future> createChat(String title, List participantIds); - Future> sendMessage(String chatId, Message message); - Future>> getMessages(String chatId, {int? limit, String? lastMessageId}); - Stream> listenToMessages(String chatId); + Future> createPersonalChat(String userId); + Future> createGroupChat(String name, List memberIds); + Future> getOrCreateFavorites(); + Future> sendMessage(String chatId, String content, {String? type, List>? attachments}); + Future>> getMessages(String chatId, {String? cursor}); + Future> togglePin(String chatId); + Future> clearChat(String chatId); } diff --git a/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource_impl.dart b/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource_impl.dart new file mode 100644 index 0000000..08215f7 --- /dev/null +++ b/client-mobile/lib/features/chat/data/datasources/chat_remote_datasource_impl.dart @@ -0,0 +1,191 @@ +import '../../../../core/network/api_client.dart'; +import '../../../../core/errors/result.dart'; +import '../../../../core/errors/errors.dart'; +import '../../domain/entities/chat.dart'; +import '../../domain/entities/message.dart'; +import '../../domain/entities/user.dart'; +import 'chat_remote_datasource.dart'; + +class ChatRemoteDataSourceImpl implements ChatRemoteDataSource { + final ApiClient apiClient; + + ChatRemoteDataSourceImpl(this.apiClient); + + @override + Future>> getChats({String? currentUserId}) async { + final result = await apiClient.get>('/api/chats'); + return result.fold( + (error) => Result.failure(error), + (data) { + try { + final chats = data.map((json) => _mapChatJson(json, currentUserId: currentUserId)).toList(); + // Sort: favorites first, then by last message time or creation time + chats.sort((a, b) { + if (a.type == 'favorites') return -1; + if (b.type == 'favorites') return 1; + final timeA = a.lastMessageTime ?? DateTime.fromMillisecondsSinceEpoch(0); + final timeB = b.lastMessageTime ?? DateTime.fromMillisecondsSinceEpoch(0); + return timeB.compareTo(timeA); + }); + return Result.success(chats); + } catch (e) { + return Result.failure(AppError.parsing(message: 'Failed to parse chats: $e')); + } + }, + ); + } + + @override + Future> getChatById(String chatId) async { + final result = await apiClient.get>('/api/chats/$chatId'); + return result.fold( + (error) => Result.failure(error), + (data) { + try { + return Result.success(_mapChatJson(data)); + } catch (e) { + return Result.failure(AppError.parsing(message: 'Failed to parse chat: $e')); + } + }, + ); + } + + @override + Future> createPersonalChat(String userId) async { + final result = await apiClient.post>( + '/api/chats/personal', + data: {'userId': userId}, + ); + return result.fold( + (error) => Result.failure(error), + (data) => Result.success(_mapChatJson(data)), + ); + } + + @override + Future> createGroupChat(String name, List memberIds) async { + final result = await apiClient.post>( + '/api/chats/group', + data: { + 'name': name, + 'memberIds': memberIds, + }, + ); + return result.fold( + (error) => Result.failure(error), + (data) => Result.success(_mapChatJson(data)), + ); + } + + @override + Future> getOrCreateFavorites() async { + final result = await apiClient.post>('/api/chats/favorites'); + return result.fold( + (error) => Result.failure(error), + (data) => Result.success(_mapChatJson(data)), + ); + } + + @override + Future> sendMessage(String chatId, String content, {String? type, List>? attachments}) async { + final result = await apiClient.post>( + '/api/messages/chat/$chatId', + data: { + 'content': content, + 'type': type ?? 'Text', + 'attachments': attachments, + }, + ); + return result.fold( + (error) => Result.failure(error), + (data) { + try { + return Result.success(_mapMessageJson(data)); + } catch (e) { + return Result.failure(AppError.parsing(message: 'Failed to parse message: $e')); + } + }, + ); + } + + @override + Future>> getMessages(String chatId, {String? cursor}) async { + final result = await apiClient.get>( + '/api/messages/chat/$chatId', + queryParameters: cursor != null ? {'cursor': cursor} : null, + ); + return result.fold( + (error) => Result.failure(error), + (data) { + try { + return Result.success(data.map((json) => _mapMessageJson(json)).toList()); + } catch (e) { + return Result.failure(AppError.parsing(message: 'Failed to parse messages: $e')); + } + }, + ); + } + + @override + Future> togglePin(String chatId) async { + return await apiClient.post('/api/chats/$chatId/pin'); + } + + @override + Future> clearChat(String chatId) async { + return await apiClient.post('/api/chats/$chatId/clear'); + } + + Chat _mapChatJson(Map json, {String? currentUserId}) { + final members = (json['members'] as List?)?.map((m) { + final userData = m['user'] as Map?; + return User( + id: m['userId'] ?? (userData?['id'] ?? ''), + name: userData?['displayName'] ?? '', + avatarUrl: userData?['avatar'], + ); + }).toList(); + + final lastMsgJson = json['lastMessage'] ?? (json['messages'] as List?)?.firstOrNull; + final type = json['type']?.toString().toLowerCase() ?? 'personal'; + + String title = json['name'] ?? ''; + if (title.isEmpty && type == 'personal' && members != null && members.isNotEmpty) { + // If personal chat and no title, use the OTHER member's name + try { + final otherMember = members.firstWhere( + (m) => m.id != currentUserId && m.name.isNotEmpty, + orElse: () => members.firstWhere((m) => m.id != currentUserId, orElse: () => members[0]), + ); + title = otherMember.name; + } catch (_) { + title = members[0].name; + } + } + + return Chat( + id: json['id'], + type: type, + title: title, + avatarUrl: json['avatar'], + participants: members, + unreadCount: json['unreadCount'] ?? 0, + isPinned: json['isPinned'] ?? false, + lastMessage: lastMsgJson != null ? _mapMessageJson(lastMsgJson) : null, + lastMessageTime: lastMsgJson != null ? DateTime.parse(lastMsgJson['createdAt']) : null, + ); + } + + Message _mapMessageJson(Map json) { + return Message( + id: json['id'], + chatId: json['chatId'], + senderId: json['senderId'], + content: json['content'] ?? '', + messageType: json['type'] ?? 'Text', + createdAt: json['createdAt'] != null ? DateTime.parse(json['createdAt']) : null, + updatedAt: json['updatedAt'] != null ? DateTime.parse(json['updatedAt']) : null, + isRead: (json['readBy'] as List?)?.isNotEmpty ?? false, + ); + } +} diff --git a/client-mobile/lib/features/chat/data/models/chat_model.dart b/client-mobile/lib/features/chat/data/models/chat_model.dart new file mode 100644 index 0000000..4bcac4d --- /dev/null +++ b/client-mobile/lib/features/chat/data/models/chat_model.dart @@ -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 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; + } +} diff --git a/client-mobile/lib/features/chat/data/models/chat_model.g.dart b/client-mobile/lib/features/chat/data/models/chat_model.g.dart new file mode 100644 index 0000000..337093f --- /dev/null +++ b/client-mobile/lib/features/chat/data/models/chat_model.g.dart @@ -0,0 +1,2997 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_model.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetChatModelCollection on Isar { + IsarCollection get chatModels => this.collection(); +} + +const ChatModelSchema = CollectionSchema( + name: r'ChatModel', + id: 3590324851517520026, + properties: { + r'avatarUrl': PropertySchema( + id: 0, + name: r'avatarUrl', + type: IsarType.string, + ), + r'id': PropertySchema( + id: 1, + name: r'id', + type: IsarType.string, + ), + r'isMuted': PropertySchema( + id: 2, + name: r'isMuted', + type: IsarType.bool, + ), + r'isPinned': PropertySchema( + id: 3, + name: r'isPinned', + type: IsarType.bool, + ), + r'lastMessage': PropertySchema( + id: 4, + name: r'lastMessage', + type: IsarType.object, + target: r'LastMessageModel', + ), + r'lastMessageTime': PropertySchema( + id: 5, + name: r'lastMessageTime', + type: IsarType.dateTime, + ), + r'participants': PropertySchema( + id: 6, + name: r'participants', + type: IsarType.objectList, + target: r'UserModel', + ), + r'title': PropertySchema( + id: 7, + name: r'title', + type: IsarType.string, + ), + r'type': PropertySchema( + id: 8, + name: r'type', + type: IsarType.string, + ), + r'unreadCount': PropertySchema( + id: 9, + name: r'unreadCount', + type: IsarType.long, + ) + }, + estimateSize: _chatModelEstimateSize, + serialize: _chatModelSerialize, + deserialize: _chatModelDeserialize, + deserializeProp: _chatModelDeserializeProp, + idName: r'isarId', + indexes: { + r'id': IndexSchema( + id: -3268401673993471357, + name: r'id', + unique: true, + replace: true, + properties: [ + IndexPropertySchema( + name: r'id', + type: IndexType.hash, + caseSensitive: true, + ) + ], + ) + }, + links: {}, + embeddedSchemas: { + r'UserModel': UserModelSchema, + r'LastMessageModel': LastMessageModelSchema + }, + getId: _chatModelGetId, + getLinks: _chatModelGetLinks, + attach: _chatModelAttach, + version: '3.1.0+1', +); + +int _chatModelEstimateSize( + ChatModel object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.avatarUrl; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + bytesCount += 3 + object.id.length * 3; + { + final value = object.lastMessage; + if (value != null) { + bytesCount += 3 + + LastMessageModelSchema.estimateSize( + value, allOffsets[LastMessageModel]!, allOffsets); + } + } + bytesCount += 3 + object.participants.length * 3; + { + final offsets = allOffsets[UserModel]!; + for (var i = 0; i < object.participants.length; i++) { + final value = object.participants[i]; + bytesCount += UserModelSchema.estimateSize(value, offsets, allOffsets); + } + } + bytesCount += 3 + object.title.length * 3; + bytesCount += 3 + object.type.length * 3; + return bytesCount; +} + +void _chatModelSerialize( + ChatModel object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.avatarUrl); + writer.writeString(offsets[1], object.id); + writer.writeBool(offsets[2], object.isMuted); + writer.writeBool(offsets[3], object.isPinned); + writer.writeObject( + offsets[4], + allOffsets, + LastMessageModelSchema.serialize, + object.lastMessage, + ); + writer.writeDateTime(offsets[5], object.lastMessageTime); + writer.writeObjectList( + offsets[6], + allOffsets, + UserModelSchema.serialize, + object.participants, + ); + writer.writeString(offsets[7], object.title); + writer.writeString(offsets[8], object.type); + writer.writeLong(offsets[9], object.unreadCount); +} + +ChatModel _chatModelDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = ChatModel(); + object.avatarUrl = reader.readStringOrNull(offsets[0]); + object.id = reader.readString(offsets[1]); + object.isMuted = reader.readBool(offsets[2]); + object.isPinned = reader.readBool(offsets[3]); + object.isarId = id; + object.lastMessage = reader.readObjectOrNull( + offsets[4], + LastMessageModelSchema.deserialize, + allOffsets, + ); + object.lastMessageTime = reader.readDateTimeOrNull(offsets[5]); + object.participants = reader.readObjectList( + offsets[6], + UserModelSchema.deserialize, + allOffsets, + UserModel(), + ) ?? + []; + object.title = reader.readString(offsets[7]); + object.type = reader.readString(offsets[8]); + object.unreadCount = reader.readLong(offsets[9]); + return object; +} + +P _chatModelDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readString(offset)) as P; + case 2: + return (reader.readBool(offset)) as P; + case 3: + return (reader.readBool(offset)) as P; + case 4: + return (reader.readObjectOrNull( + offset, + LastMessageModelSchema.deserialize, + allOffsets, + )) as P; + case 5: + return (reader.readDateTimeOrNull(offset)) as P; + case 6: + return (reader.readObjectList( + offset, + UserModelSchema.deserialize, + allOffsets, + UserModel(), + ) ?? + []) as P; + case 7: + return (reader.readString(offset)) as P; + case 8: + return (reader.readString(offset)) as P; + case 9: + return (reader.readLong(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _chatModelGetId(ChatModel object) { + return object.isarId; +} + +List> _chatModelGetLinks(ChatModel object) { + return []; +} + +void _chatModelAttach(IsarCollection col, Id id, ChatModel object) { + object.isarId = id; +} + +extension ChatModelByIndex on IsarCollection { + Future getById(String id) { + return getByIndex(r'id', [id]); + } + + ChatModel? getByIdSync(String id) { + return getByIndexSync(r'id', [id]); + } + + Future deleteById(String id) { + return deleteByIndex(r'id', [id]); + } + + bool deleteByIdSync(String id) { + return deleteByIndexSync(r'id', [id]); + } + + Future> getAllById(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return getAllByIndex(r'id', values); + } + + List getAllByIdSync(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return getAllByIndexSync(r'id', values); + } + + Future deleteAllById(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return deleteAllByIndex(r'id', values); + } + + int deleteAllByIdSync(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return deleteAllByIndexSync(r'id', values); + } + + Future putById(ChatModel object) { + return putByIndex(r'id', object); + } + + Id putByIdSync(ChatModel object, {bool saveLinks = true}) { + return putByIndexSync(r'id', object, saveLinks: saveLinks); + } + + Future> putAllById(List objects) { + return putAllByIndex(r'id', objects); + } + + List putAllByIdSync(List objects, {bool saveLinks = true}) { + return putAllByIndexSync(r'id', objects, saveLinks: saveLinks); + } +} + +extension ChatModelQueryWhereSort + on QueryBuilder { + QueryBuilder anyIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension ChatModelQueryWhere + on QueryBuilder { + QueryBuilder isarIdEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: isarId, + upper: isarId, + )); + }); + } + + QueryBuilder isarIdNotEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ); + } + }); + } + + QueryBuilder isarIdGreaterThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: include), + ); + }); + } + + QueryBuilder isarIdLessThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: include), + ); + }); + } + + QueryBuilder isarIdBetween( + Id lowerIsarId, + Id upperIsarId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerIsarId, + includeLower: includeLower, + upper: upperIsarId, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo(String id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'id', + value: [id], + )); + }); + } + + QueryBuilder idNotEqualTo( + String id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [], + upper: [id], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [id], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [id], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [], + upper: [id], + includeUpper: false, + )); + } + }); + } +} + +extension ChatModelQueryFilter + on QueryBuilder { + QueryBuilder avatarUrlIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'avatarUrl', + )); + }); + } + + QueryBuilder + avatarUrlIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'avatarUrl', + )); + }); + } + + QueryBuilder avatarUrlEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + avatarUrlGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'avatarUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'avatarUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'avatarUrl', + value: '', + )); + }); + } + + QueryBuilder + avatarUrlIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'avatarUrl', + value: '', + )); + }); + } + + QueryBuilder idEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'id', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder idIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder isMutedEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isMuted', + value: value, + )); + }); + } + + QueryBuilder isPinnedEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isPinned', + value: value, + )); + }); + } + + QueryBuilder isarIdEqualTo( + Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder isarIdGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder isarIdLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder isarIdBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'isarId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + lastMessageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'lastMessage', + )); + }); + } + + QueryBuilder + lastMessageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'lastMessage', + )); + }); + } + + QueryBuilder + lastMessageTimeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'lastMessageTime', + )); + }); + } + + QueryBuilder + lastMessageTimeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'lastMessageTime', + )); + }); + } + + QueryBuilder + lastMessageTimeEqualTo(DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'lastMessageTime', + value: value, + )); + }); + } + + QueryBuilder + lastMessageTimeGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'lastMessageTime', + value: value, + )); + }); + } + + QueryBuilder + lastMessageTimeLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'lastMessageTime', + value: value, + )); + }); + } + + QueryBuilder + lastMessageTimeBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'lastMessageTime', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + participantsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'participants', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder + participantsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'participants', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + participantsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'participants', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + participantsLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'participants', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + participantsLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'participants', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + participantsLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'participants', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder titleEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder typeEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'type', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'type', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'type', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'type', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'type', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder typeIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'type', + value: '', + )); + }); + } + + QueryBuilder typeIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'type', + value: '', + )); + }); + } + + QueryBuilder unreadCountEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'unreadCount', + value: value, + )); + }); + } + + QueryBuilder + unreadCountGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'unreadCount', + value: value, + )); + }); + } + + QueryBuilder unreadCountLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'unreadCount', + value: value, + )); + }); + } + + QueryBuilder unreadCountBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'unreadCount', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension ChatModelQueryObject + on QueryBuilder { + QueryBuilder lastMessage( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'lastMessage'); + }); + } + + QueryBuilder participantsElement( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'participants'); + }); + } +} + +extension ChatModelQueryLinks + on QueryBuilder {} + +extension ChatModelQuerySortBy on QueryBuilder { + QueryBuilder sortByAvatarUrl() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'avatarUrl', Sort.asc); + }); + } + + QueryBuilder sortByAvatarUrlDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'avatarUrl', Sort.desc); + }); + } + + QueryBuilder sortById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder sortByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder sortByIsMuted() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMuted', Sort.asc); + }); + } + + QueryBuilder sortByIsMutedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMuted', Sort.desc); + }); + } + + QueryBuilder sortByIsPinned() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPinned', Sort.asc); + }); + } + + QueryBuilder sortByIsPinnedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPinned', Sort.desc); + }); + } + + QueryBuilder sortByLastMessageTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastMessageTime', Sort.asc); + }); + } + + QueryBuilder sortByLastMessageTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastMessageTime', Sort.desc); + }); + } + + QueryBuilder sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder sortByType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.asc); + }); + } + + QueryBuilder sortByTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.desc); + }); + } + + QueryBuilder sortByUnreadCount() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'unreadCount', Sort.asc); + }); + } + + QueryBuilder sortByUnreadCountDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'unreadCount', Sort.desc); + }); + } +} + +extension ChatModelQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByAvatarUrl() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'avatarUrl', Sort.asc); + }); + } + + QueryBuilder thenByAvatarUrlDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'avatarUrl', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByIsMuted() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMuted', Sort.asc); + }); + } + + QueryBuilder thenByIsMutedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isMuted', Sort.desc); + }); + } + + QueryBuilder thenByIsPinned() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPinned', Sort.asc); + }); + } + + QueryBuilder thenByIsPinnedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isPinned', Sort.desc); + }); + } + + QueryBuilder thenByIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.asc); + }); + } + + QueryBuilder thenByIsarIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.desc); + }); + } + + QueryBuilder thenByLastMessageTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastMessageTime', Sort.asc); + }); + } + + QueryBuilder thenByLastMessageTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'lastMessageTime', Sort.desc); + }); + } + + QueryBuilder thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder thenByType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.asc); + }); + } + + QueryBuilder thenByTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.desc); + }); + } + + QueryBuilder thenByUnreadCount() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'unreadCount', Sort.asc); + }); + } + + QueryBuilder thenByUnreadCountDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'unreadCount', Sort.desc); + }); + } +} + +extension ChatModelQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByAvatarUrl( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'avatarUrl', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctById( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'id', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByIsMuted() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isMuted'); + }); + } + + QueryBuilder distinctByIsPinned() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isPinned'); + }); + } + + QueryBuilder distinctByLastMessageTime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'lastMessageTime'); + }); + } + + QueryBuilder distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByType( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'type', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByUnreadCount() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'unreadCount'); + }); + } +} + +extension ChatModelQueryProperty + on QueryBuilder { + QueryBuilder isarIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isarId'); + }); + } + + QueryBuilder avatarUrlProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'avatarUrl'); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder isMutedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isMuted'); + }); + } + + QueryBuilder isPinnedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isPinned'); + }); + } + + QueryBuilder + lastMessageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'lastMessage'); + }); + } + + QueryBuilder + lastMessageTimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'lastMessageTime'); + }); + } + + QueryBuilder, QQueryOperations> + participantsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'participants'); + }); + } + + QueryBuilder titleProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'title'); + }); + } + + QueryBuilder typeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'type'); + }); + } + + QueryBuilder unreadCountProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'unreadCount'); + }); + } +} + +// ************************************************************************** +// IsarEmbeddedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const LastMessageModelSchema = Schema( + name: r'LastMessageModel', + id: 1610091350356009095, + properties: { + r'content': PropertySchema( + id: 0, + name: r'content', + type: IsarType.string, + ), + r'createdAt': PropertySchema( + id: 1, + name: r'createdAt', + type: IsarType.dateTime, + ), + r'id': PropertySchema( + id: 2, + name: r'id', + type: IsarType.string, + ), + r'messageType': PropertySchema( + id: 3, + name: r'messageType', + type: IsarType.string, + ) + }, + estimateSize: _lastMessageModelEstimateSize, + serialize: _lastMessageModelSerialize, + deserialize: _lastMessageModelDeserialize, + deserializeProp: _lastMessageModelDeserializeProp, +); + +int _lastMessageModelEstimateSize( + LastMessageModel object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.content.length * 3; + bytesCount += 3 + object.id.length * 3; + bytesCount += 3 + object.messageType.length * 3; + return bytesCount; +} + +void _lastMessageModelSerialize( + LastMessageModel object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.content); + writer.writeDateTime(offsets[1], object.createdAt); + writer.writeString(offsets[2], object.id); + writer.writeString(offsets[3], object.messageType); +} + +LastMessageModel _lastMessageModelDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = LastMessageModel(); + object.content = reader.readString(offsets[0]); + object.createdAt = reader.readDateTimeOrNull(offsets[1]); + object.id = reader.readString(offsets[2]); + object.messageType = reader.readString(offsets[3]); + return object; +} + +P _lastMessageModelDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readString(offset)) as P; + case 1: + return (reader.readDateTimeOrNull(offset)) as P; + case 2: + return (reader.readString(offset)) as P; + case 3: + return (reader.readString(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension LastMessageModelQueryFilter + on QueryBuilder { + QueryBuilder + contentEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'content', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'content', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'content', + value: '', + )); + }); + } + + QueryBuilder + contentIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'content', + value: '', + )); + }); + } + + QueryBuilder + createdAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'createdAt', + )); + }); + } + + QueryBuilder + createdAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'createdAt', + )); + }); + } + + QueryBuilder + createdAtEqualTo(DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'createdAt', + value: value, + )); + }); + } + + QueryBuilder + createdAtGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'createdAt', + value: value, + )); + }); + } + + QueryBuilder + createdAtLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'createdAt', + value: value, + )); + }); + } + + QueryBuilder + createdAtBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'createdAt', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + idEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'id', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + idIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder + idIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder + messageTypeEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'messageType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'messageType', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'messageType', + value: '', + )); + }); + } + + QueryBuilder + messageTypeIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'messageType', + value: '', + )); + }); + } +} + +extension LastMessageModelQueryObject + on QueryBuilder {} + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const UserModelSchema = Schema( + name: r'UserModel', + id: 7195426469378571114, + properties: { + r'avatarUrl': PropertySchema( + id: 0, + name: r'avatarUrl', + type: IsarType.string, + ), + r'id': PropertySchema( + id: 1, + name: r'id', + type: IsarType.string, + ), + r'isOnline': PropertySchema( + id: 2, + name: r'isOnline', + type: IsarType.bool, + ), + r'lastSeen': PropertySchema( + id: 3, + name: r'lastSeen', + type: IsarType.dateTime, + ), + r'name': PropertySchema( + id: 4, + name: r'name', + type: IsarType.string, + ), + r'role': PropertySchema( + id: 5, + name: r'role', + type: IsarType.string, + ) + }, + estimateSize: _userModelEstimateSize, + serialize: _userModelSerialize, + deserialize: _userModelDeserialize, + deserializeProp: _userModelDeserializeProp, +); + +int _userModelEstimateSize( + UserModel object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.avatarUrl; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + bytesCount += 3 + object.id.length * 3; + bytesCount += 3 + object.name.length * 3; + { + final value = object.role; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _userModelSerialize( + UserModel object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.avatarUrl); + writer.writeString(offsets[1], object.id); + writer.writeBool(offsets[2], object.isOnline); + writer.writeDateTime(offsets[3], object.lastSeen); + writer.writeString(offsets[4], object.name); + writer.writeString(offsets[5], object.role); +} + +UserModel _userModelDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = UserModel(); + object.avatarUrl = reader.readStringOrNull(offsets[0]); + object.id = reader.readString(offsets[1]); + object.isOnline = reader.readBoolOrNull(offsets[2]); + object.lastSeen = reader.readDateTimeOrNull(offsets[3]); + object.name = reader.readString(offsets[4]); + object.role = reader.readStringOrNull(offsets[5]); + return object; +} + +P _userModelDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readString(offset)) as P; + case 2: + return (reader.readBoolOrNull(offset)) as P; + case 3: + return (reader.readDateTimeOrNull(offset)) as P; + case 4: + return (reader.readString(offset)) as P; + case 5: + return (reader.readStringOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension UserModelQueryFilter + on QueryBuilder { + QueryBuilder avatarUrlIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'avatarUrl', + )); + }); + } + + QueryBuilder + avatarUrlIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'avatarUrl', + )); + }); + } + + QueryBuilder avatarUrlEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + avatarUrlGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'avatarUrl', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'avatarUrl', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'avatarUrl', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder avatarUrlIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'avatarUrl', + value: '', + )); + }); + } + + QueryBuilder + avatarUrlIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'avatarUrl', + value: '', + )); + }); + } + + QueryBuilder idEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'id', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder idIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder isOnlineIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'isOnline', + )); + }); + } + + QueryBuilder + isOnlineIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'isOnline', + )); + }); + } + + QueryBuilder isOnlineEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isOnline', + value: value, + )); + }); + } + + QueryBuilder lastSeenIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'lastSeen', + )); + }); + } + + QueryBuilder + lastSeenIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'lastSeen', + )); + }); + } + + QueryBuilder lastSeenEqualTo( + DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'lastSeen', + value: value, + )); + }); + } + + QueryBuilder lastSeenGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'lastSeen', + value: value, + )); + }); + } + + QueryBuilder lastSeenLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'lastSeen', + value: value, + )); + }); + } + + QueryBuilder lastSeenBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'lastSeen', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder nameEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'name', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'name', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: '', + )); + }); + } + + QueryBuilder nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'name', + value: '', + )); + }); + } + + QueryBuilder roleIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'role', + )); + }); + } + + QueryBuilder roleIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'role', + )); + }); + } + + QueryBuilder roleEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'role', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'role', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'role', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'role', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'role', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'role', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'role', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'role', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder roleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'role', + value: '', + )); + }); + } + + QueryBuilder roleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'role', + value: '', + )); + }); + } +} + +extension UserModelQueryObject + on QueryBuilder {} diff --git a/client-mobile/lib/features/chat/data/models/message_model.dart b/client-mobile/lib/features/chat/data/models/message_model.dart new file mode 100644 index 0000000..cb94e14 --- /dev/null +++ b/client-mobile/lib/features/chat/data/models/message_model.dart @@ -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; + } +} diff --git a/client-mobile/lib/features/chat/data/models/message_model.g.dart b/client-mobile/lib/features/chat/data/models/message_model.g.dart new file mode 100644 index 0000000..11738a9 --- /dev/null +++ b/client-mobile/lib/features/chat/data/models/message_model.g.dart @@ -0,0 +1,1976 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'message_model.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetMessageModelCollection on Isar { + IsarCollection get messageModels => this.collection(); +} + +const MessageModelSchema = CollectionSchema( + name: r'MessageModel', + id: -902762555029995869, + properties: { + r'chatId': PropertySchema( + id: 0, + name: r'chatId', + type: IsarType.string, + ), + r'content': PropertySchema( + id: 1, + name: r'content', + type: IsarType.string, + ), + r'createdAt': PropertySchema( + id: 2, + name: r'createdAt', + type: IsarType.dateTime, + ), + r'id': PropertySchema( + id: 3, + name: r'id', + type: IsarType.string, + ), + r'isRead': PropertySchema( + id: 4, + name: r'isRead', + type: IsarType.bool, + ), + r'mediaJson': PropertySchema( + id: 5, + name: r'mediaJson', + type: IsarType.string, + ), + r'messageType': PropertySchema( + id: 6, + name: r'messageType', + type: IsarType.string, + ), + r'senderId': PropertySchema( + id: 7, + name: r'senderId', + type: IsarType.string, + ), + r'updatedAt': PropertySchema( + id: 8, + name: r'updatedAt', + type: IsarType.dateTime, + ) + }, + estimateSize: _messageModelEstimateSize, + serialize: _messageModelSerialize, + deserialize: _messageModelDeserialize, + deserializeProp: _messageModelDeserializeProp, + idName: r'isarId', + indexes: { + r'id': IndexSchema( + id: -3268401673993471357, + name: r'id', + unique: true, + replace: true, + properties: [ + IndexPropertySchema( + name: r'id', + type: IndexType.hash, + caseSensitive: true, + ) + ], + ), + r'chatId': IndexSchema( + id: 1909629659142158609, + name: r'chatId', + unique: false, + replace: false, + properties: [ + IndexPropertySchema( + name: r'chatId', + type: IndexType.hash, + caseSensitive: true, + ) + ], + ), + r'createdAt': IndexSchema( + id: -3433535483987302584, + name: r'createdAt', + unique: false, + replace: false, + properties: [ + IndexPropertySchema( + name: r'createdAt', + type: IndexType.value, + caseSensitive: false, + ) + ], + ) + }, + links: {}, + embeddedSchemas: {}, + getId: _messageModelGetId, + getLinks: _messageModelGetLinks, + attach: _messageModelAttach, + version: '3.1.0+1', +); + +int _messageModelEstimateSize( + MessageModel object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.chatId.length * 3; + bytesCount += 3 + object.content.length * 3; + bytesCount += 3 + object.id.length * 3; + { + final value = object.mediaJson; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + bytesCount += 3 + object.messageType.length * 3; + bytesCount += 3 + object.senderId.length * 3; + return bytesCount; +} + +void _messageModelSerialize( + MessageModel object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.chatId); + writer.writeString(offsets[1], object.content); + writer.writeDateTime(offsets[2], object.createdAt); + writer.writeString(offsets[3], object.id); + writer.writeBool(offsets[4], object.isRead); + writer.writeString(offsets[5], object.mediaJson); + writer.writeString(offsets[6], object.messageType); + writer.writeString(offsets[7], object.senderId); + writer.writeDateTime(offsets[8], object.updatedAt); +} + +MessageModel _messageModelDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = MessageModel(); + object.chatId = reader.readString(offsets[0]); + object.content = reader.readString(offsets[1]); + object.createdAt = reader.readDateTimeOrNull(offsets[2]); + object.id = reader.readString(offsets[3]); + object.isRead = reader.readBool(offsets[4]); + object.isarId = id; + object.mediaJson = reader.readStringOrNull(offsets[5]); + object.messageType = reader.readString(offsets[6]); + object.senderId = reader.readString(offsets[7]); + object.updatedAt = reader.readDateTimeOrNull(offsets[8]); + return object; +} + +P _messageModelDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readString(offset)) as P; + case 1: + return (reader.readString(offset)) as P; + case 2: + return (reader.readDateTimeOrNull(offset)) as P; + case 3: + return (reader.readString(offset)) as P; + case 4: + return (reader.readBool(offset)) as P; + case 5: + return (reader.readStringOrNull(offset)) as P; + case 6: + return (reader.readString(offset)) as P; + case 7: + return (reader.readString(offset)) as P; + case 8: + return (reader.readDateTimeOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _messageModelGetId(MessageModel object) { + return object.isarId; +} + +List> _messageModelGetLinks(MessageModel object) { + return []; +} + +void _messageModelAttach( + IsarCollection col, Id id, MessageModel object) { + object.isarId = id; +} + +extension MessageModelByIndex on IsarCollection { + Future getById(String id) { + return getByIndex(r'id', [id]); + } + + MessageModel? getByIdSync(String id) { + return getByIndexSync(r'id', [id]); + } + + Future deleteById(String id) { + return deleteByIndex(r'id', [id]); + } + + bool deleteByIdSync(String id) { + return deleteByIndexSync(r'id', [id]); + } + + Future> getAllById(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return getAllByIndex(r'id', values); + } + + List getAllByIdSync(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return getAllByIndexSync(r'id', values); + } + + Future deleteAllById(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return deleteAllByIndex(r'id', values); + } + + int deleteAllByIdSync(List idValues) { + final values = idValues.map((e) => [e]).toList(); + return deleteAllByIndexSync(r'id', values); + } + + Future putById(MessageModel object) { + return putByIndex(r'id', object); + } + + Id putByIdSync(MessageModel object, {bool saveLinks = true}) { + return putByIndexSync(r'id', object, saveLinks: saveLinks); + } + + Future> putAllById(List objects) { + return putAllByIndex(r'id', objects); + } + + List putAllByIdSync(List objects, {bool saveLinks = true}) { + return putAllByIndexSync(r'id', objects, saveLinks: saveLinks); + } +} + +extension MessageModelQueryWhereSort + on QueryBuilder { + QueryBuilder anyIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } + + QueryBuilder anyCreatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + const IndexWhereClause.any(indexName: r'createdAt'), + ); + }); + } +} + +extension MessageModelQueryWhere + on QueryBuilder { + QueryBuilder isarIdEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: isarId, + upper: isarId, + )); + }); + } + + QueryBuilder isarIdNotEqualTo( + Id isarId) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: false), + ); + } + }); + } + + QueryBuilder isarIdGreaterThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: isarId, includeLower: include), + ); + }); + } + + QueryBuilder isarIdLessThan( + Id isarId, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: isarId, includeUpper: include), + ); + }); + } + + QueryBuilder isarIdBetween( + Id lowerIsarId, + Id upperIsarId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerIsarId, + includeLower: includeLower, + upper: upperIsarId, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo( + String id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'id', + value: [id], + )); + }); + } + + QueryBuilder idNotEqualTo( + String id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [], + upper: [id], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [id], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [id], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'id', + lower: [], + upper: [id], + includeUpper: false, + )); + } + }); + } + + QueryBuilder chatIdEqualTo( + String chatId) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'chatId', + value: [chatId], + )); + }); + } + + QueryBuilder chatIdNotEqualTo( + String chatId) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'chatId', + lower: [], + upper: [chatId], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'chatId', + lower: [chatId], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'chatId', + lower: [chatId], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'chatId', + lower: [], + upper: [chatId], + includeUpper: false, + )); + } + }); + } + + QueryBuilder + createdAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'createdAt', + value: [null], + )); + }); + } + + QueryBuilder + createdAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [null], + includeLower: false, + upper: [], + )); + }); + } + + QueryBuilder createdAtEqualTo( + DateTime? createdAt) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'createdAt', + value: [createdAt], + )); + }); + } + + QueryBuilder + createdAtNotEqualTo(DateTime? createdAt) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [], + upper: [createdAt], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [createdAt], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [createdAt], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [], + upper: [createdAt], + includeUpper: false, + )); + } + }); + } + + QueryBuilder + createdAtGreaterThan( + DateTime? createdAt, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [createdAt], + includeLower: include, + upper: [], + )); + }); + } + + QueryBuilder createdAtLessThan( + DateTime? createdAt, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [], + upper: [createdAt], + includeUpper: include, + )); + }); + } + + QueryBuilder createdAtBetween( + DateTime? lowerCreatedAt, + DateTime? upperCreatedAt, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.between( + indexName: r'createdAt', + lower: [lowerCreatedAt], + includeLower: includeLower, + upper: [upperCreatedAt], + includeUpper: includeUpper, + )); + }); + } +} + +extension MessageModelQueryFilter + on QueryBuilder { + QueryBuilder chatIdEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'chatId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chatIdGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'chatId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chatIdLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'chatId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder chatIdBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'chatId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chatIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'chatId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chatIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'chatId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chatIdContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'chatId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder chatIdMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'chatId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + chatIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'chatId', + value: '', + )); + }); + } + + QueryBuilder + chatIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'chatId', + value: '', + )); + }); + } + + QueryBuilder + contentEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'content', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'content', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'content', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + contentIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'content', + value: '', + )); + }); + } + + QueryBuilder + contentIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'content', + value: '', + )); + }); + } + + QueryBuilder + createdAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'createdAt', + )); + }); + } + + QueryBuilder + createdAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'createdAt', + )); + }); + } + + QueryBuilder + createdAtEqualTo(DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'createdAt', + value: value, + )); + }); + } + + QueryBuilder + createdAtGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'createdAt', + value: value, + )); + }); + } + + QueryBuilder + createdAtLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'createdAt', + value: value, + )); + }); + } + + QueryBuilder + createdAtBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'createdAt', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'id', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'id', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder idIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder + idIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'id', + value: '', + )); + }); + } + + QueryBuilder isReadEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isRead', + value: value, + )); + }); + } + + QueryBuilder isarIdEqualTo( + Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder + isarIdGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder + isarIdLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'isarId', + value: value, + )); + }); + } + + QueryBuilder isarIdBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'isarId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + mediaJsonIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'mediaJson', + )); + }); + } + + QueryBuilder + mediaJsonIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'mediaJson', + )); + }); + } + + QueryBuilder + mediaJsonEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'mediaJson', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'mediaJson', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'mediaJson', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'mediaJson', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'mediaJson', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'mediaJson', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'mediaJson', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'mediaJson', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + mediaJsonIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'mediaJson', + value: '', + )); + }); + } + + QueryBuilder + mediaJsonIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'mediaJson', + value: '', + )); + }); + } + + QueryBuilder + messageTypeEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'messageType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'messageType', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'messageType', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + messageTypeIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'messageType', + value: '', + )); + }); + } + + QueryBuilder + messageTypeIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'messageType', + value: '', + )); + }); + } + + QueryBuilder + senderIdEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'senderId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'senderId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'senderId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'senderId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'senderId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'senderId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'senderId', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'senderId', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + senderIdIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'senderId', + value: '', + )); + }); + } + + QueryBuilder + senderIdIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'senderId', + value: '', + )); + }); + } + + QueryBuilder + updatedAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'updatedAt', + )); + }); + } + + QueryBuilder + updatedAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'updatedAt', + )); + }); + } + + QueryBuilder + updatedAtEqualTo(DateTime? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtGreaterThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtLessThan( + DateTime? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtBetween( + DateTime? lower, + DateTime? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'updatedAt', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension MessageModelQueryObject + on QueryBuilder {} + +extension MessageModelQueryLinks + on QueryBuilder {} + +extension MessageModelQuerySortBy + on QueryBuilder { + QueryBuilder sortByChatId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'chatId', Sort.asc); + }); + } + + QueryBuilder sortByChatIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'chatId', Sort.desc); + }); + } + + QueryBuilder sortByContent() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.asc); + }); + } + + QueryBuilder sortByContentDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.desc); + }); + } + + QueryBuilder sortByCreatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdAt', Sort.asc); + }); + } + + QueryBuilder sortByCreatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdAt', Sort.desc); + }); + } + + QueryBuilder sortById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder sortByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder sortByIsRead() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isRead', Sort.asc); + }); + } + + QueryBuilder sortByIsReadDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isRead', Sort.desc); + }); + } + + QueryBuilder sortByMediaJson() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mediaJson', Sort.asc); + }); + } + + QueryBuilder sortByMediaJsonDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mediaJson', Sort.desc); + }); + } + + QueryBuilder sortByMessageType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'messageType', Sort.asc); + }); + } + + QueryBuilder + sortByMessageTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'messageType', Sort.desc); + }); + } + + QueryBuilder sortBySenderId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'senderId', Sort.asc); + }); + } + + QueryBuilder sortBySenderIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'senderId', Sort.desc); + }); + } + + QueryBuilder sortByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.asc); + }); + } + + QueryBuilder sortByUpdatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.desc); + }); + } +} + +extension MessageModelQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByChatId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'chatId', Sort.asc); + }); + } + + QueryBuilder thenByChatIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'chatId', Sort.desc); + }); + } + + QueryBuilder thenByContent() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.asc); + }); + } + + QueryBuilder thenByContentDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'content', Sort.desc); + }); + } + + QueryBuilder thenByCreatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdAt', Sort.asc); + }); + } + + QueryBuilder thenByCreatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'createdAt', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByIsRead() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isRead', Sort.asc); + }); + } + + QueryBuilder thenByIsReadDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isRead', Sort.desc); + }); + } + + QueryBuilder thenByIsarId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.asc); + }); + } + + QueryBuilder thenByIsarIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isarId', Sort.desc); + }); + } + + QueryBuilder thenByMediaJson() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mediaJson', Sort.asc); + }); + } + + QueryBuilder thenByMediaJsonDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'mediaJson', Sort.desc); + }); + } + + QueryBuilder thenByMessageType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'messageType', Sort.asc); + }); + } + + QueryBuilder + thenByMessageTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'messageType', Sort.desc); + }); + } + + QueryBuilder thenBySenderId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'senderId', Sort.asc); + }); + } + + QueryBuilder thenBySenderIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'senderId', Sort.desc); + }); + } + + QueryBuilder thenByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.asc); + }); + } + + QueryBuilder thenByUpdatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.desc); + }); + } +} + +extension MessageModelQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByChatId( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'chatId', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByContent( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'content', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByCreatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'createdAt'); + }); + } + + QueryBuilder distinctById( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'id', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByIsRead() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isRead'); + }); + } + + QueryBuilder distinctByMediaJson( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'mediaJson', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByMessageType( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'messageType', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctBySenderId( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'senderId', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'updatedAt'); + }); + } +} + +extension MessageModelQueryProperty + on QueryBuilder { + QueryBuilder isarIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isarId'); + }); + } + + QueryBuilder chatIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'chatId'); + }); + } + + QueryBuilder contentProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'content'); + }); + } + + QueryBuilder createdAtProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'createdAt'); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder isReadProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isRead'); + }); + } + + QueryBuilder mediaJsonProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'mediaJson'); + }); + } + + QueryBuilder messageTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'messageType'); + }); + } + + QueryBuilder senderIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'senderId'); + }); + } + + QueryBuilder updatedAtProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'updatedAt'); + }); + } +} diff --git a/client-mobile/lib/features/chat/data/repositories/chat_repository_impl.dart b/client-mobile/lib/features/chat/data/repositories/chat_repository_impl.dart index f774b90..aab3b30 100644 --- a/client-mobile/lib/features/chat/data/repositories/chat_repository_impl.dart +++ b/client-mobile/lib/features/chat/data/repositories/chat_repository_impl.dart @@ -1,47 +1,133 @@ -import '../../../../core/errors/errors.dart'; +import 'dart:async'; import '../../../../core/errors/result.dart'; +import '../../../../core/network/signalr_service.dart'; import '../../domain/entities/chat.dart'; import '../../domain/entities/message.dart'; import '../../domain/repositories/chat_repository.dart'; +import '../datasources/chat_local_datasource.dart'; +import '../datasources/chat_remote_datasource.dart'; class ChatRepositoryImpl implements ChatRepository { - @override - Future> createChat(String title, List participantIds) async { - return const Result.success(null); - } + final ChatRemoteDataSource remoteDataSource; + final ChatLocalDataSource localDataSource; + final SignalRService signalRService; + + ChatRepositoryImpl({ + required this.remoteDataSource, + required this.localDataSource, + required this.signalRService, + }); @override - Future> deleteChat(String chatId) async { - return const Result.success(null); + Stream get messageStream => signalRService.messages; + + @override + Future initSignalR() => signalRService.init(); + + @override + Future disposeSignalR() => signalRService.stop(); + + @override + Future>> getChats({String? currentUserId}) async { + // 1. Return cached chats immediately if available + final cachedResult = await localDataSource.getCachedChats(); + + // 2. Fetch from remote and update cache + final remoteResult = await remoteDataSource.getChats(currentUserId: currentUserId); + if (remoteResult.isSuccess) { + final chats = remoteResult.data!; + await localDataSource.cacheChats(chats); + return Result.success(chats); + } + + // If remote fails, return cached or error + return cachedResult; } @override Future> getChatById(String chatId) async { - return const Result.failure(AppError.notFound(message: 'Chat not found')); + final remoteResult = await remoteDataSource.getChatById(chatId); + if (remoteResult.isSuccess) { + await localDataSource.cacheChat(remoteResult.data!); + return remoteResult; + } + return localDataSource.getChatFromCache(chatId); } @override - Future>> getChats() async { - // Return empty list for now - return const Result.success([]); + Future> createPersonalChat(String userId) async { + final result = await remoteDataSource.createPersonalChat(userId); + if (result.isSuccess) { + await localDataSource.cacheChat(result.data!); + } + return result; } @override - Future>> getMessages( - String chatId, { - int? limit, - String? lastMessageId, - }) async { - return const Result.success([]); + Future> createGroupChat(String name, List memberIds) async { + final result = await remoteDataSource.createGroupChat(name, memberIds); + if (result.isSuccess) { + await localDataSource.cacheChat(result.data!); + } + return result; } @override - Future> sendMessage(String chatId, Message message) async { - return const Result.success(null); + Future> getOrCreateFavorites() async { + final result = await remoteDataSource.getOrCreateFavorites(); + if (result.isSuccess) { + await localDataSource.cacheChat(result.data!); + } + return result; } @override - Future> updateChat(String chatId, String title) async { - return const Result.success(null); + Future> sendMessage(String chatId, String content, {String? type}) async { + final result = await remoteDataSource.sendMessage(chatId, content, type: type); + if (result.isSuccess) { + // We don't cache individual messages here usually, + // let SignalR ReceiveMessage handle it or update list + final messagesResult = await getMessages(chatId); + if (messagesResult.isSuccess) { + await localDataSource.cacheMessages(chatId, messagesResult.data!); + } + } + return result; + } + + @override + Future>> getMessages(String chatId, {String? cursor}) async { + if (cursor == null) { + final cached = await localDataSource.getMessagesFromCache(chatId); + final remote = await remoteDataSource.getMessages(chatId); + if (remote.isSuccess) { + await localDataSource.cacheMessages(chatId, remote.data!); + return remote; + } + return cached; + } else { + return remoteDataSource.getMessages(chatId, cursor: cursor); + } + } + + @override + Future> togglePin(String chatId) async { + final result = await remoteDataSource.togglePin(chatId); + if (result.isSuccess) { + final chat = await getChatById(chatId); + if (chat.isSuccess) { + await localDataSource.cacheChat(chat.data!); + } + } + return result; + } + + @override + Future> clearChat(String chatId) async { + final result = await remoteDataSource.clearChat(chatId); + if (result.isSuccess) { + await localDataSource.cacheMessages(chatId, []); + } + return result; } } diff --git a/client-mobile/lib/features/chat/domain/repositories/chat_repository.dart b/client-mobile/lib/features/chat/domain/repositories/chat_repository.dart index f5b2015..a0e7605 100644 --- a/client-mobile/lib/features/chat/domain/repositories/chat_repository.dart +++ b/client-mobile/lib/features/chat/domain/repositories/chat_repository.dart @@ -3,11 +3,17 @@ import '../entities/chat.dart'; import '../entities/message.dart'; abstract class ChatRepository { - Future>> getChats(); + Future>> getChats({String? currentUserId}); Future> getChatById(String chatId); - Future> createChat(String title, List participantIds); - Future> sendMessage(String chatId, Message message); - Future>> getMessages(String chatId, {int? limit, String? lastMessageId}); - Future> deleteChat(String chatId); - Future> updateChat(String chatId, String title); + Future> createPersonalChat(String userId); + Future> createGroupChat(String name, List memberIds); + Future> getOrCreateFavorites(); + Future> sendMessage(String chatId, String content, {String? type}); + Future>> getMessages(String chatId, {String? cursor}); + Future> togglePin(String chatId); + Future> clearChat(String chatId); + + Stream get messageStream; + Future initSignalR(); + Future disposeSignalR(); } diff --git a/client-mobile/lib/features/chat/presentation/bloc/chat_bloc.dart b/client-mobile/lib/features/chat/presentation/bloc/chat_bloc.dart index 60671cf..40cf70e 100644 --- a/client-mobile/lib/features/chat/presentation/bloc/chat_bloc.dart +++ b/client-mobile/lib/features/chat/presentation/bloc/chat_bloc.dart @@ -1,23 +1,92 @@ +import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../domain/entities/chat.dart'; +import '../../domain/entities/message.dart'; +import '../../domain/repositories/chat_repository.dart'; import 'chat_event.dart'; import 'chat_state.dart'; class ChatBloc extends Bloc { - ChatBloc() : super(const ChatState.initial()) { + final ChatRepository chatRepository; + StreamSubscription? _messageSubscription; + + ChatBloc({required this.chatRepository}) : super(const ChatState.initial()) { on(_onStarted); on(_onChatsLoaded); on(_onChatSelected); on(_onMessagesRequested); on(_onMessageSent); + on(_onFavoritesRequested); + + _messageSubscription = chatRepository.messageStream.listen((message) { + // Handle real-time messages + add(ChatEvent.messagesRequested(message.chatId)); + }); } - Future _onStarted(ChatEventStarted event, emit) async { - emit(const ChatState.loading()); - emit(const ChatState.chatsLoaded([])); + Future _onStarted(ChatEventStarted event, Emitter emit) async { + // Start SignalR in background + chatRepository.initSignalR().catchError((e) { + // Log or handle SignalR init error + }); + // Immediately trigger chats loading + add(const ChatEvent.chatsLoaded()); } + + Future _onChatsLoaded(ChatEventChatsLoaded event, Emitter emit) async { + emit(const ChatState.loading()); + final result = await chatRepository.getChats(currentUserId: event.currentUserId); + result.fold( + (error) => emit(ChatState.error(error.message ?? 'Failed to load chats')), + (chats) => emit(ChatState.chatsLoaded(chats)), + ); + } + + Future _onChatSelected(ChatEventChatSelected event, Emitter emit) async { + emit(const ChatState.loading()); + final chatResult = await chatRepository.getChatById(event.chatId); + final messagesResult = await chatRepository.getMessages(event.chatId); - Future _onChatsLoaded(ChatEventChatsLoaded event, emit) async {} - Future _onChatSelected(ChatEventChatSelected event, emit) async {} - Future _onMessagesRequested(ChatEventMessagesRequested event, emit) async {} - Future _onMessageSent(ChatEventMessageSent event, emit) async {} + chatResult.fold( + (error) => emit(ChatState.error(error.message ?? 'Failed to load chat')), + (chat) { + messagesResult.fold( + (error) => emit(ChatState.chatSelected(chat, [])), + (messages) => emit(ChatState.chatSelected(chat, messages)), + ); + }, + ); + } + + Future _onMessagesRequested(ChatEventMessagesRequested event, Emitter emit) async { + final result = await chatRepository.getMessages(event.chatId); + result.fold( + (error) => emit(ChatState.error(error.message ?? 'Failed to load messages')), + (messages) => emit(ChatState.messagesLoaded(messages)), + ); + } + + Future _onMessageSent(ChatEventMessageSent event, Emitter emit) async { + final result = await chatRepository.sendMessage(event.chatId, event.content); + result.fold( + (error) => emit(ChatState.error(error.message ?? 'Failed to send message')), + (_) => add(ChatEvent.messagesRequested(event.chatId)), + ); + } + + Future _onFavoritesRequested(ChatEventFavoritesRequested event, Emitter emit) async { + emit(const ChatState.loading()); + final result = await chatRepository.getOrCreateFavorites(); + result.fold( + (error) => emit(ChatState.error(error.message ?? 'Failed to open Favorites')), + (chat) => add(ChatEvent.chatSelected(chat.id)), + ); + } + + @override + Future close() { + _messageSubscription?.cancel(); + chatRepository.disposeSignalR(); + return super.close(); + } } diff --git a/client-mobile/lib/features/chat/presentation/bloc/chat_event.dart b/client-mobile/lib/features/chat/presentation/bloc/chat_event.dart index c94c783..2826f5c 100644 --- a/client-mobile/lib/features/chat/presentation/bloc/chat_event.dart +++ b/client-mobile/lib/features/chat/presentation/bloc/chat_event.dart @@ -5,10 +5,9 @@ part 'chat_event.freezed.dart'; @freezed class ChatEvent with _$ChatEvent { const factory ChatEvent.started() = ChatEventStarted; - const factory ChatEvent.chatsLoaded() = ChatEventChatsLoaded; + const factory ChatEvent.chatsLoaded({String? currentUserId}) = ChatEventChatsLoaded; const factory ChatEvent.chatSelected(String chatId) = ChatEventChatSelected; - const factory ChatEvent.messagesRequested(String chatId, {String? lastMessageId}) = ChatEventMessagesRequested; + const factory ChatEvent.messagesRequested(String chatId, {String? cursor}) = ChatEventMessagesRequested; const factory ChatEvent.messageSent(String chatId, String content) = ChatEventMessageSent; - const factory ChatEvent.messageRead(String chatId, String messageId) = ChatEventMessageRead; - const factory ChatEvent.chatCreated(String title, List participantIds) = ChatEventChatCreated; + const factory ChatEvent.favoritesRequested() = ChatEventFavoritesRequested; } diff --git a/client-mobile/lib/features/chat/presentation/bloc/chat_event.freezed.dart b/client-mobile/lib/features/chat/presentation/bloc/chat_event.freezed.dart index 83e3d4c..6f14888 100644 --- a/client-mobile/lib/features/chat/presentation/bloc/chat_event.freezed.dart +++ b/client-mobile/lib/features/chat/presentation/bloc/chat_event.freezed.dart @@ -19,36 +19,31 @@ mixin _$ChatEvent { @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -60,8 +55,8 @@ mixin _$ChatEvent { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -71,8 +66,7 @@ mixin _$ChatEvent { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -82,8 +76,7 @@ mixin _$ChatEvent { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -145,14 +138,11 @@ class _$ChatEventStartedImpl implements ChatEventStarted { @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) { return started(); } @@ -161,12 +151,11 @@ class _$ChatEventStartedImpl implements ChatEventStarted { @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) { return started?.call(); } @@ -175,12 +164,11 @@ class _$ChatEventStartedImpl implements ChatEventStarted { @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) { if (started != null) { @@ -198,8 +186,8 @@ class _$ChatEventStartedImpl implements ChatEventStarted { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) { return started(this); } @@ -212,8 +200,7 @@ class _$ChatEventStartedImpl implements ChatEventStarted { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) { return started?.call(this); } @@ -226,8 +213,7 @@ class _$ChatEventStartedImpl implements ChatEventStarted { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) { if (started != null) { @@ -246,6 +232,8 @@ abstract class _$$ChatEventChatsLoadedImplCopyWith<$Res> { factory _$$ChatEventChatsLoadedImplCopyWith(_$ChatEventChatsLoadedImpl value, $Res Function(_$ChatEventChatsLoadedImpl) then) = __$$ChatEventChatsLoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({String? currentUserId}); } /// @nodoc @@ -255,72 +243,93 @@ class __$$ChatEventChatsLoadedImplCopyWithImpl<$Res> __$$ChatEventChatsLoadedImplCopyWithImpl(_$ChatEventChatsLoadedImpl _value, $Res Function(_$ChatEventChatsLoadedImpl) _then) : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? currentUserId = freezed, + }) { + return _then(_$ChatEventChatsLoadedImpl( + currentUserId: freezed == currentUserId + ? _value.currentUserId + : currentUserId // ignore: cast_nullable_to_non_nullable + as String?, + )); + } } /// @nodoc class _$ChatEventChatsLoadedImpl implements ChatEventChatsLoaded { - const _$ChatEventChatsLoadedImpl(); + const _$ChatEventChatsLoadedImpl({this.currentUserId}); + + @override + final String? currentUserId; @override String toString() { - return 'ChatEvent.chatsLoaded()'; + return 'ChatEvent.chatsLoaded(currentUserId: $currentUserId)'; } @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$ChatEventChatsLoadedImpl); + other is _$ChatEventChatsLoadedImpl && + (identical(other.currentUserId, currentUserId) || + other.currentUserId == currentUserId)); } @override - int get hashCode => runtimeType.hashCode; + int get hashCode => Object.hash(runtimeType, currentUserId); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ChatEventChatsLoadedImplCopyWith<_$ChatEventChatsLoadedImpl> + get copyWith => + __$$ChatEventChatsLoadedImplCopyWithImpl<_$ChatEventChatsLoadedImpl>( + this, _$identity); @override @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) { - return chatsLoaded(); + return chatsLoaded(currentUserId); } @override @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) { - return chatsLoaded?.call(); + return chatsLoaded?.call(currentUserId); } @override @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) { if (chatsLoaded != null) { - return chatsLoaded(); + return chatsLoaded(currentUserId); } return orElse(); } @@ -334,8 +343,8 @@ class _$ChatEventChatsLoadedImpl implements ChatEventChatsLoaded { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) { return chatsLoaded(this); } @@ -348,8 +357,7 @@ class _$ChatEventChatsLoadedImpl implements ChatEventChatsLoaded { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) { return chatsLoaded?.call(this); } @@ -362,8 +370,7 @@ class _$ChatEventChatsLoadedImpl implements ChatEventChatsLoaded { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) { if (chatsLoaded != null) { @@ -374,7 +381,13 @@ class _$ChatEventChatsLoadedImpl implements ChatEventChatsLoaded { } abstract class ChatEventChatsLoaded implements ChatEvent { - const factory ChatEventChatsLoaded() = _$ChatEventChatsLoadedImpl; + const factory ChatEventChatsLoaded({final String? currentUserId}) = + _$ChatEventChatsLoadedImpl; + + String? get currentUserId; + @JsonKey(ignore: true) + _$$ChatEventChatsLoadedImplCopyWith<_$ChatEventChatsLoadedImpl> + get copyWith => throw _privateConstructorUsedError; } /// @nodoc @@ -444,14 +457,11 @@ class _$ChatEventChatSelectedImpl implements ChatEventChatSelected { @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) { return chatSelected(chatId); } @@ -460,12 +470,11 @@ class _$ChatEventChatSelectedImpl implements ChatEventChatSelected { @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) { return chatSelected?.call(chatId); } @@ -474,12 +483,11 @@ class _$ChatEventChatSelectedImpl implements ChatEventChatSelected { @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) { if (chatSelected != null) { @@ -497,8 +505,8 @@ class _$ChatEventChatSelectedImpl implements ChatEventChatSelected { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) { return chatSelected(this); } @@ -511,8 +519,7 @@ class _$ChatEventChatSelectedImpl implements ChatEventChatSelected { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) { return chatSelected?.call(this); } @@ -525,8 +532,7 @@ class _$ChatEventChatSelectedImpl implements ChatEventChatSelected { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) { if (chatSelected != null) { @@ -553,7 +559,7 @@ abstract class _$$ChatEventMessagesRequestedImplCopyWith<$Res> { $Res Function(_$ChatEventMessagesRequestedImpl) then) = __$$ChatEventMessagesRequestedImplCopyWithImpl<$Res>; @useResult - $Res call({String chatId, String? lastMessageId}); + $Res call({String chatId, String? cursor}); } /// @nodoc @@ -569,16 +575,16 @@ class __$$ChatEventMessagesRequestedImplCopyWithImpl<$Res> @override $Res call({ Object? chatId = null, - Object? lastMessageId = freezed, + Object? cursor = freezed, }) { return _then(_$ChatEventMessagesRequestedImpl( null == chatId ? _value.chatId : chatId // ignore: cast_nullable_to_non_nullable as String, - lastMessageId: freezed == lastMessageId - ? _value.lastMessageId - : lastMessageId // ignore: cast_nullable_to_non_nullable + cursor: freezed == cursor + ? _value.cursor + : cursor // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -587,16 +593,16 @@ class __$$ChatEventMessagesRequestedImplCopyWithImpl<$Res> /// @nodoc class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { - const _$ChatEventMessagesRequestedImpl(this.chatId, {this.lastMessageId}); + const _$ChatEventMessagesRequestedImpl(this.chatId, {this.cursor}); @override final String chatId; @override - final String? lastMessageId; + final String? cursor; @override String toString() { - return 'ChatEvent.messagesRequested(chatId: $chatId, lastMessageId: $lastMessageId)'; + return 'ChatEvent.messagesRequested(chatId: $chatId, cursor: $cursor)'; } @override @@ -605,12 +611,11 @@ class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { (other.runtimeType == runtimeType && other is _$ChatEventMessagesRequestedImpl && (identical(other.chatId, chatId) || other.chatId == chatId) && - (identical(other.lastMessageId, lastMessageId) || - other.lastMessageId == lastMessageId)); + (identical(other.cursor, cursor) || other.cursor == cursor)); } @override - int get hashCode => Object.hash(runtimeType, chatId, lastMessageId); + int get hashCode => Object.hash(runtimeType, chatId, cursor); @JsonKey(ignore: true) @override @@ -623,46 +628,41 @@ class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) { - return messagesRequested(chatId, lastMessageId); + return messagesRequested(chatId, cursor); } @override @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) { - return messagesRequested?.call(chatId, lastMessageId); + return messagesRequested?.call(chatId, cursor); } @override @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) { if (messagesRequested != null) { - return messagesRequested(chatId, lastMessageId); + return messagesRequested(chatId, cursor); } return orElse(); } @@ -676,8 +676,8 @@ class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) { return messagesRequested(this); } @@ -690,8 +690,7 @@ class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) { return messagesRequested?.call(this); } @@ -704,8 +703,7 @@ class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) { if (messagesRequested != null) { @@ -717,10 +715,10 @@ class _$ChatEventMessagesRequestedImpl implements ChatEventMessagesRequested { abstract class ChatEventMessagesRequested implements ChatEvent { const factory ChatEventMessagesRequested(final String chatId, - {final String? lastMessageId}) = _$ChatEventMessagesRequestedImpl; + {final String? cursor}) = _$ChatEventMessagesRequestedImpl; String get chatId; - String? get lastMessageId; + String? get cursor; @JsonKey(ignore: true) _$$ChatEventMessagesRequestedImplCopyWith<_$ChatEventMessagesRequestedImpl> get copyWith => throw _privateConstructorUsedError; @@ -801,14 +799,11 @@ class _$ChatEventMessageSentImpl implements ChatEventMessageSent { @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) { return messageSent(chatId, content); } @@ -817,12 +812,11 @@ class _$ChatEventMessageSentImpl implements ChatEventMessageSent { @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) { return messageSent?.call(chatId, content); } @@ -831,12 +825,11 @@ class _$ChatEventMessageSentImpl implements ChatEventMessageSent { @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) { if (messageSent != null) { @@ -854,8 +847,8 @@ class _$ChatEventMessageSentImpl implements ChatEventMessageSent { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) { return messageSent(this); } @@ -868,8 +861,7 @@ class _$ChatEventMessageSentImpl implements ChatEventMessageSent { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) { return messageSent?.call(this); } @@ -882,8 +874,7 @@ class _$ChatEventMessageSentImpl implements ChatEventMessageSent { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) { if (messageSent != null) { @@ -905,121 +896,82 @@ abstract class ChatEventMessageSent implements ChatEvent { } /// @nodoc -abstract class _$$ChatEventMessageReadImplCopyWith<$Res> { - factory _$$ChatEventMessageReadImplCopyWith(_$ChatEventMessageReadImpl value, - $Res Function(_$ChatEventMessageReadImpl) then) = - __$$ChatEventMessageReadImplCopyWithImpl<$Res>; - @useResult - $Res call({String chatId, String messageId}); +abstract class _$$ChatEventFavoritesRequestedImplCopyWith<$Res> { + factory _$$ChatEventFavoritesRequestedImplCopyWith( + _$ChatEventFavoritesRequestedImpl value, + $Res Function(_$ChatEventFavoritesRequestedImpl) then) = + __$$ChatEventFavoritesRequestedImplCopyWithImpl<$Res>; } /// @nodoc -class __$$ChatEventMessageReadImplCopyWithImpl<$Res> - extends _$ChatEventCopyWithImpl<$Res, _$ChatEventMessageReadImpl> - implements _$$ChatEventMessageReadImplCopyWith<$Res> { - __$$ChatEventMessageReadImplCopyWithImpl(_$ChatEventMessageReadImpl _value, - $Res Function(_$ChatEventMessageReadImpl) _then) +class __$$ChatEventFavoritesRequestedImplCopyWithImpl<$Res> + extends _$ChatEventCopyWithImpl<$Res, _$ChatEventFavoritesRequestedImpl> + implements _$$ChatEventFavoritesRequestedImplCopyWith<$Res> { + __$$ChatEventFavoritesRequestedImplCopyWithImpl( + _$ChatEventFavoritesRequestedImpl _value, + $Res Function(_$ChatEventFavoritesRequestedImpl) _then) : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? chatId = null, - Object? messageId = null, - }) { - return _then(_$ChatEventMessageReadImpl( - null == chatId - ? _value.chatId - : chatId // ignore: cast_nullable_to_non_nullable - as String, - null == messageId - ? _value.messageId - : messageId // ignore: cast_nullable_to_non_nullable - as String, - )); - } } /// @nodoc -class _$ChatEventMessageReadImpl implements ChatEventMessageRead { - const _$ChatEventMessageReadImpl(this.chatId, this.messageId); - - @override - final String chatId; - @override - final String messageId; +class _$ChatEventFavoritesRequestedImpl implements ChatEventFavoritesRequested { + const _$ChatEventFavoritesRequestedImpl(); @override String toString() { - return 'ChatEvent.messageRead(chatId: $chatId, messageId: $messageId)'; + return 'ChatEvent.favoritesRequested()'; } @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$ChatEventMessageReadImpl && - (identical(other.chatId, chatId) || other.chatId == chatId) && - (identical(other.messageId, messageId) || - other.messageId == messageId)); + other is _$ChatEventFavoritesRequestedImpl); } @override - int get hashCode => Object.hash(runtimeType, chatId, messageId); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ChatEventMessageReadImplCopyWith<_$ChatEventMessageReadImpl> - get copyWith => - __$$ChatEventMessageReadImplCopyWithImpl<_$ChatEventMessageReadImpl>( - this, _$identity); + int get hashCode => runtimeType.hashCode; @override @optionalTypeArgs TResult when({ required TResult Function() started, - required TResult Function() chatsLoaded, + required TResult Function(String? currentUserId) chatsLoaded, required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, + required TResult Function(String chatId, String? cursor) messagesRequested, required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, + required TResult Function() favoritesRequested, }) { - return messageRead(chatId, messageId); + return favoritesRequested(); } @override @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? started, - TResult? Function()? chatsLoaded, + TResult? Function(String? currentUserId)? chatsLoaded, TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, + TResult? Function(String chatId, String? cursor)? messagesRequested, TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, + TResult? Function()? favoritesRequested, }) { - return messageRead?.call(chatId, messageId); + return favoritesRequested?.call(); } @override @optionalTypeArgs TResult maybeWhen({ TResult Function()? started, - TResult Function()? chatsLoaded, + TResult Function(String? currentUserId)? chatsLoaded, TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, + TResult Function(String chatId, String? cursor)? messagesRequested, TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, + TResult Function()? favoritesRequested, required TResult orElse(), }) { - if (messageRead != null) { - return messageRead(chatId, messageId); + if (favoritesRequested != null) { + return favoritesRequested(); } return orElse(); } @@ -1033,10 +985,10 @@ class _$ChatEventMessageReadImpl implements ChatEventMessageRead { required TResult Function(ChatEventMessagesRequested value) messagesRequested, required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, + required TResult Function(ChatEventFavoritesRequested value) + favoritesRequested, }) { - return messageRead(this); + return favoritesRequested(this); } @override @@ -1047,10 +999,9 @@ class _$ChatEventMessageReadImpl implements ChatEventMessageRead { TResult? Function(ChatEventChatSelected value)? chatSelected, TResult? Function(ChatEventMessagesRequested value)? messagesRequested, TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, + TResult? Function(ChatEventFavoritesRequested value)? favoritesRequested, }) { - return messageRead?.call(this); + return favoritesRequested?.call(this); } @override @@ -1061,212 +1012,17 @@ class _$ChatEventMessageReadImpl implements ChatEventMessageRead { TResult Function(ChatEventChatSelected value)? chatSelected, TResult Function(ChatEventMessagesRequested value)? messagesRequested, TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, + TResult Function(ChatEventFavoritesRequested value)? favoritesRequested, required TResult orElse(), }) { - if (messageRead != null) { - return messageRead(this); + if (favoritesRequested != null) { + return favoritesRequested(this); } return orElse(); } } -abstract class ChatEventMessageRead implements ChatEvent { - const factory ChatEventMessageRead( - final String chatId, final String messageId) = _$ChatEventMessageReadImpl; - - String get chatId; - String get messageId; - @JsonKey(ignore: true) - _$$ChatEventMessageReadImplCopyWith<_$ChatEventMessageReadImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$ChatEventChatCreatedImplCopyWith<$Res> { - factory _$$ChatEventChatCreatedImplCopyWith(_$ChatEventChatCreatedImpl value, - $Res Function(_$ChatEventChatCreatedImpl) then) = - __$$ChatEventChatCreatedImplCopyWithImpl<$Res>; - @useResult - $Res call({String title, List participantIds}); -} - -/// @nodoc -class __$$ChatEventChatCreatedImplCopyWithImpl<$Res> - extends _$ChatEventCopyWithImpl<$Res, _$ChatEventChatCreatedImpl> - implements _$$ChatEventChatCreatedImplCopyWith<$Res> { - __$$ChatEventChatCreatedImplCopyWithImpl(_$ChatEventChatCreatedImpl _value, - $Res Function(_$ChatEventChatCreatedImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? title = null, - Object? participantIds = null, - }) { - return _then(_$ChatEventChatCreatedImpl( - null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - null == participantIds - ? _value._participantIds - : participantIds // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc - -class _$ChatEventChatCreatedImpl implements ChatEventChatCreated { - const _$ChatEventChatCreatedImpl( - this.title, final List participantIds) - : _participantIds = participantIds; - - @override - final String title; - final List _participantIds; - @override - List get participantIds { - if (_participantIds is EqualUnmodifiableListView) return _participantIds; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_participantIds); - } - - @override - String toString() { - return 'ChatEvent.chatCreated(title: $title, participantIds: $participantIds)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ChatEventChatCreatedImpl && - (identical(other.title, title) || other.title == title) && - const DeepCollectionEquality() - .equals(other._participantIds, _participantIds)); - } - - @override - int get hashCode => Object.hash( - runtimeType, title, const DeepCollectionEquality().hash(_participantIds)); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$ChatEventChatCreatedImplCopyWith<_$ChatEventChatCreatedImpl> - get copyWith => - __$$ChatEventChatCreatedImplCopyWithImpl<_$ChatEventChatCreatedImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() started, - required TResult Function() chatsLoaded, - required TResult Function(String chatId) chatSelected, - required TResult Function(String chatId, String? lastMessageId) - messagesRequested, - required TResult Function(String chatId, String content) messageSent, - required TResult Function(String chatId, String messageId) messageRead, - required TResult Function(String title, List participantIds) - chatCreated, - }) { - return chatCreated(title, participantIds); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? started, - TResult? Function()? chatsLoaded, - TResult? Function(String chatId)? chatSelected, - TResult? Function(String chatId, String? lastMessageId)? messagesRequested, - TResult? Function(String chatId, String content)? messageSent, - TResult? Function(String chatId, String messageId)? messageRead, - TResult? Function(String title, List participantIds)? chatCreated, - }) { - return chatCreated?.call(title, participantIds); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? started, - TResult Function()? chatsLoaded, - TResult Function(String chatId)? chatSelected, - TResult Function(String chatId, String? lastMessageId)? messagesRequested, - TResult Function(String chatId, String content)? messageSent, - TResult Function(String chatId, String messageId)? messageRead, - TResult Function(String title, List participantIds)? chatCreated, - required TResult orElse(), - }) { - if (chatCreated != null) { - return chatCreated(title, participantIds); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ChatEventStarted value) started, - required TResult Function(ChatEventChatsLoaded value) chatsLoaded, - required TResult Function(ChatEventChatSelected value) chatSelected, - required TResult Function(ChatEventMessagesRequested value) - messagesRequested, - required TResult Function(ChatEventMessageSent value) messageSent, - required TResult Function(ChatEventMessageRead value) messageRead, - required TResult Function(ChatEventChatCreated value) chatCreated, - }) { - return chatCreated(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ChatEventStarted value)? started, - TResult? Function(ChatEventChatsLoaded value)? chatsLoaded, - TResult? Function(ChatEventChatSelected value)? chatSelected, - TResult? Function(ChatEventMessagesRequested value)? messagesRequested, - TResult? Function(ChatEventMessageSent value)? messageSent, - TResult? Function(ChatEventMessageRead value)? messageRead, - TResult? Function(ChatEventChatCreated value)? chatCreated, - }) { - return chatCreated?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ChatEventStarted value)? started, - TResult Function(ChatEventChatsLoaded value)? chatsLoaded, - TResult Function(ChatEventChatSelected value)? chatSelected, - TResult Function(ChatEventMessagesRequested value)? messagesRequested, - TResult Function(ChatEventMessageSent value)? messageSent, - TResult Function(ChatEventMessageRead value)? messageRead, - TResult Function(ChatEventChatCreated value)? chatCreated, - required TResult orElse(), - }) { - if (chatCreated != null) { - return chatCreated(this); - } - return orElse(); - } -} - -abstract class ChatEventChatCreated implements ChatEvent { - const factory ChatEventChatCreated( - final String title, final List participantIds) = - _$ChatEventChatCreatedImpl; - - String get title; - List get participantIds; - @JsonKey(ignore: true) - _$$ChatEventChatCreatedImplCopyWith<_$ChatEventChatCreatedImpl> - get copyWith => throw _privateConstructorUsedError; +abstract class ChatEventFavoritesRequested implements ChatEvent { + const factory ChatEventFavoritesRequested() = + _$ChatEventFavoritesRequestedImpl; } diff --git a/client-mobile/lib/features/chat/presentation/bloc/chat_state.dart b/client-mobile/lib/features/chat/presentation/bloc/chat_state.dart index 223cc7e..4b6fbae 100644 --- a/client-mobile/lib/features/chat/presentation/bloc/chat_state.dart +++ b/client-mobile/lib/features/chat/presentation/bloc/chat_state.dart @@ -1,4 +1,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; +import '../../domain/entities/chat.dart'; +import '../../domain/entities/message.dart'; part 'chat_state.freezed.dart'; @@ -6,9 +8,8 @@ part 'chat_state.freezed.dart'; class ChatState with _$ChatState { const factory ChatState.initial() = ChatInitial; const factory ChatState.loading() = ChatLoading; - const factory ChatState.chatsLoaded(List chats) = _ChatsLoaded; - const factory ChatState.chatSelected(String chat, List messages) = _ChatSelected; - const factory ChatState.messagesLoaded(List messages) = _MessagesLoaded; - const factory ChatState.messageSent() = _MessageSent; + const factory ChatState.chatsLoaded(List chats) = _ChatsLoaded; + const factory ChatState.chatSelected(Chat chat, List messages) = _ChatSelected; + const factory ChatState.messagesLoaded(List messages) = _MessagesLoaded; const factory ChatState.error(String message) = ChatError; } diff --git a/client-mobile/lib/features/chat/presentation/bloc/chat_state.freezed.dart b/client-mobile/lib/features/chat/presentation/bloc/chat_state.freezed.dart index a4b60f3..ec47ab1 100644 --- a/client-mobile/lib/features/chat/presentation/bloc/chat_state.freezed.dart +++ b/client-mobile/lib/features/chat/presentation/bloc/chat_state.freezed.dart @@ -20,10 +20,9 @@ mixin _$ChatState { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) => throw _privateConstructorUsedError; @@ -31,10 +30,9 @@ mixin _$ChatState { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) => throw _privateConstructorUsedError; @@ -42,10 +40,9 @@ mixin _$ChatState { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) => @@ -57,7 +54,6 @@ mixin _$ChatState { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) => throw _privateConstructorUsedError; @@ -68,7 +64,6 @@ mixin _$ChatState { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) => throw _privateConstructorUsedError; @@ -79,7 +74,6 @@ mixin _$ChatState { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) => @@ -143,10 +137,9 @@ class _$ChatInitialImpl implements ChatInitial { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) { return initial(); @@ -157,10 +150,9 @@ class _$ChatInitialImpl implements ChatInitial { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) { return initial?.call(); @@ -171,10 +163,9 @@ class _$ChatInitialImpl implements ChatInitial { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) { @@ -192,7 +183,6 @@ class _$ChatInitialImpl implements ChatInitial { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) { return initial(this); @@ -206,7 +196,6 @@ class _$ChatInitialImpl implements ChatInitial { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) { return initial?.call(this); @@ -220,7 +209,6 @@ class _$ChatInitialImpl implements ChatInitial { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) { @@ -275,10 +263,9 @@ class _$ChatLoadingImpl implements ChatLoading { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) { return loading(); @@ -289,10 +276,9 @@ class _$ChatLoadingImpl implements ChatLoading { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) { return loading?.call(); @@ -303,10 +289,9 @@ class _$ChatLoadingImpl implements ChatLoading { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) { @@ -324,7 +309,6 @@ class _$ChatLoadingImpl implements ChatLoading { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) { return loading(this); @@ -338,7 +322,6 @@ class _$ChatLoadingImpl implements ChatLoading { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) { return loading?.call(this); @@ -352,7 +335,6 @@ class _$ChatLoadingImpl implements ChatLoading { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) { @@ -373,7 +355,7 @@ abstract class _$$ChatsLoadedImplCopyWith<$Res> { _$ChatsLoadedImpl value, $Res Function(_$ChatsLoadedImpl) then) = __$$ChatsLoadedImplCopyWithImpl<$Res>; @useResult - $Res call({List chats}); + $Res call({List chats}); } /// @nodoc @@ -393,7 +375,7 @@ class __$$ChatsLoadedImplCopyWithImpl<$Res> null == chats ? _value._chats : chats // ignore: cast_nullable_to_non_nullable - as List, + as List, )); } } @@ -401,11 +383,11 @@ class __$$ChatsLoadedImplCopyWithImpl<$Res> /// @nodoc class _$ChatsLoadedImpl implements _ChatsLoaded { - const _$ChatsLoadedImpl(final List chats) : _chats = chats; + const _$ChatsLoadedImpl(final List chats) : _chats = chats; - final List _chats; + final List _chats; @override - List get chats { + List get chats { if (_chats is EqualUnmodifiableListView) return _chats; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_chats); @@ -439,10 +421,9 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) { return chatsLoaded(chats); @@ -453,10 +434,9 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) { return chatsLoaded?.call(chats); @@ -467,10 +447,9 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) { @@ -488,7 +467,6 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) { return chatsLoaded(this); @@ -502,7 +480,6 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) { return chatsLoaded?.call(this); @@ -516,7 +493,6 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) { @@ -528,9 +504,9 @@ class _$ChatsLoadedImpl implements _ChatsLoaded { } abstract class _ChatsLoaded implements ChatState { - const factory _ChatsLoaded(final List chats) = _$ChatsLoadedImpl; + const factory _ChatsLoaded(final List chats) = _$ChatsLoadedImpl; - List get chats; + List get chats; @JsonKey(ignore: true) _$$ChatsLoadedImplCopyWith<_$ChatsLoadedImpl> get copyWith => throw _privateConstructorUsedError; @@ -542,7 +518,9 @@ abstract class _$$ChatSelectedImplCopyWith<$Res> { _$ChatSelectedImpl value, $Res Function(_$ChatSelectedImpl) then) = __$$ChatSelectedImplCopyWithImpl<$Res>; @useResult - $Res call({String chat, List messages}); + $Res call({Chat chat, List messages}); + + $ChatCopyWith<$Res> get chat; } /// @nodoc @@ -563,26 +541,34 @@ class __$$ChatSelectedImplCopyWithImpl<$Res> null == chat ? _value.chat : chat // ignore: cast_nullable_to_non_nullable - as String, + as Chat, null == messages ? _value._messages : messages // ignore: cast_nullable_to_non_nullable - as List, + as List, )); } + + @override + @pragma('vm:prefer-inline') + $ChatCopyWith<$Res> get chat { + return $ChatCopyWith<$Res>(_value.chat, (value) { + return _then(_value.copyWith(chat: value)); + }); + } } /// @nodoc class _$ChatSelectedImpl implements _ChatSelected { - const _$ChatSelectedImpl(this.chat, final List messages) + const _$ChatSelectedImpl(this.chat, final List messages) : _messages = messages; @override - final String chat; - final List _messages; + final Chat chat; + final List _messages; @override - List get messages { + List get messages { if (_messages is EqualUnmodifiableListView) return _messages; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_messages); @@ -617,10 +603,9 @@ class _$ChatSelectedImpl implements _ChatSelected { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) { return chatSelected(chat, messages); @@ -631,10 +616,9 @@ class _$ChatSelectedImpl implements _ChatSelected { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) { return chatSelected?.call(chat, messages); @@ -645,10 +629,9 @@ class _$ChatSelectedImpl implements _ChatSelected { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) { @@ -666,7 +649,6 @@ class _$ChatSelectedImpl implements _ChatSelected { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) { return chatSelected(this); @@ -680,7 +662,6 @@ class _$ChatSelectedImpl implements _ChatSelected { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) { return chatSelected?.call(this); @@ -694,7 +675,6 @@ class _$ChatSelectedImpl implements _ChatSelected { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) { @@ -706,11 +686,11 @@ class _$ChatSelectedImpl implements _ChatSelected { } abstract class _ChatSelected implements ChatState { - const factory _ChatSelected(final String chat, final List messages) = + const factory _ChatSelected(final Chat chat, final List messages) = _$ChatSelectedImpl; - String get chat; - List get messages; + Chat get chat; + List get messages; @JsonKey(ignore: true) _$$ChatSelectedImplCopyWith<_$ChatSelectedImpl> get copyWith => throw _privateConstructorUsedError; @@ -722,7 +702,7 @@ abstract class _$$MessagesLoadedImplCopyWith<$Res> { $Res Function(_$MessagesLoadedImpl) then) = __$$MessagesLoadedImplCopyWithImpl<$Res>; @useResult - $Res call({List messages}); + $Res call({List messages}); } /// @nodoc @@ -742,7 +722,7 @@ class __$$MessagesLoadedImplCopyWithImpl<$Res> null == messages ? _value._messages : messages // ignore: cast_nullable_to_non_nullable - as List, + as List, )); } } @@ -750,12 +730,12 @@ class __$$MessagesLoadedImplCopyWithImpl<$Res> /// @nodoc class _$MessagesLoadedImpl implements _MessagesLoaded { - const _$MessagesLoadedImpl(final List messages) + const _$MessagesLoadedImpl(final List messages) : _messages = messages; - final List _messages; + final List _messages; @override - List get messages { + List get messages { if (_messages is EqualUnmodifiableListView) return _messages; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_messages); @@ -790,10 +770,9 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) { return messagesLoaded(messages); @@ -804,10 +783,9 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) { return messagesLoaded?.call(messages); @@ -818,10 +796,9 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) { @@ -839,7 +816,6 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) { return messagesLoaded(this); @@ -853,7 +829,6 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) { return messagesLoaded?.call(this); @@ -867,7 +842,6 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) { @@ -879,147 +853,15 @@ class _$MessagesLoadedImpl implements _MessagesLoaded { } abstract class _MessagesLoaded implements ChatState { - const factory _MessagesLoaded(final List messages) = + const factory _MessagesLoaded(final List messages) = _$MessagesLoadedImpl; - List get messages; + List get messages; @JsonKey(ignore: true) _$$MessagesLoadedImplCopyWith<_$MessagesLoadedImpl> get copyWith => throw _privateConstructorUsedError; } -/// @nodoc -abstract class _$$MessageSentImplCopyWith<$Res> { - factory _$$MessageSentImplCopyWith( - _$MessageSentImpl value, $Res Function(_$MessageSentImpl) then) = - __$$MessageSentImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$MessageSentImplCopyWithImpl<$Res> - extends _$ChatStateCopyWithImpl<$Res, _$MessageSentImpl> - implements _$$MessageSentImplCopyWith<$Res> { - __$$MessageSentImplCopyWithImpl( - _$MessageSentImpl _value, $Res Function(_$MessageSentImpl) _then) - : super(_value, _then); -} - -/// @nodoc - -class _$MessageSentImpl implements _MessageSent { - const _$MessageSentImpl(); - - @override - String toString() { - return 'ChatState.messageSent()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$MessageSentImpl); - } - - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() initial, - required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, - required TResult Function(String message) error, - }) { - return messageSent(); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? initial, - TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, - TResult? Function(String message)? error, - }) { - return messageSent?.call(); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? initial, - TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, - TResult Function(String message)? error, - required TResult orElse(), - }) { - if (messageSent != null) { - return messageSent(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ChatInitial value) initial, - required TResult Function(ChatLoading value) loading, - required TResult Function(_ChatsLoaded value) chatsLoaded, - required TResult Function(_ChatSelected value) chatSelected, - required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, - required TResult Function(ChatError value) error, - }) { - return messageSent(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ChatInitial value)? initial, - TResult? Function(ChatLoading value)? loading, - TResult? Function(_ChatsLoaded value)? chatsLoaded, - TResult? Function(_ChatSelected value)? chatSelected, - TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, - TResult? Function(ChatError value)? error, - }) { - return messageSent?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ChatInitial value)? initial, - TResult Function(ChatLoading value)? loading, - TResult Function(_ChatsLoaded value)? chatsLoaded, - TResult Function(_ChatSelected value)? chatSelected, - TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, - TResult Function(ChatError value)? error, - required TResult orElse(), - }) { - if (messageSent != null) { - return messageSent(this); - } - return orElse(); - } -} - -abstract class _MessageSent implements ChatState { - const factory _MessageSent() = _$MessageSentImpl; -} - /// @nodoc abstract class _$$ChatErrorImplCopyWith<$Res> { factory _$$ChatErrorImplCopyWith( @@ -1086,10 +928,9 @@ class _$ChatErrorImpl implements ChatError { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function(List chats) chatsLoaded, - required TResult Function(String chat, List messages) chatSelected, - required TResult Function(List messages) messagesLoaded, - required TResult Function() messageSent, + required TResult Function(List chats) chatsLoaded, + required TResult Function(Chat chat, List messages) chatSelected, + required TResult Function(List messages) messagesLoaded, required TResult Function(String message) error, }) { return error(message); @@ -1100,10 +941,9 @@ class _$ChatErrorImpl implements ChatError { TResult? whenOrNull({ TResult? Function()? initial, TResult? Function()? loading, - TResult? Function(List chats)? chatsLoaded, - TResult? Function(String chat, List messages)? chatSelected, - TResult? Function(List messages)? messagesLoaded, - TResult? Function()? messageSent, + TResult? Function(List chats)? chatsLoaded, + TResult? Function(Chat chat, List messages)? chatSelected, + TResult? Function(List messages)? messagesLoaded, TResult? Function(String message)? error, }) { return error?.call(message); @@ -1114,10 +954,9 @@ class _$ChatErrorImpl implements ChatError { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function(List chats)? chatsLoaded, - TResult Function(String chat, List messages)? chatSelected, - TResult Function(List messages)? messagesLoaded, - TResult Function()? messageSent, + TResult Function(List chats)? chatsLoaded, + TResult Function(Chat chat, List messages)? chatSelected, + TResult Function(List messages)? messagesLoaded, TResult Function(String message)? error, required TResult orElse(), }) { @@ -1135,7 +974,6 @@ class _$ChatErrorImpl implements ChatError { required TResult Function(_ChatsLoaded value) chatsLoaded, required TResult Function(_ChatSelected value) chatSelected, required TResult Function(_MessagesLoaded value) messagesLoaded, - required TResult Function(_MessageSent value) messageSent, required TResult Function(ChatError value) error, }) { return error(this); @@ -1149,7 +987,6 @@ class _$ChatErrorImpl implements ChatError { TResult? Function(_ChatsLoaded value)? chatsLoaded, TResult? Function(_ChatSelected value)? chatSelected, TResult? Function(_MessagesLoaded value)? messagesLoaded, - TResult? Function(_MessageSent value)? messageSent, TResult? Function(ChatError value)? error, }) { return error?.call(this); @@ -1163,7 +1000,6 @@ class _$ChatErrorImpl implements ChatError { TResult Function(_ChatsLoaded value)? chatsLoaded, TResult Function(_ChatSelected value)? chatSelected, TResult Function(_MessagesLoaded value)? messagesLoaded, - TResult Function(_MessageSent value)? messageSent, TResult Function(ChatError value)? error, required TResult orElse(), }) { diff --git a/client-mobile/lib/features/chat/presentation/pages/chat_detail_page.dart b/client-mobile/lib/features/chat/presentation/pages/chat_detail_page.dart index dbe81b0..d8b2e3d 100644 --- a/client-mobile/lib/features/chat/presentation/pages/chat_detail_page.dart +++ b/client-mobile/lib/features/chat/presentation/pages/chat_detail_page.dart @@ -1,13 +1,21 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:intl/intl.dart'; +import 'package:messenger_app/l10n/app_localizations.dart'; +import '../bloc/chat_bloc.dart'; +import '../bloc/chat_event.dart'; +import '../bloc/chat_state.dart'; +import '../../domain/entities/chat.dart'; +import '../../domain/entities/message.dart'; class ChatDetailPage extends StatefulWidget { - final String chatId; - final String chatTitle; + final Chat chat; + final String currentUserId; const ChatDetailPage({ super.key, - required this.chatId, - required this.chatTitle, + required this.chat, + required this.currentUserId, }); @override @@ -16,90 +24,148 @@ class ChatDetailPage extends StatefulWidget { class _ChatDetailPageState extends State { final _messageController = TextEditingController(); + final _scrollController = ScrollController(); @override void dispose() { _messageController.dispose(); + _scrollController.dispose(); super.dispose(); } - void _sendMessage() { - if (_messageController.text.trim().isEmpty) return; - _messageController.clear(); - } - @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(widget.chatTitle), + title: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(widget.chat.type == 'favorites' ? AppLocalizations.of(context)!.favorites : widget.chat.title), + if (widget.chat.type != 'favorites') + Text( + AppLocalizations.of(context)!.connected, + style: const TextStyle(fontSize: 12, fontWeight: FontWeight.normal), + ), + ], + ), + actions: [ + IconButton(icon: const Icon(Icons.more_vert), onPressed: () {}), + ], ), - body: const Center(child: Text('Chat Detail')), - bottomNavigationBar: _MessageInput( - controller: _messageController, - onSend: _sendMessage, + body: Column( + children: [ + Expanded( + child: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + chatSelected: (_, messages) => _buildMessageList(messages), + messagesLoaded: (messages) => _buildMessageList(messages), + loading: () => const Center(child: CircularProgressIndicator()), + error: (msg) => Center(child: Text('Ошибка: $msg')), + orElse: () => const Center(child: Text('Начните общение')), + ); + }, + ), + ), + _buildMessageInput(), + ], ), ); } -} -class _MessageInput extends StatelessWidget { - final TextEditingController controller; - final VoidCallback onSend; + Widget _buildMessageList(List messages) { + if (messages.isEmpty) { + return const Center(child: Text('Сообщений пока нет')); + } - const _MessageInput({ - required this.controller, - required this.onSend, - }); + return ListView.builder( + controller: _scrollController, + reverse: true, + padding: const EdgeInsets.all(16), + itemCount: messages.length, + itemBuilder: (context, index) { + final message = messages[index]; + final isMe = message.senderId == widget.currentUserId; + + return Align( + alignment: isMe ? Alignment.centerRight : Alignment.centerLeft, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 4), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: isMe ? Theme.of(context).primaryColor : Colors.grey[200], + borderRadius: BorderRadius.circular(16).copyWith( + bottomRight: isMe ? const Radius.circular(0) : const Radius.circular(16), + bottomLeft: !isMe ? const Radius.circular(0) : const Radius.circular(16), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + message.content, + style: TextStyle(color: isMe ? Colors.white : Colors.black87), + ), + const SizedBox(height: 4), + if (message.createdAt != null) + Text( + DateFormat.Hm().format(message.createdAt!), + style: TextStyle( + fontSize: 10, + color: isMe ? Colors.white70 : Colors.black45, + ), + ), + ], + ), + ), + ); + }, + ); + } - @override - Widget build(BuildContext context) { + Widget _buildMessageInput() { return Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( - color: Colors.black.withOpacity(0.1), + color: Colors.black.withOpacity(0.05), + offset: const Offset(0, -1), blurRadius: 4, - offset: const Offset(0, -2), ), ], ), - child: Row( - children: [ - IconButton( - icon: const Icon(Icons.attach_file), - onPressed: () {}, - ), - Expanded( - child: TextField( - controller: controller, - decoration: InputDecoration( - hintText: 'Сообщение', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(24), - borderSide: BorderSide.none, - ), - filled: true, - fillColor: Colors.grey[200], - contentPadding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8, + child: SafeArea( + child: Row( + children: [ + IconButton(icon: const Icon(Icons.add), onPressed: () {}), + Expanded( + child: TextField( + controller: _messageController, + decoration: const InputDecoration( + hintText: 'Сообщение', + border: InputBorder.none, ), + onSubmitted: (_) => _sendMessage(), ), - maxLines: null, - onSubmitted: (_) => onSend(), ), - ), - const SizedBox(width: 8), - IconButton( - icon: const Icon(Icons.send), - color: Theme.of(context).primaryColor, - onPressed: onSend, - ), - ], + IconButton( + icon: const Icon(Icons.send), + onPressed: _sendMessage, + color: Theme.of(context).primaryColor, + ), + ], + ), ), ); } + + void _sendMessage() { + final content = _messageController.text.trim(); + if (content.isNotEmpty) { + context.read().add(ChatEvent.messageSent(widget.chat.id, content)); + _messageController.clear(); + } + } } diff --git a/client-mobile/lib/features/chat/presentation/pages/chats_page.dart b/client-mobile/lib/features/chat/presentation/pages/chats_page.dart index d0421b8..d65f16b 100644 --- a/client-mobile/lib/features/chat/presentation/pages/chats_page.dart +++ b/client-mobile/lib/features/chat/presentation/pages/chats_page.dart @@ -1,35 +1,169 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../bloc/chat_bloc.dart'; -import '../bloc/chat_state.dart'; +import 'package:intl/intl.dart'; +import 'package:messenger_app/features/chat/presentation/bloc/chat_bloc.dart'; +import 'package:messenger_app/features/chat/presentation/bloc/chat_event.dart'; +import 'package:messenger_app/features/chat/presentation/bloc/chat_state.dart'; +import 'package:messenger_app/features/auth/presentation/bloc/auth_bloc.dart'; +import 'package:messenger_app/features/auth/presentation/bloc/auth_state.dart'; +import 'package:messenger_app/features/chat/domain/entities/chat.dart'; +import 'package:messenger_app/l10n/app_localizations.dart'; +import 'chat_detail_page.dart'; -class ChatsPage extends StatelessWidget { +class ChatsPage extends StatefulWidget { const ChatsPage({super.key}); + @override + State createState() => _ChatsPageState(); +} + +class _ChatsPageState extends State { + @override + void initState() { + super.initState(); + final authState = context.read().state; + final userId = authState.maybeWhen( + authenticated: (id) => id, + orElse: () => null, + ); + context.read().add(ChatEvent.chatsLoaded(currentUserId: userId)); + } + @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - return state.when( - initial: () => const Center(child: CircularProgressIndicator()), - loading: () => const Center(child: CircularProgressIndicator()), - chatsLoaded: (_) => const Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.chat_bubble_outline, size: 64, color: Colors.grey), - SizedBox(height: 16), - Text('У вас пока нет чатов'), - ], - ), + final l10n = AppLocalizations.of(context)!; + return Scaffold( + appBar: AppBar( + title: Text(l10n.chats), + actions: [ + IconButton( + icon: const Icon(Icons.bookmark_border), + onPressed: () { + context.read().add(const ChatEvent.favoritesRequested()); + }, ), - chatSelected: (_, __) => const Center(child: Text('Chat selected')), - messagesLoaded: (_) => const Center(child: Text('Messages loaded')), - messageSent: () => const Center(child: Text('Message sent')), - error: (message) => Center(child: Text('Ошибка: $message')), + ], + ), + body: BlocConsumer( + listener: (context, state) { + state.whenOrNull( + chatSelected: (chat, _) { + final authState = context.read().state; + final userId = authState.maybeWhen( + authenticated: (id) => id, + orElse: () => '', + ); + + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => ChatDetailPage( + chat: chat, + currentUserId: userId, + ), + ), + ).then((_) { + // Reload chats when returning from detail page + if (context.mounted) { + context.read().add(ChatEvent.chatsLoaded(currentUserId: userId)); + } + }); + }, + ); + }, + builder: (context, state) { + return state.maybeWhen( + loading: () => const Center(child: CircularProgressIndicator()), + chatsLoaded: (chats) => _buildChatList(chats, l10n), + error: (message) => Center(child: Text('${l10n.error}: $message')), + orElse: () => const Center(child: CircularProgressIndicator()), + ); + }, + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + // TODO: Open contact list to create chat + }, + child: const Icon(Icons.edit), + ), + ); + } + + Widget _buildChatList(List chats, AppLocalizations l10n) { + if (chats.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.chat_bubble_outline, size: 64, color: Colors.grey), + const SizedBox(height: 16), + Text(l10n.noChats), + const SizedBox(height: 8), + TextButton( + onPressed: () { + final authState = context.read().state; + final userId = authState.maybeWhen( + authenticated: (id) => id, + orElse: () => null, + ); + context.read().add(ChatEvent.chatsLoaded(currentUserId: userId)); + }, + child: Text(l10n.retry), + ), + ], + ), + ); + } + + return ListView.separated( + itemCount: chats.length, + separatorBuilder: (context, index) => const Divider(height: 1), + itemBuilder: (context, index) { + final chat = chats[index]; + return ListTile( + leading: CircleAvatar( + backgroundImage: chat.avatarUrl != null ? NetworkImage(chat.avatarUrl!) : null, + child: chat.avatarUrl == null + ? Text(chat.title.isNotEmpty ? chat.title[0].toUpperCase() : '?') + : null, + ), + title: Text( + chat.type == 'favorites' ? l10n.favorites : chat.title, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text( + chat.lastMessage?.content ?? l10n.noChats, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + trailing: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + if (chat.lastMessageTime != null) + Text( + DateFormat.Hm().format(chat.lastMessageTime!), + style: const TextStyle(fontSize: 12, color: Colors.grey), + ), + const SizedBox(height: 4), + if (chat.unreadCount > 0) + Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(10), + ), + child: Text( + chat.unreadCount.toString(), + style: const TextStyle(color: Colors.white, fontSize: 10), + ), + ), + ], + ), + onTap: () { + context.read().add(ChatEvent.chatSelected(chat.id)); + }, ); }, ); } } - diff --git a/client-mobile/lib/internal/di/injection_container.dart b/client-mobile/lib/internal/di/injection_container.dart index 5144383..5ea083f 100644 --- a/client-mobile/lib/internal/di/injection_container.dart +++ b/client-mobile/lib/internal/di/injection_container.dart @@ -10,6 +10,14 @@ import '../../features/auth/data/datasources/auth_remote_datasource_impl.dart'; import '../../features/auth/data/repositories/auth_repository_impl.dart'; import '../../features/auth/domain/repositories/auth_repository.dart'; import '../../features/auth/presentation/bloc/auth_bloc.dart'; +import '../../core/database/database_service.dart'; +import '../../core/network/signalr_service.dart'; +import '../../features/chat/data/datasources/chat_local_datasource.dart'; +import '../../features/chat/data/datasources/chat_local_datasource_impl.dart'; +import '../../features/chat/data/datasources/chat_remote_datasource.dart'; +import '../../features/chat/data/datasources/chat_remote_datasource_impl.dart'; +import '../../features/chat/data/repositories/chat_repository_impl.dart'; +import '../../features/chat/domain/repositories/chat_repository.dart'; import '../../features/chat/presentation/bloc/chat_bloc.dart'; import '../../features/settings/data/datasources/settings_local_datasource.dart'; import '../../features/settings/data/datasources/settings_remote_datasource.dart'; @@ -40,16 +48,34 @@ Future initDependencies() async { apiUrl = apiUrl.substring(0, apiUrl.length - 4).replaceAll(RegExp(r'/+$'), ''); } - return Dio(BaseOptions( + final dio = Dio(BaseOptions( baseUrl: apiUrl, connectTimeout: const Duration(seconds: 30), receiveTimeout: const Duration(seconds: 30), )); + + dio.interceptors.add(InterceptorsWrapper( + onRequest: (options, handler) { + final token = prefs.getString('access_token'); + if (token != null) { + options.headers['Authorization'] = 'Bearer $token'; + } + return handler.next(options); + }, + )); + + return dio; }); // Core - API Client sl.registerLazySingleton(() => ApiClient(sl())); + // Core - Database & SignalR + final dbService = DatabaseService(); + await dbService.init(); + sl.registerSingleton(dbService); + sl.registerLazySingleton(() => SignalRService(sl())); + // Settings sl.registerLazySingleton( () => SettingsRemoteDataSourceImpl(sl()), @@ -75,5 +101,18 @@ Future initDependencies() async { sl.registerFactory(() => AuthBloc(authRepository: sl())); // Chat - sl.registerFactory(() => ChatBloc()); + sl.registerLazySingleton( + () => ChatLocalDataSourceImpl(sl().isar), + ); + sl.registerLazySingleton( + () => ChatRemoteDataSourceImpl(sl()), + ); + sl.registerLazySingleton( + () => ChatRepositoryImpl( + remoteDataSource: sl(), + localDataSource: sl(), + signalRService: sl(), + ), + ); + sl.registerFactory(() => ChatBloc(chatRepository: sl())); } diff --git a/client-mobile/lib/internal/router/chats_placeholder.dart b/client-mobile/lib/internal/router/chats_placeholder.dart deleted file mode 100644 index c47b4ce..0000000 --- a/client-mobile/lib/internal/router/chats_placeholder.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:flutter/material.dart'; - -class ChatsPage extends StatelessWidget { - const ChatsPage({super.key}); - - @override - Widget build(BuildContext context) { - return const Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.chat_bubble_outline, size: 64, color: Colors.grey), - SizedBox(height: 16), - Text('Чаты', style: TextStyle(fontSize: 18)), - SizedBox(height: 8), - Text('Функция в разработке', style: TextStyle(color: Colors.grey)), - ], - ), - ); - } -} diff --git a/client-mobile/lib/internal/router/main_screen.dart b/client-mobile/lib/internal/router/main_screen.dart index b347e36..67e5354 100644 --- a/client-mobile/lib/internal/router/main_screen.dart +++ b/client-mobile/lib/internal/router/main_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import '../../features/settings/presentation/pages/settings_page.dart'; -import '../router/chats_placeholder.dart'; +import '../../features/chat/presentation/pages/chats_page.dart'; +import '../../l10n/app_localizations.dart'; class MainScreen extends StatefulWidget { static const String routeName = '/main'; @@ -16,6 +17,7 @@ class _MainScreenState extends State { @override Widget build(BuildContext context) { + final l10n = AppLocalizations.of(context)!; return Scaffold( body: IndexedStack( index: _currentIndex, @@ -29,21 +31,21 @@ class _MainScreenState extends State { currentIndex: _currentIndex, onTap: (index) => setState(() => _currentIndex = index), type: BottomNavigationBarType.fixed, - items: const [ + items: [ BottomNavigationBarItem( - icon: Icon(Icons.chat_bubble_outline), - activeIcon: Icon(Icons.chat_bubble), - label: 'Чаты', + icon: const Icon(Icons.chat_bubble_outline), + activeIcon: const Icon(Icons.chat_bubble), + label: l10n.chats, ), BottomNavigationBarItem( - icon: Icon(Icons.contacts_outlined), - activeIcon: Icon(Icons.contacts), - label: 'Контакты', + icon: const Icon(Icons.contacts_outlined), + activeIcon: const Icon(Icons.contacts), + label: l10n.contacts, ), BottomNavigationBarItem( - icon: Icon(Icons.settings_outlined), - activeIcon: Icon(Icons.settings), - label: 'Настройки', + icon: const Icon(Icons.settings_outlined), + activeIcon: const Icon(Icons.settings), + label: l10n.settings, ), ], ), diff --git a/client-mobile/lib/l10n/app_localizations.dart b/client-mobile/lib/l10n/app_localizations.dart index 8f57402..b3c26e7 100644 --- a/client-mobile/lib/l10n/app_localizations.dart +++ b/client-mobile/lib/l10n/app_localizations.dart @@ -110,6 +110,12 @@ abstract class AppLocalizations { /// **'Чаты'** String get chats; + /// No description provided for @favorites. + /// + /// In ru, this message translates to: + /// **'Избранное'** + String get favorites; + /// No description provided for @contacts. /// /// In ru, this message translates to: diff --git a/client-mobile/lib/l10n/app_localizations_en.dart b/client-mobile/lib/l10n/app_localizations_en.dart index e0458b9..dfd6213 100644 --- a/client-mobile/lib/l10n/app_localizations_en.dart +++ b/client-mobile/lib/l10n/app_localizations_en.dart @@ -14,6 +14,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get chats => 'Chats'; + @override + String get favorites => 'Favorites'; + @override String get contacts => 'Contacts'; diff --git a/client-mobile/lib/l10n/app_localizations_ru.dart b/client-mobile/lib/l10n/app_localizations_ru.dart index 9d3ec37..df308bf 100644 --- a/client-mobile/lib/l10n/app_localizations_ru.dart +++ b/client-mobile/lib/l10n/app_localizations_ru.dart @@ -14,6 +14,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get chats => 'Чаты'; + @override + String get favorites => 'Избранное'; + @override String get contacts => 'Контакты';