diff --git a/packages/stream_chat/lib/src/core/models/own_user.dart b/packages/stream_chat/lib/src/core/models/own_user.dart index 116a2f84..fb5b1caf 100644 --- a/packages/stream_chat/lib/src/core/models/own_user.dart +++ b/packages/stream_chat/lib/src/core/models/own_user.dart @@ -27,7 +27,7 @@ class OwnUser extends User { Map extraData = const {}, bool banned = false, List teams = const [], - String language = 'en', + String? language, }) : super( id: id, role: role, diff --git a/packages/stream_chat/lib/src/core/models/own_user.g.dart b/packages/stream_chat/lib/src/core/models/own_user.g.dart index 5d80cc1c..f5ad08a7 100644 --- a/packages/stream_chat/lib/src/core/models/own_user.g.dart +++ b/packages/stream_chat/lib/src/core/models/own_user.g.dart @@ -39,6 +39,6 @@ OwnUser _$OwnUserFromJson(Map json) { teams: (json['teams'] as List?)?.map((e) => e as String).toList() ?? [], - language: json['language'] as String? ?? 'en', + language: json['language'] as String, ); } diff --git a/packages/stream_chat/lib/src/core/models/user.dart b/packages/stream_chat/lib/src/core/models/user.dart index dd4abcc6..a7e7a51e 100644 --- a/packages/stream_chat/lib/src/core/models/user.dart +++ b/packages/stream_chat/lib/src/core/models/user.dart @@ -18,7 +18,7 @@ class User extends Equatable { this.extraData = const {}, this.banned = false, this.teams = const [], - this.language = 'en', + this.language, }) : createdAt = createdAt ?? DateTime.now(), updatedAt = updatedAt ?? DateTime.now(); @@ -87,12 +87,8 @@ class User extends Equatable { /// The language this user prefers. /// /// Defaults to 'en'. - @JsonKey( - includeIfNull: false, - toJson: Serializer.readOnly, - defaultValue: 'en', - ) - final String language; + @JsonKey(includeIfNull: false) + final String? language; /// Shortcut for user name String get name { diff --git a/packages/stream_chat/lib/src/core/models/user.g.dart b/packages/stream_chat/lib/src/core/models/user.g.dart index 7b193f04..dd3183d5 100644 --- a/packages/stream_chat/lib/src/core/models/user.g.dart +++ b/packages/stream_chat/lib/src/core/models/user.g.dart @@ -25,7 +25,7 @@ User _$UserFromJson(Map json) { teams: (json['teams'] as List?)?.map((e) => e as String).toList() ?? [], - language: json['language'] as String? ?? 'en', + language: json['language'] as String?, ); } @@ -48,6 +48,6 @@ Map _$UserToJson(User instance) { writeNotNull('online', readonly(instance.online)); writeNotNull('banned', readonly(instance.banned)); val['extra_data'] = instance.extraData; - writeNotNull('language', readonly(instance.language)); + writeNotNull('language', instance.language); return val; } diff --git a/packages/stream_chat_flutter/test/utils/golden.dart b/packages/stream_chat_flutter/test/utils/golden.dart new file mode 100644 index 00000000..4fc0aff3 --- /dev/null +++ b/packages/stream_chat_flutter/test/utils/golden.dart @@ -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 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 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; + } +} diff --git a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart index 6274e932..a61d1e6e 100644 --- a/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart +++ b/packages/stream_chat_persistence/lib/src/db/moor_chat_database.g.dart @@ -3105,7 +3105,7 @@ class UserEntity extends DataClass implements Insertable { final String? role; /// The language this user prefers. - final String language; + final String? language; /// Date of user creation final DateTime createdAt; @@ -3127,7 +3127,7 @@ class UserEntity extends DataClass implements Insertable { UserEntity( {required this.id, this.role, - required this.language, + this.language, required this.createdAt, required this.updatedAt, this.lastActive, @@ -3143,7 +3143,7 @@ class UserEntity extends DataClass implements Insertable { role: const StringType() .mapFromDatabaseResponse(data['${effectivePrefix}role']), language: const StringType() - .mapFromDatabaseResponse(data['${effectivePrefix}language'])!, + .mapFromDatabaseResponse(data['${effectivePrefix}language']), createdAt: const DateTimeType() .mapFromDatabaseResponse(data['${effectivePrefix}created_at'])!, updatedAt: const DateTimeType() @@ -3165,7 +3165,9 @@ class UserEntity extends DataClass implements Insertable { if (!nullToAbsent || role != null) { map['role'] = Variable(role); } - map['language'] = Variable(language); + if (!nullToAbsent || language != null) { + map['language'] = Variable(language); + } map['created_at'] = Variable(createdAt); map['updated_at'] = Variable(updatedAt); if (!nullToAbsent || lastActive != null) { @@ -3186,7 +3188,7 @@ class UserEntity extends DataClass implements Insertable { return UserEntity( id: serializer.fromJson(json['id']), role: serializer.fromJson(json['role']), - language: serializer.fromJson(json['language']), + language: serializer.fromJson(json['language']), createdAt: serializer.fromJson(json['createdAt']), updatedAt: serializer.fromJson(json['updatedAt']), lastActive: serializer.fromJson(json['lastActive']), @@ -3201,7 +3203,7 @@ class UserEntity extends DataClass implements Insertable { return { 'id': serializer.toJson(id), 'role': serializer.toJson(role), - 'language': serializer.toJson(language), + 'language': serializer.toJson(language), 'createdAt': serializer.toJson(createdAt), 'updatedAt': serializer.toJson(updatedAt), 'lastActive': serializer.toJson(lastActive), @@ -3214,7 +3216,7 @@ class UserEntity extends DataClass implements Insertable { UserEntity copyWith( {String? id, Value role = const Value.absent(), - String? language, + Value language = const Value.absent(), DateTime? createdAt, DateTime? updatedAt, Value lastActive = const Value.absent(), @@ -3224,7 +3226,7 @@ class UserEntity extends DataClass implements Insertable { UserEntity( id: id ?? this.id, role: role.present ? role.value : this.role, - language: language ?? this.language, + language: language.present ? language.value : this.language, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, lastActive: lastActive.present ? lastActive.value : this.lastActive, @@ -3283,7 +3285,7 @@ class UserEntity extends DataClass implements Insertable { class UsersCompanion extends UpdateCompanion { final Value id; final Value role; - final Value language; + final Value language; final Value createdAt; final Value updatedAt; final Value lastActive; @@ -3316,7 +3318,7 @@ class UsersCompanion extends UpdateCompanion { static Insertable custom({ Expression? id, Expression? role, - Expression? language, + Expression? language, Expression? createdAt, Expression? updatedAt, Expression? lastActive, @@ -3340,7 +3342,7 @@ class UsersCompanion extends UpdateCompanion { UsersCompanion copyWith( {Value? id, Value? role, - Value? language, + Value? language, Value? createdAt, Value? updatedAt, Value? lastActive, @@ -3370,7 +3372,7 @@ class UsersCompanion extends UpdateCompanion { map['role'] = Variable(role.value); } if (language.present) { - map['language'] = Variable(language.value); + map['language'] = Variable(language.value); } if (createdAt.present) { map['created_at'] = Variable(createdAt.value); @@ -3426,10 +3428,8 @@ class $UsersTable extends Users with TableInfo<$UsersTable, UserEntity> { typeName: 'TEXT', requiredDuringInsert: false); final VerificationMeta _languageMeta = const VerificationMeta('language'); late final GeneratedColumn language = GeneratedColumn( - 'language', aliasedName, false, - typeName: 'TEXT', - requiredDuringInsert: false, - defaultValue: const Constant('en')); + 'language', aliasedName, true, + typeName: 'TEXT', requiredDuringInsert: false); final VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', aliasedName, false, diff --git a/packages/stream_chat_persistence/lib/src/entity/users.dart b/packages/stream_chat_persistence/lib/src/entity/users.dart index 49aae500..286bfb40 100644 --- a/packages/stream_chat_persistence/lib/src/entity/users.dart +++ b/packages/stream_chat_persistence/lib/src/entity/users.dart @@ -12,7 +12,7 @@ class Users extends Table { TextColumn get role => text().nullable()(); /// The language this user prefers. - TextColumn get language => text().withDefault(const Constant('en'))(); + TextColumn get language => text().nullable()(); /// Date of user creation DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();