Merge remote-tracking branch 'origin/develop' into feat/localization
# Conflicts: # packages/stream_chat_flutter/lib/src/message_text.dart
This commit is contained in:
@@ -1,5 +1,14 @@
|
|||||||
## Upcoming
|
## Upcoming
|
||||||
|
|
||||||
|
🛑️ Removed
|
||||||
|
|
||||||
|
- The `MessageTranslation` class has been removed. Use the new `i18n` field in the `Message` class instead.
|
||||||
|
|
||||||
|
✅ Added
|
||||||
|
|
||||||
|
- The `Message` class now has an `i18n` field for translations
|
||||||
|
- The `User` class now has a `language` field for the user's language preference.
|
||||||
|
|
||||||
🔄 Changed
|
🔄 Changed
|
||||||
|
|
||||||
- `client.user` is now deprecated in favor of `client.currentUser`.
|
- `client.user` is now deprecated in favor of `client.currentUser`.
|
||||||
|
|||||||
@@ -318,17 +318,15 @@ class StreamChatClient {
|
|||||||
final ownUser = OwnUser.fromUser(user);
|
final ownUser = OwnUser.fromUser(user);
|
||||||
state.currentUser = ownUser;
|
state.currentUser = ownUser;
|
||||||
|
|
||||||
if (!connectWebSocket) {
|
if (!connectWebSocket) return ownUser;
|
||||||
return ownUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (_originalChatPersistenceClient != null) {
|
if (_originalChatPersistenceClient != null) {
|
||||||
_chatPersistenceClient = _originalChatPersistenceClient;
|
_chatPersistenceClient = _originalChatPersistenceClient;
|
||||||
await _chatPersistenceClient!.connect(ownUser.id);
|
await _chatPersistenceClient!.connect(ownUser.id);
|
||||||
}
|
}
|
||||||
final res = await openConnection();
|
final connectedUser = await openConnection();
|
||||||
return res;
|
return state.currentUser = connectedUser;
|
||||||
} catch (e, stk) {
|
} catch (e, stk) {
|
||||||
if (e is StreamWebSocketError && e.isRetriable) {
|
if (e is StreamWebSocketError && e.isRetriable) {
|
||||||
final event = await _chatPersistenceClient?.getConnectionInfo();
|
final event = await _chatPersistenceClient?.getConnectionInfo();
|
||||||
@@ -396,9 +394,6 @@ class StreamChatClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleHealthCheckEvent(Event event) {
|
void _handleHealthCheckEvent(Event event) {
|
||||||
final user = event.me;
|
|
||||||
if (user != null) state.currentUser = user;
|
|
||||||
|
|
||||||
final connectionId = event.connectionId;
|
final connectionId = event.connectionId;
|
||||||
if (connectionId != null) {
|
if (connectionId != null) {
|
||||||
_connectionIdManager.setConnectionId(connectionId);
|
_connectionIdManager.setConnectionId(connectionId);
|
||||||
@@ -1339,22 +1334,6 @@ class ClientState {
|
|||||||
/// Creates a new instance listening to events and updating the state
|
/// Creates a new instance listening to events and updating the state
|
||||||
ClientState(this._client) {
|
ClientState(this._client) {
|
||||||
_subscriptions.addAll([
|
_subscriptions.addAll([
|
||||||
_client
|
|
||||||
.on()
|
|
||||||
.where((event) => event.me != null)
|
|
||||||
.map((e) => e.me)
|
|
||||||
.listen((user) {
|
|
||||||
_currentUserController.add(user);
|
|
||||||
final totalUnreadCount = user?.totalUnreadCount;
|
|
||||||
if (totalUnreadCount != null) {
|
|
||||||
_totalUnreadCountController.add(totalUnreadCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
final unreadChannels = user?.unreadChannels;
|
|
||||||
if (unreadChannels != null) {
|
|
||||||
_unreadChannelsController.add(unreadChannels);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
_client
|
_client
|
||||||
.on()
|
.on()
|
||||||
.map((event) => event.unreadChannels)
|
.map((event) => event.unreadChannels)
|
||||||
@@ -1417,7 +1396,8 @@ class ClientState {
|
|||||||
|
|
||||||
final StreamChatClient _client;
|
final StreamChatClient _client;
|
||||||
|
|
||||||
/// Update user information
|
/// Sets the user currently interacting with the client
|
||||||
|
/// note: this fully overrides the [currentUser]
|
||||||
set currentUser(OwnUser? user) {
|
set currentUser(OwnUser? user) {
|
||||||
_currentUserController.add(user);
|
_currentUserController.add(user);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class QueryChannelsResponse extends _BaseResponse {
|
|||||||
@JsonSerializable(createToJson: false)
|
@JsonSerializable(createToJson: false)
|
||||||
class TranslateMessageResponse extends _BaseResponse {
|
class TranslateMessageResponse extends _BaseResponse {
|
||||||
/// Translated message
|
/// Translated message
|
||||||
late TranslatedMessage message;
|
late Message message;
|
||||||
|
|
||||||
/// Create a new instance from a json
|
/// Create a new instance from a json
|
||||||
static TranslateMessageResponse fromJson(Map<String, dynamic> json) =>
|
static TranslateMessageResponse fromJson(Map<String, dynamic> json) =>
|
||||||
|
|||||||
@@ -47,8 +47,7 @@ TranslateMessageResponse _$TranslateMessageResponseFromJson(
|
|||||||
Map<String, dynamic> json) {
|
Map<String, dynamic> json) {
|
||||||
return TranslateMessageResponse()
|
return TranslateMessageResponse()
|
||||||
..duration = json['duration'] as String?
|
..duration = json['duration'] as String?
|
||||||
..message =
|
..message = Message.fromJson(json['message'] as Map<String, dynamic>);
|
||||||
TranslatedMessage.fromJson(json['message'] as Map<String, dynamic>);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryMembersResponse _$QueryMembersResponseFromJson(Map<String, dynamic> json) {
|
QueryMembersResponse _$QueryMembersResponseFromJson(Map<String, dynamic> json) {
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import 'package:equatable/equatable.dart';
|
|||||||
import 'package:json_annotation/json_annotation.dart';
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
import 'package:stream_chat/src/core/models/attachment.dart';
|
import 'package:stream_chat/src/core/models/attachment.dart';
|
||||||
import 'package:stream_chat/src/core/models/reaction.dart';
|
import 'package:stream_chat/src/core/models/reaction.dart';
|
||||||
import 'package:stream_chat/src/core/util/serializer.dart';
|
|
||||||
import 'package:stream_chat/src/core/models/user.dart';
|
import 'package:stream_chat/src/core/models/user.dart';
|
||||||
|
import 'package:stream_chat/src/core/util/serializer.dart';
|
||||||
import 'package:uuid/uuid.dart';
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
part 'message.g.dart';
|
part 'message.g.dart';
|
||||||
@@ -73,6 +73,7 @@ class Message extends Equatable {
|
|||||||
this.extraData = const {},
|
this.extraData = const {},
|
||||||
this.deletedAt,
|
this.deletedAt,
|
||||||
this.status = MessageSendingStatus.sent,
|
this.status = MessageSendingStatus.sent,
|
||||||
|
this.i18n,
|
||||||
}) : id = id ?? const Uuid().v4(),
|
}) : id = id ?? const Uuid().v4(),
|
||||||
pinExpires = pinExpires?.toUtc(),
|
pinExpires = pinExpires?.toUtc(),
|
||||||
createdAt = createdAt ?? DateTime.now(),
|
createdAt = createdAt ?? DateTime.now(),
|
||||||
@@ -218,6 +219,10 @@ class Message extends Equatable {
|
|||||||
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
|
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
|
||||||
final DateTime? deletedAt;
|
final DateTime? deletedAt;
|
||||||
|
|
||||||
|
/// A Map of translations.
|
||||||
|
@JsonKey(includeIfNull: false)
|
||||||
|
final Map<String, String>? i18n;
|
||||||
|
|
||||||
/// Known top level fields.
|
/// Known top level fields.
|
||||||
/// Useful for [Serializer] methods.
|
/// Useful for [Serializer] methods.
|
||||||
static const topLevelFields = [
|
static const topLevelFields = [
|
||||||
@@ -248,6 +253,7 @@ class Message extends Equatable {
|
|||||||
'pinned_at',
|
'pinned_at',
|
||||||
'pin_expires',
|
'pin_expires',
|
||||||
'pinned_by',
|
'pinned_by',
|
||||||
|
'i18n',
|
||||||
];
|
];
|
||||||
|
|
||||||
/// Serialize to json
|
/// Serialize to json
|
||||||
@@ -285,6 +291,7 @@ class Message extends Equatable {
|
|||||||
User? pinnedBy,
|
User? pinnedBy,
|
||||||
Map<String, Object?>? extraData,
|
Map<String, Object?>? extraData,
|
||||||
MessageSendingStatus? status,
|
MessageSendingStatus? status,
|
||||||
|
Map<String, String>? i18n,
|
||||||
}) {
|
}) {
|
||||||
assert(() {
|
assert(() {
|
||||||
if (pinExpires is! DateTime &&
|
if (pinExpires is! DateTime &&
|
||||||
@@ -324,6 +331,7 @@ class Message extends Equatable {
|
|||||||
pinnedBy: pinnedBy ?? this.pinnedBy,
|
pinnedBy: pinnedBy ?? this.pinnedBy,
|
||||||
pinExpires:
|
pinExpires:
|
||||||
pinExpires == _pinExpires ? this.pinExpires : pinExpires as DateTime?,
|
pinExpires == _pinExpires ? this.pinExpires : pinExpires as DateTime?,
|
||||||
|
i18n: i18n ?? this.i18n,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,6 +366,7 @@ class Message extends Equatable {
|
|||||||
pinnedAt: other.pinnedAt,
|
pinnedAt: other.pinnedAt,
|
||||||
pinExpires: other.pinExpires,
|
pinExpires: other.pinExpires,
|
||||||
pinnedBy: other.pinnedBy,
|
pinnedBy: other.pinnedBy,
|
||||||
|
i18n: other.i18n,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -390,35 +399,6 @@ class Message extends Equatable {
|
|||||||
pinnedBy,
|
pinnedBy,
|
||||||
extraData,
|
extraData,
|
||||||
status,
|
status,
|
||||||
|
i18n,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A translated message
|
|
||||||
/// It has an additional property called [i18n]
|
|
||||||
@JsonSerializable()
|
|
||||||
class TranslatedMessage extends Message {
|
|
||||||
/// Constructor used for json serialization
|
|
||||||
TranslatedMessage(this.i18n) : super();
|
|
||||||
|
|
||||||
/// Create a new instance from a json
|
|
||||||
factory TranslatedMessage.fromJson(Map<String, dynamic> json) =>
|
|
||||||
_$TranslatedMessageFromJson(
|
|
||||||
Serializer.moveToExtraDataFromRoot(json, topLevelFields),
|
|
||||||
);
|
|
||||||
|
|
||||||
/// A Map of
|
|
||||||
final Map<String, String>? i18n;
|
|
||||||
|
|
||||||
/// Known top level fields.
|
|
||||||
/// Useful for [Serializer] methods.
|
|
||||||
static final topLevelFields = [
|
|
||||||
'i18n',
|
|
||||||
...Message.topLevelFields,
|
|
||||||
];
|
|
||||||
|
|
||||||
/// Serialize to json
|
|
||||||
@override
|
|
||||||
Map<String, dynamic> toJson() => Serializer.moveFromExtraDataToRoot(
|
|
||||||
_$TranslatedMessageToJson(this),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ Message _$MessageFromJson(Map<String, dynamic> json) {
|
|||||||
deletedAt: json['deleted_at'] == null
|
deletedAt: json['deleted_at'] == null
|
||||||
? null
|
? null
|
||||||
: DateTime.parse(json['deleted_at'] as String),
|
: DateTime.parse(json['deleted_at'] as String),
|
||||||
|
i18n: (json['i18n'] as Map<String, dynamic>?)?.map(
|
||||||
|
(k, e) => MapEntry(k, e as String),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,18 +110,6 @@ Map<String, dynamic> _$MessageToJson(Message instance) {
|
|||||||
val['pinned_by'] = readonly(instance.pinnedBy);
|
val['pinned_by'] = readonly(instance.pinnedBy);
|
||||||
val['extra_data'] = instance.extraData;
|
val['extra_data'] = instance.extraData;
|
||||||
writeNotNull('deleted_at', readonly(instance.deletedAt));
|
writeNotNull('deleted_at', readonly(instance.deletedAt));
|
||||||
|
writeNotNull('i18n', instance.i18n);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
TranslatedMessage _$TranslatedMessageFromJson(Map<String, dynamic> json) {
|
|
||||||
return TranslatedMessage(
|
|
||||||
(json['i18n'] as Map<String, dynamic>?)?.map(
|
|
||||||
(k, e) => MapEntry(k, e as String),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> _$TranslatedMessageToJson(TranslatedMessage instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'i18n': instance.i18n,
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class OwnUser extends User {
|
|||||||
Map<String, Object?> extraData = const {},
|
Map<String, Object?> extraData = const {},
|
||||||
bool banned = false,
|
bool banned = false,
|
||||||
List<String> teams = const [],
|
List<String> teams = const [],
|
||||||
|
String? language,
|
||||||
}) : super(
|
}) : super(
|
||||||
id: id,
|
id: id,
|
||||||
role: role,
|
role: role,
|
||||||
@@ -37,6 +38,7 @@ class OwnUser extends User {
|
|||||||
extraData: extraData,
|
extraData: extraData,
|
||||||
banned: banned,
|
banned: banned,
|
||||||
teams: teams,
|
teams: teams,
|
||||||
|
language: language,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Create a new instance from a json
|
/// Create a new instance from a json
|
||||||
@@ -54,6 +56,7 @@ class OwnUser extends User {
|
|||||||
banned: user.banned,
|
banned: user.banned,
|
||||||
extraData: user.extraData,
|
extraData: user.extraData,
|
||||||
teams: user.teams,
|
teams: user.teams,
|
||||||
|
language: user.language,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Creates a copy of [OwnUser] with specified attributes overridden.
|
/// Creates a copy of [OwnUser] with specified attributes overridden.
|
||||||
@@ -73,6 +76,7 @@ class OwnUser extends User {
|
|||||||
List<Mute>? mutes,
|
List<Mute>? mutes,
|
||||||
int? totalUnreadCount,
|
int? totalUnreadCount,
|
||||||
int? unreadChannels,
|
int? unreadChannels,
|
||||||
|
String? language,
|
||||||
}) =>
|
}) =>
|
||||||
OwnUser(
|
OwnUser(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@@ -89,15 +93,13 @@ class OwnUser extends User {
|
|||||||
mutes: mutes ?? this.mutes,
|
mutes: mutes ?? this.mutes,
|
||||||
totalUnreadCount: totalUnreadCount ?? this.totalUnreadCount,
|
totalUnreadCount: totalUnreadCount ?? this.totalUnreadCount,
|
||||||
unreadChannels: unreadChannels ?? this.unreadChannels,
|
unreadChannels: unreadChannels ?? this.unreadChannels,
|
||||||
|
language: language ?? this.language,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Returns a new [OwnUser] that is a combination of this ownUser
|
/// Returns a new [OwnUser] that is a combination of this ownUser
|
||||||
/// and the given [other] ownUser.
|
/// and the given [other] ownUser.
|
||||||
OwnUser merge(OwnUser? other) {
|
OwnUser merge(OwnUser? other) {
|
||||||
if (other == null) {
|
if (other == null) return this;
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
return copyWith(
|
return copyWith(
|
||||||
banned: other.banned,
|
banned: other.banned,
|
||||||
channelMutes: other.channelMutes,
|
channelMutes: other.channelMutes,
|
||||||
@@ -113,6 +115,7 @@ class OwnUser extends User {
|
|||||||
totalUnreadCount: other.totalUnreadCount,
|
totalUnreadCount: other.totalUnreadCount,
|
||||||
unreadChannels: other.unreadChannels,
|
unreadChannels: other.unreadChannels,
|
||||||
updatedAt: other.updatedAt,
|
updatedAt: other.updatedAt,
|
||||||
|
language: other.language,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,5 +36,9 @@ OwnUser _$OwnUserFromJson(Map<String, dynamic> json) {
|
|||||||
online: json['online'] as bool? ?? false,
|
online: json['online'] as bool? ?? false,
|
||||||
extraData: json['extra_data'] as Map<String, dynamic>? ?? {},
|
extraData: json['extra_data'] as Map<String, dynamic>? ?? {},
|
||||||
banned: json['banned'] as bool? ?? false,
|
banned: json['banned'] as bool? ?? false,
|
||||||
|
teams:
|
||||||
|
(json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||||
|
[],
|
||||||
|
language: json['language'] as String?,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class User extends Equatable {
|
|||||||
this.extraData = const {},
|
this.extraData = const {},
|
||||||
this.banned = false,
|
this.banned = false,
|
||||||
this.teams = const [],
|
this.teams = const [],
|
||||||
|
this.language,
|
||||||
}) : createdAt = createdAt ?? DateTime.now(),
|
}) : createdAt = createdAt ?? DateTime.now(),
|
||||||
updatedAt = updatedAt ?? DateTime.now();
|
updatedAt = updatedAt ?? DateTime.now();
|
||||||
|
|
||||||
@@ -36,6 +37,7 @@ class User extends Equatable {
|
|||||||
'online',
|
'online',
|
||||||
'banned',
|
'banned',
|
||||||
'teams',
|
'teams',
|
||||||
|
'language',
|
||||||
];
|
];
|
||||||
|
|
||||||
/// User id
|
/// User id
|
||||||
@@ -82,8 +84,11 @@ class User extends Equatable {
|
|||||||
)
|
)
|
||||||
final Map<String, Object?> extraData;
|
final Map<String, Object?> extraData;
|
||||||
|
|
||||||
@override
|
/// The language this user prefers.
|
||||||
int get hashCode => id.hashCode;
|
///
|
||||||
|
/// Defaults to 'en'.
|
||||||
|
@JsonKey(includeIfNull: false)
|
||||||
|
final String? language;
|
||||||
|
|
||||||
/// Shortcut for user name
|
/// Shortcut for user name
|
||||||
String get name {
|
String get name {
|
||||||
@@ -98,11 +103,6 @@ class User extends Equatable {
|
|||||||
static List<String>? toIds(List<User>? users) =>
|
static List<String>? toIds(List<User>? users) =>
|
||||||
users?.map((u) => u.id).toList();
|
users?.map((u) => u.id).toList();
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) =>
|
|
||||||
identical(this, other) ||
|
|
||||||
other is User && runtimeType == other.runtimeType && id == other.id;
|
|
||||||
|
|
||||||
/// Serialize to json
|
/// Serialize to json
|
||||||
Map<String, dynamic> toJson() => Serializer.moveFromExtraDataToRoot(
|
Map<String, dynamic> toJson() => Serializer.moveFromExtraDataToRoot(
|
||||||
_$UserToJson(this),
|
_$UserToJson(this),
|
||||||
@@ -119,6 +119,7 @@ class User extends Equatable {
|
|||||||
Map<String, Object?>? extraData,
|
Map<String, Object?>? extraData,
|
||||||
bool? banned,
|
bool? banned,
|
||||||
List<String>? teams,
|
List<String>? teams,
|
||||||
|
String? language,
|
||||||
}) =>
|
}) =>
|
||||||
User(
|
User(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@@ -130,18 +131,9 @@ class User extends Equatable {
|
|||||||
extraData: extraData ?? this.extraData,
|
extraData: extraData ?? this.extraData,
|
||||||
banned: banned ?? this.banned,
|
banned: banned ?? this.banned,
|
||||||
teams: teams ?? this.teams,
|
teams: teams ?? this.teams,
|
||||||
|
language: language ?? this.language,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [id];
|
||||||
id,
|
|
||||||
role,
|
|
||||||
teams,
|
|
||||||
createdAt,
|
|
||||||
updatedAt,
|
|
||||||
lastActive,
|
|
||||||
online,
|
|
||||||
banned,
|
|
||||||
extraData,
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ User _$UserFromJson(Map<String, dynamic> json) {
|
|||||||
teams:
|
teams:
|
||||||
(json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
(json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||||
[],
|
[],
|
||||||
|
language: json['language'] as String?,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,5 +48,6 @@ Map<String, dynamic> _$UserToJson(User instance) {
|
|||||||
writeNotNull('online', readonly(instance.online));
|
writeNotNull('online', readonly(instance.online));
|
||||||
writeNotNull('banned', readonly(instance.banned));
|
writeNotNull('banned', readonly(instance.banned));
|
||||||
val['extra_data'] = instance.extraData;
|
val['extra_data'] = instance.extraData;
|
||||||
|
writeNotNull('language', instance.language);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"id": "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e",
|
"id": "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e",
|
||||||
"role": "test-role",
|
"role": "test-role",
|
||||||
"name": "John"
|
"name": "John",
|
||||||
|
"language": "en"
|
||||||
}
|
}
|
||||||
@@ -1610,9 +1610,12 @@ void main() {
|
|||||||
const messageId = 'test-message-id';
|
const messageId = 'test-message-id';
|
||||||
const language = 'hi'; // Hindi
|
const language = 'hi'; // Hindi
|
||||||
const translatedMessageText = 'नमस्ते';
|
const translatedMessageText = 'नमस्ते';
|
||||||
final translatedMessage = TranslatedMessage(const {
|
|
||||||
language: translatedMessageText,
|
final translatedMessage = Message(
|
||||||
});
|
i18n: const {
|
||||||
|
language: translatedMessageText,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
when(() => client.translateMessage(messageId, language)).thenAnswer(
|
when(() => client.translateMessage(messageId, language)).thenAnswer(
|
||||||
(_) async => TranslateMessageResponse()..message = translatedMessage,
|
(_) async => TranslateMessageResponse()..message = translatedMessage,
|
||||||
|
|||||||
@@ -2109,9 +2109,11 @@ void main() {
|
|||||||
const messageId = 'test-message-id';
|
const messageId = 'test-message-id';
|
||||||
const language = 'hi'; // Hindi
|
const language = 'hi'; // Hindi
|
||||||
const translatedMessageText = 'नमस्ते';
|
const translatedMessageText = 'नमस्ते';
|
||||||
final translatedMessage = TranslatedMessage(const {
|
final translatedMessage = Message(
|
||||||
language: translatedMessageText,
|
i18n: const {
|
||||||
});
|
language: translatedMessageText,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
when(() => api.message.translateMessage(messageId, language)).thenAnswer(
|
when(() => api.message.translateMessage(messageId, language)).thenAnswer(
|
||||||
(_) async => TranslateMessageResponse()..message = translatedMessage,
|
(_) async => TranslateMessageResponse()..message = translatedMessage,
|
||||||
|
|||||||
@@ -371,9 +371,11 @@ void main() {
|
|||||||
final path = '/messages/${message.id}/translate';
|
final path = '/messages/${message.id}/translate';
|
||||||
|
|
||||||
const translatedMessageText = 'नमस्ते';
|
const translatedMessageText = 'नमस्ते';
|
||||||
final translatedMessage = TranslatedMessage(const {
|
final translatedMessage = Message(
|
||||||
language: translatedMessageText,
|
i18n: const {
|
||||||
});
|
language: translatedMessageText,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
when(() => client.post(
|
when(() => client.post(
|
||||||
path,
|
path,
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ void main() {
|
|||||||
expect(message.pinnedAt, null);
|
expect(message.pinnedAt, null);
|
||||||
expect(message.pinExpires, null);
|
expect(message.pinExpires, null);
|
||||||
expect(message.pinnedBy, null);
|
expect(message.pinnedBy, null);
|
||||||
|
expect(message.i18n, null);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should serialize to json correctly', () {
|
test('should serialize to json correctly', () {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ void main() {
|
|||||||
expect(newUser.id, user.id);
|
expect(newUser.id, user.id);
|
||||||
expect(newUser.role, user.role);
|
expect(newUser.role, user.role);
|
||||||
expect(newUser.name, user.name);
|
expect(newUser.name, user.name);
|
||||||
|
expect(newUser.language, user.language);
|
||||||
|
|
||||||
newUser = user.copyWith(
|
newUser = user.copyWith(
|
||||||
id: 'test',
|
id: 'test',
|
||||||
@@ -41,6 +42,7 @@ void main() {
|
|||||||
expect(newUser.id, 'test');
|
expect(newUser.id, 'test');
|
||||||
expect(newUser.role, 'test');
|
expect(newUser.role, 'test');
|
||||||
expect(newUser.name, 'test');
|
expect(newUser.name, 'test');
|
||||||
|
expect(newUser.language, 'en');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
✅ Added
|
✅ Added
|
||||||
|
|
||||||
- Added `MessageListView.paginationLimit`
|
- Added `MessageListView.paginationLimit`
|
||||||
|
- `MessageText` renders message translation if available
|
||||||
- Allow the various ListView widgets to be themed via ThemeData classes
|
- Allow the various ListView widgets to be themed via ThemeData classes
|
||||||
- Added `bottomRowBuilder` and `deletedBottomRowBuilder` that build a widget below a `MessageWidget`
|
- Added `bottomRowBuilder` and `deletedBottomRowBuilder` that build a widget below a `MessageWidget`
|
||||||
|
|
||||||
|
|||||||
@@ -29,55 +29,66 @@ class MessageText extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final text = _replaceMentions(message.text ?? '').replaceAll('\n', '\n\n');
|
final streamChat = StreamChat.of(context);
|
||||||
|
assert(streamChat.currentUser != null, '');
|
||||||
|
return BetterStreamBuilder<String>(
|
||||||
|
stream: streamChat.currentUserStream.map((it) => it!.language ?? 'en'),
|
||||||
|
initialData: streamChat.currentUser!.language ?? 'en',
|
||||||
|
builder: (context, language) {
|
||||||
|
final translatedText =
|
||||||
|
message.i18n?['${language}_text'] ?? message.text;
|
||||||
|
final messageText =
|
||||||
|
_replaceMentions(translatedText ?? '').replaceAll('\n', '\n\n');
|
||||||
|
final themeData = Theme.of(context);
|
||||||
|
return MarkdownBody(
|
||||||
|
data: messageText,
|
||||||
|
onTapLink: (
|
||||||
|
String link,
|
||||||
|
String? href,
|
||||||
|
String title,
|
||||||
|
) {
|
||||||
|
if (link.startsWith('@')) {
|
||||||
|
final mentionedUser = message.mentionedUsers.firstWhereOrNull(
|
||||||
|
(u) => '@${u.name}' == link,
|
||||||
|
);
|
||||||
|
|
||||||
final themeData = Theme.of(context);
|
if (mentionedUser == null) return;
|
||||||
return MarkdownBody(
|
|
||||||
data: text,
|
|
||||||
onTapLink: (
|
|
||||||
String link,
|
|
||||||
String? href,
|
|
||||||
String title,
|
|
||||||
) {
|
|
||||||
if (link.startsWith('@')) {
|
|
||||||
final mentionedUser = message.mentionedUsers.firstWhereOrNull(
|
|
||||||
(u) => '@${u.name}' == link,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (mentionedUser == null) return;
|
onMentionTap?.call(mentionedUser);
|
||||||
|
} else {
|
||||||
onMentionTap?.call(mentionedUser);
|
if (onLinkTap != null) {
|
||||||
} else {
|
onLinkTap!(link);
|
||||||
if (onLinkTap != null) {
|
} else {
|
||||||
onLinkTap!(link);
|
launchURL(context, link);
|
||||||
} else {
|
}
|
||||||
launchURL(context, link);
|
}
|
||||||
}
|
},
|
||||||
}
|
styleSheet: MarkdownStyleSheet.fromTheme(
|
||||||
},
|
themeData.copyWith(
|
||||||
styleSheet: MarkdownStyleSheet.fromTheme(
|
textTheme: themeData.textTheme.apply(
|
||||||
themeData.copyWith(
|
bodyColor: messageTheme.messageText?.color,
|
||||||
textTheme: themeData.textTheme.apply(
|
decoration: messageTheme.messageText?.decoration,
|
||||||
bodyColor: messageTheme.messageText?.color,
|
decorationColor: messageTheme.messageText?.decorationColor,
|
||||||
decoration: messageTheme.messageText?.decoration,
|
decorationStyle: messageTheme.messageText?.decorationStyle,
|
||||||
decorationColor: messageTheme.messageText?.decorationColor,
|
fontFamily: messageTheme.messageText?.fontFamily,
|
||||||
decorationStyle: messageTheme.messageText?.decorationStyle,
|
),
|
||||||
fontFamily: messageTheme.messageText?.fontFamily,
|
),
|
||||||
|
).copyWith(
|
||||||
|
a: messageTheme.messageLinks,
|
||||||
|
p: messageTheme.messageText,
|
||||||
),
|
),
|
||||||
),
|
);
|
||||||
).copyWith(
|
},
|
||||||
a: messageTheme.messageLinks,
|
|
||||||
p: messageTheme.messageText,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _replaceMentions(String text) {
|
String _replaceMentions(String text) {
|
||||||
message.mentionedUsers.map((u) => u.name).toSet().forEach((userName) {
|
var messageTextToRender = text;
|
||||||
// ignore: parameter_assignments
|
for (final user in message.mentionedUsers.toSet()) {
|
||||||
text = text.replaceAll(
|
final userName = user.name;
|
||||||
|
messageTextToRender = messageTextToRender.replaceAll(
|
||||||
'@$userName', '[@$userName](@${userName.replaceAll(' ', '')})');
|
'@$userName', '[@$userName](@${userName.replaceAll(' ', '')})');
|
||||||
});
|
}
|
||||||
return text;
|
return messageTextToRender;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,33 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
|||||||
import 'mocks.dart';
|
import 'mocks.dart';
|
||||||
import 'simple_frame.dart';
|
import 'simple_frame.dart';
|
||||||
|
|
||||||
|
void expectTextStrings(Iterable<Widget> widgets, List<String> strings) {
|
||||||
|
var currentString = 0;
|
||||||
|
for (final widget in widgets) {
|
||||||
|
if (widget is RichText) {
|
||||||
|
final span = widget.text as TextSpan;
|
||||||
|
final text = _extractTextFromTextSpan(span);
|
||||||
|
expect(text, equals(strings[currentString]));
|
||||||
|
currentString += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String _extractTextFromTextSpan(TextSpan span) {
|
||||||
|
var text = span.text ?? '';
|
||||||
|
if (span.children != null) {
|
||||||
|
for (final child in span.children! as Iterable<TextSpan>) {
|
||||||
|
text += _extractTextFromTextSpan(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets(
|
testWidgets(
|
||||||
'it should show correct message text',
|
'it should show correct message text',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
|
final currentUser = OwnUser(id: 'user-id');
|
||||||
final client = MockClient();
|
final client = MockClient();
|
||||||
final clientState = MockClientState();
|
final clientState = MockClientState();
|
||||||
final channel = MockChannel();
|
final channel = MockChannel();
|
||||||
@@ -21,7 +44,9 @@ void main() {
|
|||||||
final streamTheme = StreamChatThemeData.fromTheme(themeData);
|
final streamTheme = StreamChatThemeData.fromTheme(themeData);
|
||||||
|
|
||||||
when(() => client.state).thenReturn(clientState);
|
when(() => client.state).thenReturn(clientState);
|
||||||
when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id'));
|
when(() => clientState.currentUser).thenReturn(currentUser);
|
||||||
|
when(() => clientState.currentUserStream)
|
||||||
|
.thenAnswer((_) => Stream.value(currentUser));
|
||||||
when(() => channel.lastMessageAt).thenReturn(lastMessageAt);
|
when(() => channel.lastMessageAt).thenReturn(lastMessageAt);
|
||||||
when(() => channel.state).thenReturn(channelState);
|
when(() => channel.state).thenReturn(channelState);
|
||||||
when(() => channel.client).thenReturn(client);
|
when(() => channel.client).thenReturn(client);
|
||||||
@@ -54,9 +79,107 @@ void main() {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
group('Message with i18n field', () {
|
||||||
|
final client = MockClient();
|
||||||
|
final clientState = MockClientState();
|
||||||
|
final channel = MockChannel();
|
||||||
|
final channelState = MockChannelState();
|
||||||
|
const messageTheme = MessageTheme();
|
||||||
|
|
||||||
|
final currentUser = OwnUser(
|
||||||
|
id: 'sahil',
|
||||||
|
language: 'hi',
|
||||||
|
);
|
||||||
|
|
||||||
|
setUp(() {
|
||||||
|
when(() => client.state).thenReturn(clientState);
|
||||||
|
when(() => clientState.currentUser).thenReturn(currentUser);
|
||||||
|
when(() => clientState.currentUserStream)
|
||||||
|
.thenAnswer((_) => Stream.value(currentUser));
|
||||||
|
|
||||||
|
when(() => channel.state).thenReturn(channelState);
|
||||||
|
when(() => channel.client).thenReturn(client);
|
||||||
|
when(() => channel.isMuted).thenReturn(false);
|
||||||
|
when(() => channel.isMutedStream).thenAnswer((_) => Stream.value(false));
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'should show correct translated message text as per user language',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
final message = Message(
|
||||||
|
text: 'Hello',
|
||||||
|
i18n: const {
|
||||||
|
'en_text': 'Hello',
|
||||||
|
'hi_text': 'नमस्ते',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: StreamChat(
|
||||||
|
client: client,
|
||||||
|
child: StreamChannel(
|
||||||
|
channel: channel,
|
||||||
|
child: Scaffold(
|
||||||
|
body: MessageText(
|
||||||
|
message: message,
|
||||||
|
messageTheme: messageTheme,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(find.byType(MarkdownBody), findsOneWidget);
|
||||||
|
|
||||||
|
final widgets = tester.allWidgets;
|
||||||
|
expectTextStrings(widgets, <String>['नमस्ते']);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'''should show default text if i18n does not contain translations as per user language''',
|
||||||
|
(WidgetTester tester) async {
|
||||||
|
final message = Message(
|
||||||
|
text: 'Hello',
|
||||||
|
i18n: const {
|
||||||
|
'en_text': 'Hello',
|
||||||
|
'fr_text': 'Bonjour',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: StreamChat(
|
||||||
|
client: client,
|
||||||
|
child: StreamChannel(
|
||||||
|
channel: channel,
|
||||||
|
child: Scaffold(
|
||||||
|
body: MessageText(
|
||||||
|
message: message,
|
||||||
|
messageTheme: messageTheme,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(find.byType(MarkdownBody), findsOneWidget);
|
||||||
|
|
||||||
|
final widgets = tester.allWidgets;
|
||||||
|
expectTextStrings(widgets, <String>['Hello']);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
testGoldens(
|
testGoldens(
|
||||||
'control test',
|
'control test',
|
||||||
(WidgetTester tester) async {
|
(WidgetTester tester) async {
|
||||||
|
final currentUser = OwnUser(id: 'user-id');
|
||||||
final client = MockClient();
|
final client = MockClient();
|
||||||
final clientState = MockClientState();
|
final clientState = MockClientState();
|
||||||
final channel = MockChannel();
|
final channel = MockChannel();
|
||||||
@@ -66,7 +189,9 @@ void main() {
|
|||||||
final streamTheme = StreamChatThemeData.fromTheme(themeData);
|
final streamTheme = StreamChatThemeData.fromTheme(themeData);
|
||||||
|
|
||||||
when(() => client.state).thenReturn(clientState);
|
when(() => client.state).thenReturn(clientState);
|
||||||
when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id'));
|
when(() => clientState.currentUser).thenReturn(currentUser);
|
||||||
|
when(() => clientState.currentUserStream)
|
||||||
|
.thenAnswer((_) => Stream.value(currentUser));
|
||||||
when(() => channel.lastMessageAt).thenReturn(lastMessageAt);
|
when(() => channel.lastMessageAt).thenReturn(lastMessageAt);
|
||||||
when(() => channel.state).thenReturn(channelState);
|
when(() => channel.state).thenReturn(channelState);
|
||||||
when(() => channel.client).thenReturn(client);
|
when(() => channel.client).thenReturn(client);
|
||||||
@@ -90,14 +215,18 @@ cool.''';
|
|||||||
|
|
||||||
await tester.pumpWidgetBuilder(
|
await tester.pumpWidgetBuilder(
|
||||||
materialAppWrapper()(SimpleFrame(
|
materialAppWrapper()(SimpleFrame(
|
||||||
child: StreamChannel(
|
child: StreamChat(
|
||||||
channel: channel,
|
client: client,
|
||||||
child: Scaffold(
|
connectivityStream: Stream.value(ConnectivityResult.wifi),
|
||||||
body: MessageText(
|
child: StreamChannel(
|
||||||
message: Message(
|
channel: channel,
|
||||||
text: messageText,
|
child: Scaffold(
|
||||||
|
body: MessageText(
|
||||||
|
message: Message(
|
||||||
|
text: messageText,
|
||||||
|
),
|
||||||
|
messageTheme: streamTheme.otherMessageTheme,
|
||||||
),
|
),
|
||||||
messageTheme: streamTheme.otherMessageTheme,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:golden_toolkit/golden_toolkit.dart';
|
||||||
|
import 'package:golden_toolkit/src/testing_tools.dart';
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
|
||||||
|
const double _kGoldenDiffTolerance = 0.05;
|
||||||
|
|
||||||
|
/// Wrapper function for golden tests.
|
||||||
|
Future<void> customExpectGoldenMatches(
|
||||||
|
WidgetTester tester,
|
||||||
|
String name, {
|
||||||
|
bool? autoHeight,
|
||||||
|
Finder? finder,
|
||||||
|
CustomPump? customPump,
|
||||||
|
@Deprecated('''
|
||||||
|
This method level parameter will be removed in an upcoming release. This can be configured globally. If you have concerns, please file an issue with your use case.''') bool? skip,
|
||||||
|
}) {
|
||||||
|
final goldenPath = path.join('test/src/goldens');
|
||||||
|
print('goldenPath: $goldenPath');
|
||||||
|
goldenFileComparator = CustomGoldenFileComparator(Uri.parse(goldenPath));
|
||||||
|
|
||||||
|
return compareWithGolden(
|
||||||
|
tester,
|
||||||
|
name,
|
||||||
|
autoHeight: autoHeight,
|
||||||
|
finder: finder,
|
||||||
|
customPump: customPump,
|
||||||
|
skip: skip,
|
||||||
|
// This value is actually ignored. We are forced to pass it because the
|
||||||
|
// downstream API is structured poorly. This should be refactored.
|
||||||
|
device: Device.phone,
|
||||||
|
fileNameFactory: (String name, Device device) =>
|
||||||
|
GoldenToolkit.configuration.fileNameFactory(name),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class CustomGoldenFileComparator extends LocalFileComparator {
|
||||||
|
CustomGoldenFileComparator(Uri testFile) : super(testFile);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> compare(Uint8List imageBytes, Uri golden) async {
|
||||||
|
print('golden.toString(): ${golden.toString()}');
|
||||||
|
final result = await GoldenFileComparator.compareLists(
|
||||||
|
imageBytes,
|
||||||
|
await getGoldenBytes(golden),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!result.passed && result.diffPercent > _kGoldenDiffTolerance) {
|
||||||
|
final error = await generateFailureOutput(result, golden, basedir);
|
||||||
|
throw FlutterError(error);
|
||||||
|
}
|
||||||
|
return result.passed;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,9 @@
|
|||||||
|
## Upcoming
|
||||||
|
|
||||||
|
✅ Added
|
||||||
|
- Added support for `Message.i18n`
|
||||||
|
- Added support for `User.language`
|
||||||
|
|
||||||
## 2.0.0
|
## 2.0.0
|
||||||
* Migrate this package to null safety
|
* Migrate this package to null safety
|
||||||
* Minor fixes and improvements
|
* Minor fixes and improvements
|
||||||
|
|||||||
@@ -647,6 +647,9 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
/// The channel cid of which this message is part of
|
/// The channel cid of which this message is part of
|
||||||
final String? channelCid;
|
final String? channelCid;
|
||||||
|
|
||||||
|
/// A Map of [messageText] translations.
|
||||||
|
final Map<String, String>? i18n;
|
||||||
|
|
||||||
/// Message custom extraData
|
/// Message custom extraData
|
||||||
final Map<String, Object?>? extraData;
|
final Map<String, Object?>? extraData;
|
||||||
MessageEntity(
|
MessageEntity(
|
||||||
@@ -673,6 +676,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
this.pinExpires,
|
this.pinExpires,
|
||||||
this.pinnedByUserId,
|
this.pinnedByUserId,
|
||||||
this.channelCid,
|
this.channelCid,
|
||||||
|
this.i18n,
|
||||||
this.extraData});
|
this.extraData});
|
||||||
factory MessageEntity.fromData(
|
factory MessageEntity.fromData(
|
||||||
Map<String, dynamic> data, GeneratedDatabase db,
|
Map<String, dynamic> data, GeneratedDatabase db,
|
||||||
@@ -725,7 +729,9 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
.mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']),
|
.mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']),
|
||||||
channelCid: const StringType()
|
channelCid: const StringType()
|
||||||
.mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']),
|
.mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']),
|
||||||
extraData: $MessagesTable.$converter5.mapToDart(const StringType()
|
i18n: $MessagesTable.$converter5.mapToDart(const StringType()
|
||||||
|
.mapFromDatabaseResponse(data['${effectivePrefix}i18n'])),
|
||||||
|
extraData: $MessagesTable.$converter6.mapToDart(const StringType()
|
||||||
.mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])),
|
.mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -797,8 +803,12 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
if (!nullToAbsent || channelCid != null) {
|
if (!nullToAbsent || channelCid != null) {
|
||||||
map['channel_cid'] = Variable<String?>(channelCid);
|
map['channel_cid'] = Variable<String?>(channelCid);
|
||||||
}
|
}
|
||||||
if (!nullToAbsent || extraData != null) {
|
if (!nullToAbsent || i18n != null) {
|
||||||
final converter = $MessagesTable.$converter5;
|
final converter = $MessagesTable.$converter5;
|
||||||
|
map['i18n'] = Variable<String?>(converter.mapToSql(i18n));
|
||||||
|
}
|
||||||
|
if (!nullToAbsent || extraData != null) {
|
||||||
|
final converter = $MessagesTable.$converter6;
|
||||||
map['extra_data'] = Variable<String?>(converter.mapToSql(extraData));
|
map['extra_data'] = Variable<String?>(converter.mapToSql(extraData));
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
@@ -833,6 +843,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
pinExpires: serializer.fromJson<DateTime?>(json['pinExpires']),
|
pinExpires: serializer.fromJson<DateTime?>(json['pinExpires']),
|
||||||
pinnedByUserId: serializer.fromJson<String?>(json['pinnedByUserId']),
|
pinnedByUserId: serializer.fromJson<String?>(json['pinnedByUserId']),
|
||||||
channelCid: serializer.fromJson<String?>(json['channelCid']),
|
channelCid: serializer.fromJson<String?>(json['channelCid']),
|
||||||
|
i18n: serializer.fromJson<Map<String, String>?>(json['i18n']),
|
||||||
extraData: serializer.fromJson<Map<String, Object?>?>(json['extraData']),
|
extraData: serializer.fromJson<Map<String, Object?>?>(json['extraData']),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -863,6 +874,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
'pinExpires': serializer.toJson<DateTime?>(pinExpires),
|
'pinExpires': serializer.toJson<DateTime?>(pinExpires),
|
||||||
'pinnedByUserId': serializer.toJson<String?>(pinnedByUserId),
|
'pinnedByUserId': serializer.toJson<String?>(pinnedByUserId),
|
||||||
'channelCid': serializer.toJson<String?>(channelCid),
|
'channelCid': serializer.toJson<String?>(channelCid),
|
||||||
|
'i18n': serializer.toJson<Map<String, String>?>(i18n),
|
||||||
'extraData': serializer.toJson<Map<String, Object?>?>(extraData),
|
'extraData': serializer.toJson<Map<String, Object?>?>(extraData),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -891,6 +903,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
Value<DateTime?> pinExpires = const Value.absent(),
|
Value<DateTime?> pinExpires = const Value.absent(),
|
||||||
Value<String?> pinnedByUserId = const Value.absent(),
|
Value<String?> pinnedByUserId = const Value.absent(),
|
||||||
Value<String?> channelCid = const Value.absent(),
|
Value<String?> channelCid = const Value.absent(),
|
||||||
|
Value<Map<String, String>?> i18n = const Value.absent(),
|
||||||
Value<Map<String, Object?>?> extraData = const Value.absent()}) =>
|
Value<Map<String, Object?>?> extraData = const Value.absent()}) =>
|
||||||
MessageEntity(
|
MessageEntity(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@@ -922,6 +935,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
pinnedByUserId:
|
pinnedByUserId:
|
||||||
pinnedByUserId.present ? pinnedByUserId.value : this.pinnedByUserId,
|
pinnedByUserId.present ? pinnedByUserId.value : this.pinnedByUserId,
|
||||||
channelCid: channelCid.present ? channelCid.value : this.channelCid,
|
channelCid: channelCid.present ? channelCid.value : this.channelCid,
|
||||||
|
i18n: i18n.present ? i18n.value : this.i18n,
|
||||||
extraData: extraData.present ? extraData.value : this.extraData,
|
extraData: extraData.present ? extraData.value : this.extraData,
|
||||||
);
|
);
|
||||||
@override
|
@override
|
||||||
@@ -950,6 +964,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
..write('pinExpires: $pinExpires, ')
|
..write('pinExpires: $pinExpires, ')
|
||||||
..write('pinnedByUserId: $pinnedByUserId, ')
|
..write('pinnedByUserId: $pinnedByUserId, ')
|
||||||
..write('channelCid: $channelCid, ')
|
..write('channelCid: $channelCid, ')
|
||||||
|
..write('i18n: $i18n, ')
|
||||||
..write('extraData: $extraData')
|
..write('extraData: $extraData')
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
@@ -998,7 +1013,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
.hashCode,
|
.hashCode,
|
||||||
$mrjc(
|
$mrjc(
|
||||||
pinned.hashCode,
|
pinned.hashCode,
|
||||||
$mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, extraData.hashCode))))))))))))))))))))))));
|
$mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, $mrjc(i18n.hashCode, extraData.hashCode)))))))))))))))))))))))));
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
identical(this, other) ||
|
identical(this, other) ||
|
||||||
@@ -1026,6 +1041,7 @@ class MessageEntity extends DataClass implements Insertable<MessageEntity> {
|
|||||||
other.pinExpires == this.pinExpires &&
|
other.pinExpires == this.pinExpires &&
|
||||||
other.pinnedByUserId == this.pinnedByUserId &&
|
other.pinnedByUserId == this.pinnedByUserId &&
|
||||||
other.channelCid == this.channelCid &&
|
other.channelCid == this.channelCid &&
|
||||||
|
other.i18n == this.i18n &&
|
||||||
other.extraData == this.extraData);
|
other.extraData == this.extraData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1053,6 +1069,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
final Value<DateTime?> pinExpires;
|
final Value<DateTime?> pinExpires;
|
||||||
final Value<String?> pinnedByUserId;
|
final Value<String?> pinnedByUserId;
|
||||||
final Value<String?> channelCid;
|
final Value<String?> channelCid;
|
||||||
|
final Value<Map<String, String>?> i18n;
|
||||||
final Value<Map<String, Object?>?> extraData;
|
final Value<Map<String, Object?>?> extraData;
|
||||||
const MessagesCompanion({
|
const MessagesCompanion({
|
||||||
this.id = const Value.absent(),
|
this.id = const Value.absent(),
|
||||||
@@ -1078,6 +1095,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
this.pinExpires = const Value.absent(),
|
this.pinExpires = const Value.absent(),
|
||||||
this.pinnedByUserId = const Value.absent(),
|
this.pinnedByUserId = const Value.absent(),
|
||||||
this.channelCid = const Value.absent(),
|
this.channelCid = const Value.absent(),
|
||||||
|
this.i18n = const Value.absent(),
|
||||||
this.extraData = const Value.absent(),
|
this.extraData = const Value.absent(),
|
||||||
});
|
});
|
||||||
MessagesCompanion.insert({
|
MessagesCompanion.insert({
|
||||||
@@ -1104,6 +1122,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
this.pinExpires = const Value.absent(),
|
this.pinExpires = const Value.absent(),
|
||||||
this.pinnedByUserId = const Value.absent(),
|
this.pinnedByUserId = const Value.absent(),
|
||||||
this.channelCid = const Value.absent(),
|
this.channelCid = const Value.absent(),
|
||||||
|
this.i18n = const Value.absent(),
|
||||||
this.extraData = const Value.absent(),
|
this.extraData = const Value.absent(),
|
||||||
}) : id = Value(id),
|
}) : id = Value(id),
|
||||||
attachments = Value(attachments),
|
attachments = Value(attachments),
|
||||||
@@ -1132,6 +1151,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
Expression<DateTime?>? pinExpires,
|
Expression<DateTime?>? pinExpires,
|
||||||
Expression<String?>? pinnedByUserId,
|
Expression<String?>? pinnedByUserId,
|
||||||
Expression<String?>? channelCid,
|
Expression<String?>? channelCid,
|
||||||
|
Expression<Map<String, String>?>? i18n,
|
||||||
Expression<Map<String, Object?>?>? extraData,
|
Expression<Map<String, Object?>?>? extraData,
|
||||||
}) {
|
}) {
|
||||||
return RawValuesInsertable({
|
return RawValuesInsertable({
|
||||||
@@ -1158,6 +1178,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
if (pinExpires != null) 'pin_expires': pinExpires,
|
if (pinExpires != null) 'pin_expires': pinExpires,
|
||||||
if (pinnedByUserId != null) 'pinned_by_user_id': pinnedByUserId,
|
if (pinnedByUserId != null) 'pinned_by_user_id': pinnedByUserId,
|
||||||
if (channelCid != null) 'channel_cid': channelCid,
|
if (channelCid != null) 'channel_cid': channelCid,
|
||||||
|
if (i18n != null) 'i18n': i18n,
|
||||||
if (extraData != null) 'extra_data': extraData,
|
if (extraData != null) 'extra_data': extraData,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1186,6 +1207,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
Value<DateTime?>? pinExpires,
|
Value<DateTime?>? pinExpires,
|
||||||
Value<String?>? pinnedByUserId,
|
Value<String?>? pinnedByUserId,
|
||||||
Value<String?>? channelCid,
|
Value<String?>? channelCid,
|
||||||
|
Value<Map<String, String>?>? i18n,
|
||||||
Value<Map<String, Object?>?>? extraData}) {
|
Value<Map<String, Object?>?>? extraData}) {
|
||||||
return MessagesCompanion(
|
return MessagesCompanion(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@@ -1211,6 +1233,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
pinExpires: pinExpires ?? this.pinExpires,
|
pinExpires: pinExpires ?? this.pinExpires,
|
||||||
pinnedByUserId: pinnedByUserId ?? this.pinnedByUserId,
|
pinnedByUserId: pinnedByUserId ?? this.pinnedByUserId,
|
||||||
channelCid: channelCid ?? this.channelCid,
|
channelCid: channelCid ?? this.channelCid,
|
||||||
|
i18n: i18n ?? this.i18n,
|
||||||
extraData: extraData ?? this.extraData,
|
extraData: extraData ?? this.extraData,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1296,8 +1319,12 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
if (channelCid.present) {
|
if (channelCid.present) {
|
||||||
map['channel_cid'] = Variable<String?>(channelCid.value);
|
map['channel_cid'] = Variable<String?>(channelCid.value);
|
||||||
}
|
}
|
||||||
if (extraData.present) {
|
if (i18n.present) {
|
||||||
final converter = $MessagesTable.$converter5;
|
final converter = $MessagesTable.$converter5;
|
||||||
|
map['i18n'] = Variable<String?>(converter.mapToSql(i18n.value));
|
||||||
|
}
|
||||||
|
if (extraData.present) {
|
||||||
|
final converter = $MessagesTable.$converter6;
|
||||||
map['extra_data'] =
|
map['extra_data'] =
|
||||||
Variable<String?>(converter.mapToSql(extraData.value));
|
Variable<String?>(converter.mapToSql(extraData.value));
|
||||||
}
|
}
|
||||||
@@ -1330,6 +1357,7 @@ class MessagesCompanion extends UpdateCompanion<MessageEntity> {
|
|||||||
..write('pinExpires: $pinExpires, ')
|
..write('pinExpires: $pinExpires, ')
|
||||||
..write('pinnedByUserId: $pinnedByUserId, ')
|
..write('pinnedByUserId: $pinnedByUserId, ')
|
||||||
..write('channelCid: $channelCid, ')
|
..write('channelCid: $channelCid, ')
|
||||||
|
..write('i18n: $i18n, ')
|
||||||
..write('extraData: $extraData')
|
..write('extraData: $extraData')
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
@@ -1468,11 +1496,16 @@ class $MessagesTable extends Messages
|
|||||||
requiredDuringInsert: false,
|
requiredDuringInsert: false,
|
||||||
$customConstraints:
|
$customConstraints:
|
||||||
'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE');
|
'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE');
|
||||||
|
final VerificationMeta _i18nMeta = const VerificationMeta('i18n');
|
||||||
|
late final GeneratedColumnWithTypeConverter<Map<String, String>, String?>
|
||||||
|
i18n = GeneratedColumn<String?>('i18n', aliasedName, true,
|
||||||
|
typeName: 'TEXT', requiredDuringInsert: false)
|
||||||
|
.withConverter<Map<String, String>>($MessagesTable.$converter5);
|
||||||
final VerificationMeta _extraDataMeta = const VerificationMeta('extraData');
|
final VerificationMeta _extraDataMeta = const VerificationMeta('extraData');
|
||||||
late final GeneratedColumnWithTypeConverter<Map<String, Object?>, String?>
|
late final GeneratedColumnWithTypeConverter<Map<String, Object?>, String?>
|
||||||
extraData = GeneratedColumn<String?>('extra_data', aliasedName, true,
|
extraData = GeneratedColumn<String?>('extra_data', aliasedName, true,
|
||||||
typeName: 'TEXT', requiredDuringInsert: false)
|
typeName: 'TEXT', requiredDuringInsert: false)
|
||||||
.withConverter<Map<String, Object?>>($MessagesTable.$converter5);
|
.withConverter<Map<String, Object?>>($MessagesTable.$converter6);
|
||||||
@override
|
@override
|
||||||
List<GeneratedColumn> get $columns => [
|
List<GeneratedColumn> get $columns => [
|
||||||
id,
|
id,
|
||||||
@@ -1498,6 +1531,7 @@ class $MessagesTable extends Messages
|
|||||||
pinExpires,
|
pinExpires,
|
||||||
pinnedByUserId,
|
pinnedByUserId,
|
||||||
channelCid,
|
channelCid,
|
||||||
|
i18n,
|
||||||
extraData
|
extraData
|
||||||
];
|
];
|
||||||
@override
|
@override
|
||||||
@@ -1601,6 +1635,7 @@ class $MessagesTable extends Messages
|
|||||||
channelCid.isAcceptableOrUnknown(
|
channelCid.isAcceptableOrUnknown(
|
||||||
data['channel_cid']!, _channelCidMeta));
|
data['channel_cid']!, _channelCidMeta));
|
||||||
}
|
}
|
||||||
|
context.handle(_i18nMeta, const VerificationResult.success());
|
||||||
context.handle(_extraDataMeta, const VerificationResult.success());
|
context.handle(_extraDataMeta, const VerificationResult.success());
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
@@ -1628,7 +1663,9 @@ class $MessagesTable extends Messages
|
|||||||
MapConverter<int>();
|
MapConverter<int>();
|
||||||
static TypeConverter<Map<String, int>, String> $converter4 =
|
static TypeConverter<Map<String, int>, String> $converter4 =
|
||||||
MapConverter<int>();
|
MapConverter<int>();
|
||||||
static TypeConverter<Map<String, Object?>, String> $converter5 =
|
static TypeConverter<Map<String, String>, String> $converter5 =
|
||||||
|
MapConverter<String>();
|
||||||
|
static TypeConverter<Map<String, Object?>, String> $converter6 =
|
||||||
MapConverter<Object?>();
|
MapConverter<Object?>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1704,6 +1741,9 @@ class PinnedMessageEntity extends DataClass
|
|||||||
/// The channel cid of which this message is part of
|
/// The channel cid of which this message is part of
|
||||||
final String? channelCid;
|
final String? channelCid;
|
||||||
|
|
||||||
|
/// A Map of [messageText] translations.
|
||||||
|
final Map<String, String>? i18n;
|
||||||
|
|
||||||
/// Message custom extraData
|
/// Message custom extraData
|
||||||
final Map<String, Object?>? extraData;
|
final Map<String, Object?>? extraData;
|
||||||
PinnedMessageEntity(
|
PinnedMessageEntity(
|
||||||
@@ -1730,6 +1770,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
this.pinExpires,
|
this.pinExpires,
|
||||||
this.pinnedByUserId,
|
this.pinnedByUserId,
|
||||||
this.channelCid,
|
this.channelCid,
|
||||||
|
this.i18n,
|
||||||
this.extraData});
|
this.extraData});
|
||||||
factory PinnedMessageEntity.fromData(
|
factory PinnedMessageEntity.fromData(
|
||||||
Map<String, dynamic> data, GeneratedDatabase db,
|
Map<String, dynamic> data, GeneratedDatabase db,
|
||||||
@@ -1785,7 +1826,9 @@ class PinnedMessageEntity extends DataClass
|
|||||||
.mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']),
|
.mapFromDatabaseResponse(data['${effectivePrefix}pinned_by_user_id']),
|
||||||
channelCid: const StringType()
|
channelCid: const StringType()
|
||||||
.mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']),
|
.mapFromDatabaseResponse(data['${effectivePrefix}channel_cid']),
|
||||||
extraData: $PinnedMessagesTable.$converter5.mapToDart(const StringType()
|
i18n: $PinnedMessagesTable.$converter5.mapToDart(const StringType()
|
||||||
|
.mapFromDatabaseResponse(data['${effectivePrefix}i18n'])),
|
||||||
|
extraData: $PinnedMessagesTable.$converter6.mapToDart(const StringType()
|
||||||
.mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])),
|
.mapFromDatabaseResponse(data['${effectivePrefix}extra_data'])),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1857,8 +1900,12 @@ class PinnedMessageEntity extends DataClass
|
|||||||
if (!nullToAbsent || channelCid != null) {
|
if (!nullToAbsent || channelCid != null) {
|
||||||
map['channel_cid'] = Variable<String?>(channelCid);
|
map['channel_cid'] = Variable<String?>(channelCid);
|
||||||
}
|
}
|
||||||
if (!nullToAbsent || extraData != null) {
|
if (!nullToAbsent || i18n != null) {
|
||||||
final converter = $PinnedMessagesTable.$converter5;
|
final converter = $PinnedMessagesTable.$converter5;
|
||||||
|
map['i18n'] = Variable<String?>(converter.mapToSql(i18n));
|
||||||
|
}
|
||||||
|
if (!nullToAbsent || extraData != null) {
|
||||||
|
final converter = $PinnedMessagesTable.$converter6;
|
||||||
map['extra_data'] = Variable<String?>(converter.mapToSql(extraData));
|
map['extra_data'] = Variable<String?>(converter.mapToSql(extraData));
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
@@ -1893,6 +1940,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
pinExpires: serializer.fromJson<DateTime?>(json['pinExpires']),
|
pinExpires: serializer.fromJson<DateTime?>(json['pinExpires']),
|
||||||
pinnedByUserId: serializer.fromJson<String?>(json['pinnedByUserId']),
|
pinnedByUserId: serializer.fromJson<String?>(json['pinnedByUserId']),
|
||||||
channelCid: serializer.fromJson<String?>(json['channelCid']),
|
channelCid: serializer.fromJson<String?>(json['channelCid']),
|
||||||
|
i18n: serializer.fromJson<Map<String, String>?>(json['i18n']),
|
||||||
extraData: serializer.fromJson<Map<String, Object?>?>(json['extraData']),
|
extraData: serializer.fromJson<Map<String, Object?>?>(json['extraData']),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1923,6 +1971,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
'pinExpires': serializer.toJson<DateTime?>(pinExpires),
|
'pinExpires': serializer.toJson<DateTime?>(pinExpires),
|
||||||
'pinnedByUserId': serializer.toJson<String?>(pinnedByUserId),
|
'pinnedByUserId': serializer.toJson<String?>(pinnedByUserId),
|
||||||
'channelCid': serializer.toJson<String?>(channelCid),
|
'channelCid': serializer.toJson<String?>(channelCid),
|
||||||
|
'i18n': serializer.toJson<Map<String, String>?>(i18n),
|
||||||
'extraData': serializer.toJson<Map<String, Object?>?>(extraData),
|
'extraData': serializer.toJson<Map<String, Object?>?>(extraData),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1951,6 +2000,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
Value<DateTime?> pinExpires = const Value.absent(),
|
Value<DateTime?> pinExpires = const Value.absent(),
|
||||||
Value<String?> pinnedByUserId = const Value.absent(),
|
Value<String?> pinnedByUserId = const Value.absent(),
|
||||||
Value<String?> channelCid = const Value.absent(),
|
Value<String?> channelCid = const Value.absent(),
|
||||||
|
Value<Map<String, String>?> i18n = const Value.absent(),
|
||||||
Value<Map<String, Object?>?> extraData = const Value.absent()}) =>
|
Value<Map<String, Object?>?> extraData = const Value.absent()}) =>
|
||||||
PinnedMessageEntity(
|
PinnedMessageEntity(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@@ -1982,6 +2032,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
pinnedByUserId:
|
pinnedByUserId:
|
||||||
pinnedByUserId.present ? pinnedByUserId.value : this.pinnedByUserId,
|
pinnedByUserId.present ? pinnedByUserId.value : this.pinnedByUserId,
|
||||||
channelCid: channelCid.present ? channelCid.value : this.channelCid,
|
channelCid: channelCid.present ? channelCid.value : this.channelCid,
|
||||||
|
i18n: i18n.present ? i18n.value : this.i18n,
|
||||||
extraData: extraData.present ? extraData.value : this.extraData,
|
extraData: extraData.present ? extraData.value : this.extraData,
|
||||||
);
|
);
|
||||||
@override
|
@override
|
||||||
@@ -2010,6 +2061,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
..write('pinExpires: $pinExpires, ')
|
..write('pinExpires: $pinExpires, ')
|
||||||
..write('pinnedByUserId: $pinnedByUserId, ')
|
..write('pinnedByUserId: $pinnedByUserId, ')
|
||||||
..write('channelCid: $channelCid, ')
|
..write('channelCid: $channelCid, ')
|
||||||
|
..write('i18n: $i18n, ')
|
||||||
..write('extraData: $extraData')
|
..write('extraData: $extraData')
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
@@ -2058,7 +2110,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
.hashCode,
|
.hashCode,
|
||||||
$mrjc(
|
$mrjc(
|
||||||
pinned.hashCode,
|
pinned.hashCode,
|
||||||
$mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, extraData.hashCode))))))))))))))))))))))));
|
$mrjc(pinnedAt.hashCode, $mrjc(pinExpires.hashCode, $mrjc(pinnedByUserId.hashCode, $mrjc(channelCid.hashCode, $mrjc(i18n.hashCode, extraData.hashCode)))))))))))))))))))))))));
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
identical(this, other) ||
|
identical(this, other) ||
|
||||||
@@ -2086,6 +2138,7 @@ class PinnedMessageEntity extends DataClass
|
|||||||
other.pinExpires == this.pinExpires &&
|
other.pinExpires == this.pinExpires &&
|
||||||
other.pinnedByUserId == this.pinnedByUserId &&
|
other.pinnedByUserId == this.pinnedByUserId &&
|
||||||
other.channelCid == this.channelCid &&
|
other.channelCid == this.channelCid &&
|
||||||
|
other.i18n == this.i18n &&
|
||||||
other.extraData == this.extraData);
|
other.extraData == this.extraData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2113,6 +2166,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
final Value<DateTime?> pinExpires;
|
final Value<DateTime?> pinExpires;
|
||||||
final Value<String?> pinnedByUserId;
|
final Value<String?> pinnedByUserId;
|
||||||
final Value<String?> channelCid;
|
final Value<String?> channelCid;
|
||||||
|
final Value<Map<String, String>?> i18n;
|
||||||
final Value<Map<String, Object?>?> extraData;
|
final Value<Map<String, Object?>?> extraData;
|
||||||
const PinnedMessagesCompanion({
|
const PinnedMessagesCompanion({
|
||||||
this.id = const Value.absent(),
|
this.id = const Value.absent(),
|
||||||
@@ -2138,6 +2192,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
this.pinExpires = const Value.absent(),
|
this.pinExpires = const Value.absent(),
|
||||||
this.pinnedByUserId = const Value.absent(),
|
this.pinnedByUserId = const Value.absent(),
|
||||||
this.channelCid = const Value.absent(),
|
this.channelCid = const Value.absent(),
|
||||||
|
this.i18n = const Value.absent(),
|
||||||
this.extraData = const Value.absent(),
|
this.extraData = const Value.absent(),
|
||||||
});
|
});
|
||||||
PinnedMessagesCompanion.insert({
|
PinnedMessagesCompanion.insert({
|
||||||
@@ -2164,6 +2219,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
this.pinExpires = const Value.absent(),
|
this.pinExpires = const Value.absent(),
|
||||||
this.pinnedByUserId = const Value.absent(),
|
this.pinnedByUserId = const Value.absent(),
|
||||||
this.channelCid = const Value.absent(),
|
this.channelCid = const Value.absent(),
|
||||||
|
this.i18n = const Value.absent(),
|
||||||
this.extraData = const Value.absent(),
|
this.extraData = const Value.absent(),
|
||||||
}) : id = Value(id),
|
}) : id = Value(id),
|
||||||
attachments = Value(attachments),
|
attachments = Value(attachments),
|
||||||
@@ -2192,6 +2248,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
Expression<DateTime?>? pinExpires,
|
Expression<DateTime?>? pinExpires,
|
||||||
Expression<String?>? pinnedByUserId,
|
Expression<String?>? pinnedByUserId,
|
||||||
Expression<String?>? channelCid,
|
Expression<String?>? channelCid,
|
||||||
|
Expression<Map<String, String>?>? i18n,
|
||||||
Expression<Map<String, Object?>?>? extraData,
|
Expression<Map<String, Object?>?>? extraData,
|
||||||
}) {
|
}) {
|
||||||
return RawValuesInsertable({
|
return RawValuesInsertable({
|
||||||
@@ -2218,6 +2275,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
if (pinExpires != null) 'pin_expires': pinExpires,
|
if (pinExpires != null) 'pin_expires': pinExpires,
|
||||||
if (pinnedByUserId != null) 'pinned_by_user_id': pinnedByUserId,
|
if (pinnedByUserId != null) 'pinned_by_user_id': pinnedByUserId,
|
||||||
if (channelCid != null) 'channel_cid': channelCid,
|
if (channelCid != null) 'channel_cid': channelCid,
|
||||||
|
if (i18n != null) 'i18n': i18n,
|
||||||
if (extraData != null) 'extra_data': extraData,
|
if (extraData != null) 'extra_data': extraData,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -2246,6 +2304,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
Value<DateTime?>? pinExpires,
|
Value<DateTime?>? pinExpires,
|
||||||
Value<String?>? pinnedByUserId,
|
Value<String?>? pinnedByUserId,
|
||||||
Value<String?>? channelCid,
|
Value<String?>? channelCid,
|
||||||
|
Value<Map<String, String>?>? i18n,
|
||||||
Value<Map<String, Object?>?>? extraData}) {
|
Value<Map<String, Object?>?>? extraData}) {
|
||||||
return PinnedMessagesCompanion(
|
return PinnedMessagesCompanion(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@@ -2271,6 +2330,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
pinExpires: pinExpires ?? this.pinExpires,
|
pinExpires: pinExpires ?? this.pinExpires,
|
||||||
pinnedByUserId: pinnedByUserId ?? this.pinnedByUserId,
|
pinnedByUserId: pinnedByUserId ?? this.pinnedByUserId,
|
||||||
channelCid: channelCid ?? this.channelCid,
|
channelCid: channelCid ?? this.channelCid,
|
||||||
|
i18n: i18n ?? this.i18n,
|
||||||
extraData: extraData ?? this.extraData,
|
extraData: extraData ?? this.extraData,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -2356,8 +2416,12 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
if (channelCid.present) {
|
if (channelCid.present) {
|
||||||
map['channel_cid'] = Variable<String?>(channelCid.value);
|
map['channel_cid'] = Variable<String?>(channelCid.value);
|
||||||
}
|
}
|
||||||
if (extraData.present) {
|
if (i18n.present) {
|
||||||
final converter = $PinnedMessagesTable.$converter5;
|
final converter = $PinnedMessagesTable.$converter5;
|
||||||
|
map['i18n'] = Variable<String?>(converter.mapToSql(i18n.value));
|
||||||
|
}
|
||||||
|
if (extraData.present) {
|
||||||
|
final converter = $PinnedMessagesTable.$converter6;
|
||||||
map['extra_data'] =
|
map['extra_data'] =
|
||||||
Variable<String?>(converter.mapToSql(extraData.value));
|
Variable<String?>(converter.mapToSql(extraData.value));
|
||||||
}
|
}
|
||||||
@@ -2390,6 +2454,7 @@ class PinnedMessagesCompanion extends UpdateCompanion<PinnedMessageEntity> {
|
|||||||
..write('pinExpires: $pinExpires, ')
|
..write('pinExpires: $pinExpires, ')
|
||||||
..write('pinnedByUserId: $pinnedByUserId, ')
|
..write('pinnedByUserId: $pinnedByUserId, ')
|
||||||
..write('channelCid: $channelCid, ')
|
..write('channelCid: $channelCid, ')
|
||||||
|
..write('i18n: $i18n, ')
|
||||||
..write('extraData: $extraData')
|
..write('extraData: $extraData')
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
@@ -2529,12 +2594,17 @@ class $PinnedMessagesTable extends PinnedMessages
|
|||||||
requiredDuringInsert: false,
|
requiredDuringInsert: false,
|
||||||
$customConstraints:
|
$customConstraints:
|
||||||
'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE');
|
'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE');
|
||||||
|
final VerificationMeta _i18nMeta = const VerificationMeta('i18n');
|
||||||
|
late final GeneratedColumnWithTypeConverter<Map<String, String>, String?>
|
||||||
|
i18n = GeneratedColumn<String?>('i18n', aliasedName, true,
|
||||||
|
typeName: 'TEXT', requiredDuringInsert: false)
|
||||||
|
.withConverter<Map<String, String>>($PinnedMessagesTable.$converter5);
|
||||||
final VerificationMeta _extraDataMeta = const VerificationMeta('extraData');
|
final VerificationMeta _extraDataMeta = const VerificationMeta('extraData');
|
||||||
late final GeneratedColumnWithTypeConverter<Map<String, Object?>, String?>
|
late final GeneratedColumnWithTypeConverter<Map<String, Object?>, String?>
|
||||||
extraData = GeneratedColumn<String?>('extra_data', aliasedName, true,
|
extraData = GeneratedColumn<String?>('extra_data', aliasedName, true,
|
||||||
typeName: 'TEXT', requiredDuringInsert: false)
|
typeName: 'TEXT', requiredDuringInsert: false)
|
||||||
.withConverter<Map<String, Object?>>(
|
.withConverter<Map<String, Object?>>(
|
||||||
$PinnedMessagesTable.$converter5);
|
$PinnedMessagesTable.$converter6);
|
||||||
@override
|
@override
|
||||||
List<GeneratedColumn> get $columns => [
|
List<GeneratedColumn> get $columns => [
|
||||||
id,
|
id,
|
||||||
@@ -2560,6 +2630,7 @@ class $PinnedMessagesTable extends PinnedMessages
|
|||||||
pinExpires,
|
pinExpires,
|
||||||
pinnedByUserId,
|
pinnedByUserId,
|
||||||
channelCid,
|
channelCid,
|
||||||
|
i18n,
|
||||||
extraData
|
extraData
|
||||||
];
|
];
|
||||||
@override
|
@override
|
||||||
@@ -2664,6 +2735,7 @@ class $PinnedMessagesTable extends PinnedMessages
|
|||||||
channelCid.isAcceptableOrUnknown(
|
channelCid.isAcceptableOrUnknown(
|
||||||
data['channel_cid']!, _channelCidMeta));
|
data['channel_cid']!, _channelCidMeta));
|
||||||
}
|
}
|
||||||
|
context.handle(_i18nMeta, const VerificationResult.success());
|
||||||
context.handle(_extraDataMeta, const VerificationResult.success());
|
context.handle(_extraDataMeta, const VerificationResult.success());
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
@@ -2691,7 +2763,9 @@ class $PinnedMessagesTable extends PinnedMessages
|
|||||||
MapConverter<int>();
|
MapConverter<int>();
|
||||||
static TypeConverter<Map<String, int>, String> $converter4 =
|
static TypeConverter<Map<String, int>, String> $converter4 =
|
||||||
MapConverter<int>();
|
MapConverter<int>();
|
||||||
static TypeConverter<Map<String, Object?>, String> $converter5 =
|
static TypeConverter<Map<String, String>, String> $converter5 =
|
||||||
|
MapConverter<String>();
|
||||||
|
static TypeConverter<Map<String, Object?>, String> $converter6 =
|
||||||
MapConverter<Object?>();
|
MapConverter<Object?>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3030,6 +3104,9 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
/// User role
|
/// User role
|
||||||
final String? role;
|
final String? role;
|
||||||
|
|
||||||
|
/// The language this user prefers.
|
||||||
|
final String? language;
|
||||||
|
|
||||||
/// Date of user creation
|
/// Date of user creation
|
||||||
final DateTime createdAt;
|
final DateTime createdAt;
|
||||||
|
|
||||||
@@ -3050,6 +3127,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
UserEntity(
|
UserEntity(
|
||||||
{required this.id,
|
{required this.id,
|
||||||
this.role,
|
this.role,
|
||||||
|
this.language,
|
||||||
required this.createdAt,
|
required this.createdAt,
|
||||||
required this.updatedAt,
|
required this.updatedAt,
|
||||||
this.lastActive,
|
this.lastActive,
|
||||||
@@ -3064,6 +3142,8 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
|
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
|
||||||
role: const StringType()
|
role: const StringType()
|
||||||
.mapFromDatabaseResponse(data['${effectivePrefix}role']),
|
.mapFromDatabaseResponse(data['${effectivePrefix}role']),
|
||||||
|
language: const StringType()
|
||||||
|
.mapFromDatabaseResponse(data['${effectivePrefix}language']),
|
||||||
createdAt: const DateTimeType()
|
createdAt: const DateTimeType()
|
||||||
.mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!,
|
.mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!,
|
||||||
updatedAt: const DateTimeType()
|
updatedAt: const DateTimeType()
|
||||||
@@ -3085,6 +3165,9 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
if (!nullToAbsent || role != null) {
|
if (!nullToAbsent || role != null) {
|
||||||
map['role'] = Variable<String?>(role);
|
map['role'] = Variable<String?>(role);
|
||||||
}
|
}
|
||||||
|
if (!nullToAbsent || language != null) {
|
||||||
|
map['language'] = Variable<String?>(language);
|
||||||
|
}
|
||||||
map['created_at'] = Variable<DateTime>(createdAt);
|
map['created_at'] = Variable<DateTime>(createdAt);
|
||||||
map['updated_at'] = Variable<DateTime>(updatedAt);
|
map['updated_at'] = Variable<DateTime>(updatedAt);
|
||||||
if (!nullToAbsent || lastActive != null) {
|
if (!nullToAbsent || lastActive != null) {
|
||||||
@@ -3105,6 +3188,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
return UserEntity(
|
return UserEntity(
|
||||||
id: serializer.fromJson<String>(json['id']),
|
id: serializer.fromJson<String>(json['id']),
|
||||||
role: serializer.fromJson<String?>(json['role']),
|
role: serializer.fromJson<String?>(json['role']),
|
||||||
|
language: serializer.fromJson<String?>(json['language']),
|
||||||
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
|
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
|
||||||
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
|
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
|
||||||
lastActive: serializer.fromJson<DateTime?>(json['lastActive']),
|
lastActive: serializer.fromJson<DateTime?>(json['lastActive']),
|
||||||
@@ -3119,6 +3203,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
return <String, dynamic>{
|
return <String, dynamic>{
|
||||||
'id': serializer.toJson<String>(id),
|
'id': serializer.toJson<String>(id),
|
||||||
'role': serializer.toJson<String?>(role),
|
'role': serializer.toJson<String?>(role),
|
||||||
|
'language': serializer.toJson<String?>(language),
|
||||||
'createdAt': serializer.toJson<DateTime>(createdAt),
|
'createdAt': serializer.toJson<DateTime>(createdAt),
|
||||||
'updatedAt': serializer.toJson<DateTime>(updatedAt),
|
'updatedAt': serializer.toJson<DateTime>(updatedAt),
|
||||||
'lastActive': serializer.toJson<DateTime?>(lastActive),
|
'lastActive': serializer.toJson<DateTime?>(lastActive),
|
||||||
@@ -3131,6 +3216,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
UserEntity copyWith(
|
UserEntity copyWith(
|
||||||
{String? id,
|
{String? id,
|
||||||
Value<String?> role = const Value.absent(),
|
Value<String?> role = const Value.absent(),
|
||||||
|
Value<String?> language = const Value.absent(),
|
||||||
DateTime? createdAt,
|
DateTime? createdAt,
|
||||||
DateTime? updatedAt,
|
DateTime? updatedAt,
|
||||||
Value<DateTime?> lastActive = const Value.absent(),
|
Value<DateTime?> lastActive = const Value.absent(),
|
||||||
@@ -3140,6 +3226,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
UserEntity(
|
UserEntity(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
role: role.present ? role.value : this.role,
|
role: role.present ? role.value : this.role,
|
||||||
|
language: language.present ? language.value : this.language,
|
||||||
createdAt: createdAt ?? this.createdAt,
|
createdAt: createdAt ?? this.createdAt,
|
||||||
updatedAt: updatedAt ?? this.updatedAt,
|
updatedAt: updatedAt ?? this.updatedAt,
|
||||||
lastActive: lastActive.present ? lastActive.value : this.lastActive,
|
lastActive: lastActive.present ? lastActive.value : this.lastActive,
|
||||||
@@ -3152,6 +3239,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
return (StringBuffer('UserEntity(')
|
return (StringBuffer('UserEntity(')
|
||||||
..write('id: $id, ')
|
..write('id: $id, ')
|
||||||
..write('role: $role, ')
|
..write('role: $role, ')
|
||||||
|
..write('language: $language, ')
|
||||||
..write('createdAt: $createdAt, ')
|
..write('createdAt: $createdAt, ')
|
||||||
..write('updatedAt: $updatedAt, ')
|
..write('updatedAt: $updatedAt, ')
|
||||||
..write('lastActive: $lastActive, ')
|
..write('lastActive: $lastActive, ')
|
||||||
@@ -3168,19 +3256,24 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
$mrjc(
|
$mrjc(
|
||||||
role.hashCode,
|
role.hashCode,
|
||||||
$mrjc(
|
$mrjc(
|
||||||
createdAt.hashCode,
|
language.hashCode,
|
||||||
$mrjc(
|
$mrjc(
|
||||||
updatedAt.hashCode,
|
createdAt.hashCode,
|
||||||
$mrjc(
|
$mrjc(
|
||||||
lastActive.hashCode,
|
updatedAt.hashCode,
|
||||||
$mrjc(online.hashCode,
|
$mrjc(
|
||||||
$mrjc(banned.hashCode, extraData.hashCode))))))));
|
lastActive.hashCode,
|
||||||
|
$mrjc(
|
||||||
|
online.hashCode,
|
||||||
|
$mrjc(
|
||||||
|
banned.hashCode, extraData.hashCode)))))))));
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
identical(this, other) ||
|
identical(this, other) ||
|
||||||
(other is UserEntity &&
|
(other is UserEntity &&
|
||||||
other.id == this.id &&
|
other.id == this.id &&
|
||||||
other.role == this.role &&
|
other.role == this.role &&
|
||||||
|
other.language == this.language &&
|
||||||
other.createdAt == this.createdAt &&
|
other.createdAt == this.createdAt &&
|
||||||
other.updatedAt == this.updatedAt &&
|
other.updatedAt == this.updatedAt &&
|
||||||
other.lastActive == this.lastActive &&
|
other.lastActive == this.lastActive &&
|
||||||
@@ -3192,6 +3285,7 @@ class UserEntity extends DataClass implements Insertable<UserEntity> {
|
|||||||
class UsersCompanion extends UpdateCompanion<UserEntity> {
|
class UsersCompanion extends UpdateCompanion<UserEntity> {
|
||||||
final Value<String> id;
|
final Value<String> id;
|
||||||
final Value<String?> role;
|
final Value<String?> role;
|
||||||
|
final Value<String?> language;
|
||||||
final Value<DateTime> createdAt;
|
final Value<DateTime> createdAt;
|
||||||
final Value<DateTime> updatedAt;
|
final Value<DateTime> updatedAt;
|
||||||
final Value<DateTime?> lastActive;
|
final Value<DateTime?> lastActive;
|
||||||
@@ -3201,6 +3295,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
const UsersCompanion({
|
const UsersCompanion({
|
||||||
this.id = const Value.absent(),
|
this.id = const Value.absent(),
|
||||||
this.role = const Value.absent(),
|
this.role = const Value.absent(),
|
||||||
|
this.language = const Value.absent(),
|
||||||
this.createdAt = const Value.absent(),
|
this.createdAt = const Value.absent(),
|
||||||
this.updatedAt = const Value.absent(),
|
this.updatedAt = const Value.absent(),
|
||||||
this.lastActive = const Value.absent(),
|
this.lastActive = const Value.absent(),
|
||||||
@@ -3211,6 +3306,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
UsersCompanion.insert({
|
UsersCompanion.insert({
|
||||||
required String id,
|
required String id,
|
||||||
this.role = const Value.absent(),
|
this.role = const Value.absent(),
|
||||||
|
this.language = const Value.absent(),
|
||||||
this.createdAt = const Value.absent(),
|
this.createdAt = const Value.absent(),
|
||||||
this.updatedAt = const Value.absent(),
|
this.updatedAt = const Value.absent(),
|
||||||
this.lastActive = const Value.absent(),
|
this.lastActive = const Value.absent(),
|
||||||
@@ -3222,6 +3318,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
static Insertable<UserEntity> custom({
|
static Insertable<UserEntity> custom({
|
||||||
Expression<String>? id,
|
Expression<String>? id,
|
||||||
Expression<String?>? role,
|
Expression<String?>? role,
|
||||||
|
Expression<String?>? language,
|
||||||
Expression<DateTime>? createdAt,
|
Expression<DateTime>? createdAt,
|
||||||
Expression<DateTime>? updatedAt,
|
Expression<DateTime>? updatedAt,
|
||||||
Expression<DateTime?>? lastActive,
|
Expression<DateTime?>? lastActive,
|
||||||
@@ -3232,6 +3329,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
return RawValuesInsertable({
|
return RawValuesInsertable({
|
||||||
if (id != null) 'id': id,
|
if (id != null) 'id': id,
|
||||||
if (role != null) 'role': role,
|
if (role != null) 'role': role,
|
||||||
|
if (language != null) 'language': language,
|
||||||
if (createdAt != null) 'created_at': createdAt,
|
if (createdAt != null) 'created_at': createdAt,
|
||||||
if (updatedAt != null) 'updated_at': updatedAt,
|
if (updatedAt != null) 'updated_at': updatedAt,
|
||||||
if (lastActive != null) 'last_active': lastActive,
|
if (lastActive != null) 'last_active': lastActive,
|
||||||
@@ -3244,6 +3342,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
UsersCompanion copyWith(
|
UsersCompanion copyWith(
|
||||||
{Value<String>? id,
|
{Value<String>? id,
|
||||||
Value<String?>? role,
|
Value<String?>? role,
|
||||||
|
Value<String?>? language,
|
||||||
Value<DateTime>? createdAt,
|
Value<DateTime>? createdAt,
|
||||||
Value<DateTime>? updatedAt,
|
Value<DateTime>? updatedAt,
|
||||||
Value<DateTime?>? lastActive,
|
Value<DateTime?>? lastActive,
|
||||||
@@ -3253,6 +3352,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
return UsersCompanion(
|
return UsersCompanion(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
role: role ?? this.role,
|
role: role ?? this.role,
|
||||||
|
language: language ?? this.language,
|
||||||
createdAt: createdAt ?? this.createdAt,
|
createdAt: createdAt ?? this.createdAt,
|
||||||
updatedAt: updatedAt ?? this.updatedAt,
|
updatedAt: updatedAt ?? this.updatedAt,
|
||||||
lastActive: lastActive ?? this.lastActive,
|
lastActive: lastActive ?? this.lastActive,
|
||||||
@@ -3271,6 +3371,9 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
if (role.present) {
|
if (role.present) {
|
||||||
map['role'] = Variable<String?>(role.value);
|
map['role'] = Variable<String?>(role.value);
|
||||||
}
|
}
|
||||||
|
if (language.present) {
|
||||||
|
map['language'] = Variable<String?>(language.value);
|
||||||
|
}
|
||||||
if (createdAt.present) {
|
if (createdAt.present) {
|
||||||
map['created_at'] = Variable<DateTime>(createdAt.value);
|
map['created_at'] = Variable<DateTime>(createdAt.value);
|
||||||
}
|
}
|
||||||
@@ -3299,6 +3402,7 @@ class UsersCompanion extends UpdateCompanion<UserEntity> {
|
|||||||
return (StringBuffer('UsersCompanion(')
|
return (StringBuffer('UsersCompanion(')
|
||||||
..write('id: $id, ')
|
..write('id: $id, ')
|
||||||
..write('role: $role, ')
|
..write('role: $role, ')
|
||||||
|
..write('language: $language, ')
|
||||||
..write('createdAt: $createdAt, ')
|
..write('createdAt: $createdAt, ')
|
||||||
..write('updatedAt: $updatedAt, ')
|
..write('updatedAt: $updatedAt, ')
|
||||||
..write('lastActive: $lastActive, ')
|
..write('lastActive: $lastActive, ')
|
||||||
@@ -3322,6 +3426,10 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> {
|
|||||||
late final GeneratedColumn<String?> role = GeneratedColumn<String?>(
|
late final GeneratedColumn<String?> role = GeneratedColumn<String?>(
|
||||||
'role', aliasedName, true,
|
'role', aliasedName, true,
|
||||||
typeName: 'TEXT', requiredDuringInsert: false);
|
typeName: 'TEXT', requiredDuringInsert: false);
|
||||||
|
final VerificationMeta _languageMeta = const VerificationMeta('language');
|
||||||
|
late final GeneratedColumn<String?> language = GeneratedColumn<String?>(
|
||||||
|
'language', aliasedName, true,
|
||||||
|
typeName: 'TEXT', requiredDuringInsert: false);
|
||||||
final VerificationMeta _createdAtMeta = const VerificationMeta('createdAt');
|
final VerificationMeta _createdAtMeta = const VerificationMeta('createdAt');
|
||||||
late final GeneratedColumn<DateTime?> createdAt = GeneratedColumn<DateTime?>(
|
late final GeneratedColumn<DateTime?> createdAt = GeneratedColumn<DateTime?>(
|
||||||
'created_at', aliasedName, false,
|
'created_at', aliasedName, false,
|
||||||
@@ -3358,8 +3466,17 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> {
|
|||||||
typeName: 'TEXT', requiredDuringInsert: true)
|
typeName: 'TEXT', requiredDuringInsert: true)
|
||||||
.withConverter<Map<String, Object?>>($UsersTable.$converter0);
|
.withConverter<Map<String, Object?>>($UsersTable.$converter0);
|
||||||
@override
|
@override
|
||||||
List<GeneratedColumn> get $columns =>
|
List<GeneratedColumn> get $columns => [
|
||||||
[id, role, createdAt, updatedAt, lastActive, online, banned, extraData];
|
id,
|
||||||
|
role,
|
||||||
|
language,
|
||||||
|
createdAt,
|
||||||
|
updatedAt,
|
||||||
|
lastActive,
|
||||||
|
online,
|
||||||
|
banned,
|
||||||
|
extraData
|
||||||
|
];
|
||||||
@override
|
@override
|
||||||
String get aliasedName => _alias ?? 'users';
|
String get aliasedName => _alias ?? 'users';
|
||||||
@override
|
@override
|
||||||
@@ -3378,6 +3495,10 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> {
|
|||||||
context.handle(
|
context.handle(
|
||||||
_roleMeta, role.isAcceptableOrUnknown(data['role']!, _roleMeta));
|
_roleMeta, role.isAcceptableOrUnknown(data['role']!, _roleMeta));
|
||||||
}
|
}
|
||||||
|
if (data.containsKey('language')) {
|
||||||
|
context.handle(_languageMeta,
|
||||||
|
language.isAcceptableOrUnknown(data['language']!, _languageMeta));
|
||||||
|
}
|
||||||
if (data.containsKey('created_at')) {
|
if (data.containsKey('created_at')) {
|
||||||
context.handle(_createdAtMeta,
|
context.handle(_createdAtMeta,
|
||||||
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta));
|
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta));
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ class Messages extends Table {
|
|||||||
TextColumn get channelCid => text().nullable().customConstraint(
|
TextColumn get channelCid => text().nullable().customConstraint(
|
||||||
'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE')();
|
'NULLABLE REFERENCES channels(cid) ON DELETE CASCADE')();
|
||||||
|
|
||||||
|
/// A Map of [messageText] translations.
|
||||||
|
TextColumn get i18n => text().nullable().map(MapConverter<String>())();
|
||||||
|
|
||||||
/// Message custom extraData
|
/// Message custom extraData
|
||||||
TextColumn get extraData => text().nullable().map(MapConverter<Object?>())();
|
TextColumn get extraData => text().nullable().map(MapConverter<Object?>())();
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ class Users extends Table {
|
|||||||
/// User role
|
/// User role
|
||||||
TextColumn get role => text().nullable()();
|
TextColumn get role => text().nullable()();
|
||||||
|
|
||||||
|
/// The language this user prefers.
|
||||||
|
TextColumn get language => text().nullable()();
|
||||||
|
|
||||||
/// Date of user creation
|
/// Date of user creation
|
||||||
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
|
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ extension MessageEntityX on MessageEntity {
|
|||||||
pinnedBy: pinnedBy,
|
pinnedBy: pinnedBy,
|
||||||
mentionedUsers:
|
mentionedUsers:
|
||||||
mentionedUsers.map((e) => User.fromJson(jsonDecode(e))).toList(),
|
mentionedUsers.map((e) => User.fromJson(jsonDecode(e))).toList(),
|
||||||
|
i18n: i18n,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,5 +76,6 @@ extension MessageX on Message {
|
|||||||
pinnedAt: pinnedAt,
|
pinnedAt: pinnedAt,
|
||||||
pinExpires: pinExpires,
|
pinExpires: pinExpires,
|
||||||
pinnedByUserId: pinnedBy?.id,
|
pinnedByUserId: pinnedBy?.id,
|
||||||
|
i18n: i18n,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ extension PinnedMessageEntityX on PinnedMessageEntity {
|
|||||||
pinnedAt: pinnedAt,
|
pinnedAt: pinnedAt,
|
||||||
pinExpires: pinExpires,
|
pinExpires: pinExpires,
|
||||||
pinnedBy: pinnedBy,
|
pinnedBy: pinnedBy,
|
||||||
|
mentionedUsers:
|
||||||
|
mentionedUsers.map((e) => User.fromJson(jsonDecode(e))).toList(),
|
||||||
|
i18n: i18n,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,5 +76,6 @@ extension PMessageX on Message {
|
|||||||
pinnedAt: pinnedAt,
|
pinnedAt: pinnedAt,
|
||||||
pinExpires: pinExpires,
|
pinExpires: pinExpires,
|
||||||
pinnedByUserId: pinnedBy?.id,
|
pinnedByUserId: pinnedBy?.id,
|
||||||
|
i18n: i18n,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ extension UserEntityX on UserEntity {
|
|||||||
User toUser() => User(
|
User toUser() => User(
|
||||||
id: id,
|
id: id,
|
||||||
updatedAt: updatedAt,
|
updatedAt: updatedAt,
|
||||||
|
language: language,
|
||||||
role: role,
|
role: role,
|
||||||
online: online,
|
online: online,
|
||||||
lastActive: lastActive,
|
lastActive: lastActive,
|
||||||
@@ -22,6 +23,7 @@ extension UserX on User {
|
|||||||
UserEntity toEntity() => UserEntity(
|
UserEntity toEntity() => UserEntity(
|
||||||
id: id,
|
id: id,
|
||||||
role: role,
|
role: role,
|
||||||
|
language: language,
|
||||||
createdAt: createdAt,
|
createdAt: createdAt,
|
||||||
updatedAt: updatedAt,
|
updatedAt: updatedAt,
|
||||||
lastActive: lastActive,
|
lastActive: lastActive,
|
||||||
|
|||||||
@@ -35,10 +35,15 @@ void main() {
|
|||||||
replyCount: index,
|
replyCount: index,
|
||||||
updatedAt: DateTime.now(),
|
updatedAt: DateTime.now(),
|
||||||
extraData: const {'extra_test_field': 'extraTestData'},
|
extraData: const {'extra_test_field': 'extraTestData'},
|
||||||
text: 'Dummy text #$index',
|
text: 'Hello #$index',
|
||||||
pinned: math.Random().nextBool(),
|
pinned: math.Random().nextBool(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedBy: User(id: 'testUserId$index'),
|
pinnedBy: User(id: 'testUserId$index'),
|
||||||
|
i18n: {
|
||||||
|
'en_text': 'Hello #$index',
|
||||||
|
'hi_text': 'नमस्ते #$index',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final quotedMessages = List.generate(
|
final quotedMessages = List.generate(
|
||||||
@@ -52,11 +57,16 @@ void main() {
|
|||||||
replyCount: index,
|
replyCount: index,
|
||||||
updatedAt: DateTime.now(),
|
updatedAt: DateTime.now(),
|
||||||
extraData: const {'extra_test_field': 'extraTestData'},
|
extraData: const {'extra_test_field': 'extraTestData'},
|
||||||
text: 'Dummy text #$index',
|
text: 'Hello #$index',
|
||||||
quotedMessageId: messages[index].id,
|
quotedMessageId: messages[index].id,
|
||||||
pinned: math.Random().nextBool(),
|
pinned: math.Random().nextBool(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedBy: User(id: 'testUserId$index'),
|
pinnedBy: User(id: 'testUserId$index'),
|
||||||
|
i18n: {
|
||||||
|
'en_text': 'Hello #$index',
|
||||||
|
'hi_text': 'नमस्ते #$index',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final threadMessages = List.generate(
|
final threadMessages = List.generate(
|
||||||
@@ -72,10 +82,15 @@ void main() {
|
|||||||
replyCount: index,
|
replyCount: index,
|
||||||
updatedAt: DateTime.now(),
|
updatedAt: DateTime.now(),
|
||||||
extraData: const {'extra_test_field': 'extraTestData'},
|
extraData: const {'extra_test_field': 'extraTestData'},
|
||||||
text: 'Dummy text #$index',
|
text: 'Hello #$index',
|
||||||
pinned: math.Random().nextBool(),
|
pinned: math.Random().nextBool(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedBy: User(id: 'testUserId$index'),
|
pinnedBy: User(id: 'testUserId$index'),
|
||||||
|
i18n: {
|
||||||
|
'en_text': 'Hello #$index',
|
||||||
|
'hi_text': 'नमस्ते #$index',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final allMessages = [
|
final allMessages = [
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ void main() {
|
|||||||
(index) => User(
|
(index) => User(
|
||||||
id: 'testUserId$index',
|
id: 'testUserId$index',
|
||||||
role: 'testRole',
|
role: 'testRole',
|
||||||
|
language: 'hi',
|
||||||
createdAt: DateTime.now(),
|
createdAt: DateTime.now(),
|
||||||
updatedAt: DateTime.now(),
|
updatedAt: DateTime.now(),
|
||||||
lastActive: DateTime.now(),
|
lastActive: DateTime.now(),
|
||||||
|
|||||||
@@ -56,11 +56,16 @@ void main() {
|
|||||||
extraData: {'extra_test_data': 'extraData'},
|
extraData: {'extra_test_data': 'extraData'},
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
deletedAt: DateTime.now(),
|
deletedAt: DateTime.now(),
|
||||||
messageText: 'dummy text',
|
messageText: 'Hello',
|
||||||
pinned: true,
|
pinned: true,
|
||||||
pinExpires: DateTime.now().toUtc(),
|
pinExpires: DateTime.now().toUtc(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedByUserId: user.id,
|
pinnedByUserId: user.id,
|
||||||
|
i18n: const {
|
||||||
|
'en_text': 'Hello',
|
||||||
|
'hi_text': 'नमस्ते',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
);
|
);
|
||||||
final message = entity.toMessage(
|
final message = entity.toMessage(
|
||||||
user: user,
|
user: user,
|
||||||
@@ -99,6 +104,7 @@ void main() {
|
|||||||
expect(message.pinnedBy!.id, entity.pinnedByUserId);
|
expect(message.pinnedBy!.id, entity.pinnedByUserId);
|
||||||
expect(message.reactionCounts, entity.reactionCounts);
|
expect(message.reactionCounts, entity.reactionCounts);
|
||||||
expect(message.reactionScores, entity.reactionScores);
|
expect(message.reactionScores, entity.reactionScores);
|
||||||
|
expect(message.i18n, entity.i18n);
|
||||||
for (var i = 0; i < message.attachments.length; i++) {
|
for (var i = 0; i < message.attachments.length; i++) {
|
||||||
final messageAttachment = message.attachments[i];
|
final messageAttachment = message.attachments[i];
|
||||||
final entityAttachmentData = jsonDecode(entity.attachments[i]);
|
final entityAttachmentData = jsonDecode(entity.attachments[i]);
|
||||||
@@ -156,11 +162,16 @@ void main() {
|
|||||||
extraData: const {'extra_test_data': 'extraData'},
|
extraData: const {'extra_test_data': 'extraData'},
|
||||||
user: user,
|
user: user,
|
||||||
deletedAt: DateTime.now(),
|
deletedAt: DateTime.now(),
|
||||||
text: 'dummy text',
|
text: 'Hello',
|
||||||
pinned: true,
|
pinned: true,
|
||||||
pinExpires: DateTime.now(),
|
pinExpires: DateTime.now(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedBy: user,
|
pinnedBy: user,
|
||||||
|
i18n: const {
|
||||||
|
'en_text': 'Hello',
|
||||||
|
'hi_text': 'नमस्ते',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
);
|
);
|
||||||
final entity = message.toEntity(cid: cid);
|
final entity = message.toEntity(cid: cid);
|
||||||
expect(entity, isA<MessageEntity>());
|
expect(entity, isA<MessageEntity>());
|
||||||
@@ -193,5 +204,6 @@ void main() {
|
|||||||
entity.attachments,
|
entity.attachments,
|
||||||
message.attachments.map((it) => jsonEncode(it.toData())).toList(),
|
message.attachments.map((it) => jsonEncode(it.toData())).toList(),
|
||||||
);
|
);
|
||||||
|
expect(entity.i18n, message.i18n);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,11 +54,16 @@ void main() {
|
|||||||
extraData: {'extra_test_data': 'extraData'},
|
extraData: {'extra_test_data': 'extraData'},
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
deletedAt: DateTime.now(),
|
deletedAt: DateTime.now(),
|
||||||
messageText: 'dummy text',
|
messageText: 'Hello',
|
||||||
pinned: true,
|
pinned: true,
|
||||||
pinExpires: DateTime.now().toUtc(),
|
pinExpires: DateTime.now().toUtc(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedByUserId: user.id,
|
pinnedByUserId: user.id,
|
||||||
|
i18n: const {
|
||||||
|
'en_text': 'Hello',
|
||||||
|
'hi_text': 'नमस्ते',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
);
|
);
|
||||||
final message = entity.toMessage(
|
final message = entity.toMessage(
|
||||||
user: user,
|
user: user,
|
||||||
@@ -92,6 +97,7 @@ void main() {
|
|||||||
expect(message.pinnedBy!.id, entity.pinnedByUserId);
|
expect(message.pinnedBy!.id, entity.pinnedByUserId);
|
||||||
expect(message.reactionCounts, entity.reactionCounts);
|
expect(message.reactionCounts, entity.reactionCounts);
|
||||||
expect(message.reactionScores, entity.reactionScores);
|
expect(message.reactionScores, entity.reactionScores);
|
||||||
|
expect(message.i18n, entity.i18n);
|
||||||
for (var i = 0; i < message.attachments.length; i++) {
|
for (var i = 0; i < message.attachments.length; i++) {
|
||||||
final messageAttachment = message.attachments[i];
|
final messageAttachment = message.attachments[i];
|
||||||
final entityAttachmentData = jsonDecode(entity.attachments[i]);
|
final entityAttachmentData = jsonDecode(entity.attachments[i]);
|
||||||
@@ -146,11 +152,16 @@ void main() {
|
|||||||
extraData: const {'extra_test_data': 'extraData'},
|
extraData: const {'extra_test_data': 'extraData'},
|
||||||
user: user,
|
user: user,
|
||||||
deletedAt: DateTime.now(),
|
deletedAt: DateTime.now(),
|
||||||
text: 'dummy text',
|
text: 'Hello',
|
||||||
pinned: true,
|
pinned: true,
|
||||||
pinExpires: DateTime.now(),
|
pinExpires: DateTime.now(),
|
||||||
pinnedAt: DateTime.now(),
|
pinnedAt: DateTime.now(),
|
||||||
pinnedBy: user,
|
pinnedBy: user,
|
||||||
|
i18n: const {
|
||||||
|
'en_text': 'Hello',
|
||||||
|
'hi_text': 'नमस्ते',
|
||||||
|
'language': 'en',
|
||||||
|
},
|
||||||
);
|
);
|
||||||
final entity = message.toPinnedEntity(cid: cid);
|
final entity = message.toPinnedEntity(cid: cid);
|
||||||
expect(entity, isA<PinnedMessageEntity>());
|
expect(entity, isA<PinnedMessageEntity>());
|
||||||
@@ -181,5 +192,6 @@ void main() {
|
|||||||
entity.attachments,
|
entity.attachments,
|
||||||
message.attachments.map((it) => jsonEncode(it.toData())).toList(),
|
message.attachments.map((it) => jsonEncode(it.toData())).toList(),
|
||||||
);
|
);
|
||||||
|
expect(entity.i18n, message.i18n);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ void main() {
|
|||||||
final entity = UserEntity(
|
final entity = UserEntity(
|
||||||
id: 'testUserId',
|
id: 'testUserId',
|
||||||
role: 'testType',
|
role: 'testType',
|
||||||
|
language: 'hi',
|
||||||
createdAt: DateTime.now(),
|
createdAt: DateTime.now(),
|
||||||
updatedAt: DateTime.now(),
|
updatedAt: DateTime.now(),
|
||||||
lastActive: DateTime.now(),
|
lastActive: DateTime.now(),
|
||||||
@@ -22,6 +23,7 @@ void main() {
|
|||||||
expect(user, isA<User>());
|
expect(user, isA<User>());
|
||||||
expect(user.id, entity.id);
|
expect(user.id, entity.id);
|
||||||
expect(user.role, entity.role);
|
expect(user.role, entity.role);
|
||||||
|
expect(user.language, entity.language);
|
||||||
expect(user.createdAt, isSameDateAs(entity.createdAt));
|
expect(user.createdAt, isSameDateAs(entity.createdAt));
|
||||||
expect(user.updatedAt, isSameDateAs(entity.updatedAt));
|
expect(user.updatedAt, isSameDateAs(entity.updatedAt));
|
||||||
expect(user.lastActive, isSameDateAs(entity.lastActive!));
|
expect(user.lastActive, isSameDateAs(entity.lastActive!));
|
||||||
@@ -34,6 +36,7 @@ void main() {
|
|||||||
final user = User(
|
final user = User(
|
||||||
id: 'testUserId',
|
id: 'testUserId',
|
||||||
role: 'testType',
|
role: 'testType',
|
||||||
|
language: 'hi',
|
||||||
createdAt: DateTime.now(),
|
createdAt: DateTime.now(),
|
||||||
updatedAt: DateTime.now(),
|
updatedAt: DateTime.now(),
|
||||||
lastActive: DateTime.now(),
|
lastActive: DateTime.now(),
|
||||||
@@ -45,6 +48,7 @@ void main() {
|
|||||||
expect(entity, isA<UserEntity>());
|
expect(entity, isA<UserEntity>());
|
||||||
expect(entity.id, user.id);
|
expect(entity.id, user.id);
|
||||||
expect(entity.role, user.role);
|
expect(entity.role, user.role);
|
||||||
|
expect(entity.language, user.language);
|
||||||
expect(entity.createdAt, isSameDateAs(user.createdAt));
|
expect(entity.createdAt, isSameDateAs(user.createdAt));
|
||||||
expect(entity.updatedAt, isSameDateAs(user.updatedAt));
|
expect(entity.updatedAt, isSameDateAs(user.updatedAt));
|
||||||
expect(entity.lastActive, isSameDateAs(user.lastActive!));
|
expect(entity.lastActive, isSameDateAs(user.lastActive!));
|
||||||
|
|||||||
Reference in New Issue
Block a user