Merge pull request #607 from GetStream/cds-365

feat(llc, ui): add name, image property to User and OwnUser
This commit is contained in:
Sahil Kumar
2021-08-05 17:55:42 +05:30
committed by GitHub
15 changed files with 447 additions and 113 deletions
+5
View File
@@ -4,6 +4,11 @@
- Fixed `channel.markAllRead` throwing failed host lookup.
✅ Added
- `User` and `OwnUser` classes now have an `image` property. Setting an image will also set the 'image' key on `extraData`, so `user.image` and `user.extraData['image']` is the same.
- `User` and `OwnUser` classes now have a `name` property. Setting a name will also set the 'name' key on `extraData`, so `user.name` and `user.extraData['name']` is the same.
## 2.1.1
🐞 Fixed
+3 -4
View File
@@ -13,10 +13,9 @@ Future<void> main() async {
await client.connectUser(
User(
id: 'cool-shadow-7',
extraData: const {
'image':
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow',
},
name: 'Cool Shadow',
image:
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow',
),
'''eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiY29vbC1zaGFkb3ctNyJ9.gkOlCRb1qgy4joHPaxFwPOdXcGvSPvp6QY0S4mpRkVo''',
);
@@ -7,11 +7,12 @@ import 'package:stream_chat/stream_chat.dart';
part 'own_user.g.dart';
/// The class that defines the own user model
/// This object can be found in [Event]
/// The class that defines the own user model.
///
/// This object can be found in [Event].
@JsonSerializable(createToJson: false)
class OwnUser extends User {
/// Constructor used for json serialization
/// Constructor used for json serialization.
OwnUser({
this.devices = const [],
this.mutes = const [],
@@ -20,6 +21,8 @@ class OwnUser extends User {
this.channelMutes = const [],
required String id,
String? role,
String? name,
String? image,
DateTime? createdAt,
DateTime? updatedAt,
DateTime? lastActive,
@@ -31,6 +34,8 @@ class OwnUser extends User {
}) : super(
id: id,
role: role,
name: name,
image: image,
createdAt: createdAt,
updatedAt: updatedAt,
lastActive: lastActive,
@@ -41,14 +46,16 @@ class OwnUser extends User {
language: language,
);
/// Create a new instance from a json
/// Create a new instance from json.
factory OwnUser.fromJson(Map<String, dynamic> json) => _$OwnUserFromJson(
Serializer.moveToExtraDataFromRoot(json, topLevelFields));
/// Create a new instance from [User] object
/// Create a new instance from [User] object.
factory OwnUser.fromUser(User user) => OwnUser(
id: user.id,
role: user.role,
name: user.name,
image: user.image,
createdAt: user.createdAt,
updatedAt: user.updatedAt,
lastActive: user.lastActive,
@@ -64,6 +71,8 @@ class OwnUser extends User {
OwnUser copyWith({
String? id,
String? role,
String? name,
String? image,
DateTime? createdAt,
DateTime? updatedAt,
DateTime? lastActive,
@@ -80,8 +89,12 @@ class OwnUser extends User {
}) =>
OwnUser(
id: id ?? this.id,
banned: banned ?? this.banned,
role: role ?? this.role,
/* if null, it will be retrieved from extraData['name']*/
name: name,
/* if null, it will be retrieved from extraData['image']*/
image: image,
banned: banned ?? this.banned,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
lastActive: lastActive ?? this.lastActive,
@@ -101,16 +114,18 @@ class OwnUser extends User {
OwnUser merge(OwnUser? other) {
if (other == null) return this;
return copyWith(
id: other.id,
role: other.role,
name: other.name,
image: other.image,
banned: other.banned,
channelMutes: other.channelMutes,
createdAt: other.createdAt,
devices: other.devices,
extraData: other.extraData,
id: other.id,
lastActive: other.lastActive,
mutes: other.mutes,
online: other.online,
role: other.role,
teams: other.teams,
totalUnreadCount: other.totalUnreadCount,
unreadChannels: other.unreadChannels,
@@ -119,27 +134,28 @@ class OwnUser extends User {
);
}
/// List of user devices
/// List of user devices.
@JsonKey(includeIfNull: false, defaultValue: <Device>[])
final List<Device> devices;
/// List of users muted by the user
/// List of users muted by the user.
@JsonKey(includeIfNull: false, defaultValue: <Mute>[])
final List<Mute> mutes;
/// List of users muted by the user
/// List of users muted by the user.
@JsonKey(includeIfNull: false, defaultValue: <Mute>[])
final List<Mute> channelMutes;
/// Total unread messages by the user
/// Total unread messages by the user.
@JsonKey(includeIfNull: false, defaultValue: 0)
final int totalUnreadCount;
/// Total unread channels by the user
/// Total unread channels by the user.
@JsonKey(includeIfNull: false)
final int? unreadChannels;
/// Known top level fields.
///
/// Useful for [Serializer] methods.
static final topLevelFields = [
'devices',
@@ -4,29 +4,60 @@ import 'package:stream_chat/src/core/util/serializer.dart';
part 'user.g.dart';
/// The class that defines the user model
/// Class that defines a Stream Chat User.
@JsonSerializable()
class User extends Equatable {
/// Constructor used for json serialization
/// Creates a new user.
///
/// {@template name}
/// If an [name] is provided it will be set on [extraData] with a `key`
/// of 'name'.
///
/// For example:
/// ```dart
/// final user = User(id: 'id', name: 'Sahil Kumar');
/// print(user.name == user.extraData['name']); // true
/// ```
/// {@endtemplate}
///
/// {@template image}
/// If an [image] is provided it will be set on [extraData] with a `key`
/// of 'image'.
///
/// For example:
/// ```dart
/// final user = User(id: 'id', image: 'https://getstream.io/image.png');
/// print(user.image == user.extraData['image']); // true
/// ```
/// {@endtemplate}
User({
required this.id,
this.role,
String? name,
String? image,
DateTime? createdAt,
DateTime? updatedAt,
this.lastActive,
Map<String, Object?> extraData = const {},
this.online = false,
this.extraData = const {},
this.banned = false,
this.teams = const [],
this.language,
}) : createdAt = createdAt ?? DateTime.now(),
updatedAt = updatedAt ?? DateTime.now();
updatedAt = updatedAt ?? DateTime.now(),
/*For backwards compatibility, set 'name', 'image' in [extraData].*/
extraData = {
...extraData,
if (name != null) 'name': name,
if (image != null) 'image': image,
};
/// Create a new instance from a json
/// Create a new instance from json.
factory User.fromJson(Map<String, dynamic> json) =>
_$UserFromJson(Serializer.moveToExtraDataFromRoot(json, topLevelFields));
/// Known top level fields.
///
/// Useful for [Serializer] methods.
static const topLevelFields = [
'id',
@@ -40,57 +71,13 @@ class User extends Equatable {
'language',
];
/// User id
/// User id.
final String id;
/// User role
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final String? role;
/// User role
@JsonKey(
includeIfNull: false,
toJson: Serializer.readOnly,
defaultValue: <String>[],
)
final List<String> teams;
/// Date of user creation
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final DateTime createdAt;
/// Date of last user update
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final DateTime updatedAt;
/// Date of last user connection
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final DateTime? lastActive;
/// True if user is online
@JsonKey(
includeIfNull: false, toJson: Serializer.readOnly, defaultValue: false)
final bool online;
/// True if user is banned from the chat
@JsonKey(
includeIfNull: false, toJson: Serializer.readOnly, defaultValue: false)
final bool banned;
/// Map of custom user extraData
@JsonKey(
includeIfNull: false,
defaultValue: {},
)
final Map<String, Object?> extraData;
/// The language this user prefers.
/// Shortcut for user name.
///
/// Defaults to 'en'.
@JsonKey(includeIfNull: false)
final String? language;
/// Shortcut for user name
/// {@macro name}
@JsonKey(ignore: true)
String get name {
if (extraData.containsKey('name')) {
final name = extraData['name']! as String;
@@ -99,11 +86,62 @@ class User extends Equatable {
return id;
}
/// List of users to list of userIds
/// Shortcut for user image.
///
/// {@macro image}
@JsonKey(ignore: true)
String? get image => extraData['image'] as String?;
/// User role.
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final String? role;
/// User teams
@JsonKey(
includeIfNull: false,
toJson: Serializer.readOnly,
defaultValue: <String>[],
)
final List<String> teams;
/// Date of user creation.
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final DateTime createdAt;
/// Date of last user update.
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final DateTime updatedAt;
/// Date of last user connection.
@JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final DateTime? lastActive;
/// True if user is online.
@JsonKey(
includeIfNull: false, toJson: Serializer.readOnly, defaultValue: false)
final bool online;
/// True if user is banned from the chat.
@JsonKey(
includeIfNull: false, toJson: Serializer.readOnly, defaultValue: false)
final bool banned;
/// Map of custom user extraData.
@JsonKey(
includeIfNull: false,
defaultValue: {},
)
final Map<String, Object?> extraData;
/// The language this user prefers.
@JsonKey(includeIfNull: false)
final String? language;
/// List of users to list of userIds.
static List<String>? toIds(List<User>? users) =>
users?.map((u) => u.id).toList();
/// Serialize to json
/// Serialize to json.
Map<String, dynamic> toJson() => Serializer.moveFromExtraDataToRoot(
_$UserToJson(this),
);
@@ -112,6 +150,8 @@ class User extends Equatable {
User copyWith({
String? id,
String? role,
String? name,
String? image,
DateTime? createdAt,
DateTime? updatedAt,
DateTime? lastActive,
@@ -124,6 +164,10 @@ class User extends Equatable {
User(
id: id ?? this.id,
role: role ?? this.role,
/* if null, it will be retrieved from extraData['name']*/
name: name,
/* if null, it will be retrieved from extraData['image']*/
image: image,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
lastActive: lastActive ?? this.lastActive,
@@ -135,5 +179,5 @@ class User extends Equatable {
);
@override
List<Object?> get props => [id];
List<Object?> get props => [id, role];
}
@@ -19,8 +19,8 @@ User _$UserFromJson(Map<String, dynamic> json) {
lastActive: json['last_active'] == null
? null
: DateTime.parse(json['last_active'] as String),
online: json['online'] as bool? ?? false,
extraData: json['extra_data'] as Map<String, dynamic>? ?? {},
online: json['online'] as bool? ?? false,
banned: json['banned'] as bool? ?? false,
teams:
(json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ??
+11
View File
@@ -2,5 +2,16 @@
"id": "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e",
"role": "test-role",
"name": "John",
"image": "https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow",
"extraDataStringTest": "Extra data test",
"extraDataIntTest": 1,
"extraDataDoubleTest": 1.1,
"extraDataBoolTest": true,
"banned": true,
"online": true,
"teams": ["team-1", "team-2"],
"created_at": "2021-08-03 12:39:21.817646",
"updated_at": "2021-08-04 12:39:21.817646",
"last_active" : "2021-08-05 12:39:21.817646",
"language": "en"
}
@@ -1,10 +1,23 @@
import 'package:mocktail/mocktail.dart';
import 'package:stream_chat/src/core/models/own_user.dart';
import 'package:stream_chat/src/core/models/user.dart';
import 'package:stream_chat/stream_chat.dart';
import 'package:test/test.dart';
import '../../utils.dart';
class MockMute extends Mock implements Mute {}
class MockDevice extends Mock implements Device {}
void main() {
final devices = [MockDevice(), MockDevice()];
final mutes = [MockMute(), MockMute()];
final channelMutes = [MockMute()];
final createdAt = DateTime.parse('2021-05-03 12:39:21.817646');
final updatedAt = DateTime.parse('2021-04-03 12:39:21.817646');
final lastActive = DateTime.parse('2021-03-03 12:39:21.817646');
group('src/models/own_user', () {
test('should parse json correctly', () {
final ownUser = OwnUser.fromJson(jsonFixture('own_user.json'));
@@ -22,6 +35,7 @@ void main() {
expect(ownUser.channelMutes.length, 1);
expect(ownUser.totalUnreadCount, 0);
expect(ownUser.unreadChannels, 0);
expect(ownUser.image, 'https://placehold.jp/150x150.png');
expect(ownUser.extraData['image'], 'https://placehold.jp/150x150.png');
expect(ownUser.extraData['name'], 'Proud darkness');
expect(ownUser.extraData['username'], 'Rioland');
@@ -40,6 +54,7 @@ void main() {
expect(ownUser.online, user.online);
expect(ownUser.banned, user.banned);
expect(ownUser.extraData, user.extraData);
expect(ownUser.image, user.image);
});
test('copyWith', () {
@@ -49,35 +64,116 @@ void main() {
expect(newUser.id, user.id);
expect(newUser.role, user.role);
expect(newUser.name, user.name);
expect(newUser.devices, user.devices);
expect(newUser.mutes, user.mutes);
expect(newUser.totalUnreadCount, user.totalUnreadCount);
expect(newUser.channelMutes, user.channelMutes);
expect(newUser.createdAt, user.createdAt);
expect(newUser.updatedAt, user.updatedAt);
expect(newUser.lastActive, user.lastActive);
expect(newUser.online, user.online);
expect(newUser.extraData, user.extraData);
expect(newUser.banned, user.banned);
expect(newUser.teams, user.teams);
expect(newUser.language, user.language);
expect(newUser.image, user.image);
newUser = user.copyWith(
id: 'test',
role: 'test',
image: 'https://getstream.io/image-new',
extraData: {
'name': 'test',
},
devices: devices,
mutes: mutes,
totalUnreadCount: 10,
unreadChannels: 5,
channelMutes: channelMutes,
createdAt: createdAt,
updatedAt: updatedAt,
lastActive: lastActive,
online: true,
banned: true,
teams: ['team1', 'team2'],
language: 'fr',
);
expect(newUser.id, 'test');
expect(newUser.role, 'test');
expect(newUser.name, 'test');
expect(newUser.image, 'https://getstream.io/image-new');
expect(
newUser.extraData,
{
'name': 'test',
'image': 'https://getstream.io/image-new',
},
reason: 'Should get image from user.image',
);
expect(newUser.devices, devices);
expect(newUser.mutes, mutes);
expect(newUser.totalUnreadCount, 10);
expect(newUser.unreadChannels, 5);
expect(newUser.channelMutes, channelMutes);
expect(newUser.createdAt, createdAt);
expect(newUser.updatedAt, updatedAt);
expect(newUser.createdAt, createdAt);
expect(newUser.online, true);
expect(newUser.banned, true);
expect(newUser.teams, ['team1', 'team2']);
expect(newUser.language, 'fr');
});
test('merge', () {
final user = OwnUser.fromJson(jsonFixture('own_user.json'));
final newUser = user.merge(OwnUser(
id: 'test',
role: 'test',
extraData: const {
'name': 'test',
},
banned: true,
));
final newUser = user.merge(
OwnUser(
id: 'test',
role: 'test',
extraData: const {
'name': 'test',
},
image: 'https://getstream.io/image-new',
devices: devices,
mutes: mutes,
totalUnreadCount: 10,
unreadChannels: 5,
channelMutes: channelMutes,
createdAt: createdAt,
updatedAt: updatedAt,
lastActive: lastActive,
online: true,
banned: true,
teams: const ['team1', 'team2'],
language: 'fr',
),
);
expect(newUser.id, 'test');
expect(newUser.role, 'test');
expect(newUser.name, 'test');
expect(newUser.image, 'https://getstream.io/image-new');
expect(
newUser.extraData,
{
'name': 'test',
'image': 'https://getstream.io/image-new',
},
reason: 'Should get image from user.image',
);
expect(newUser.devices, devices);
expect(newUser.mutes, mutes);
expect(newUser.totalUnreadCount, 10);
expect(newUser.unreadChannels, 5);
expect(newUser.channelMutes, channelMutes);
expect(newUser.createdAt, createdAt);
expect(newUser.updatedAt, updatedAt);
expect(newUser.createdAt, createdAt);
expect(newUser.online, true);
expect(newUser.banned, true);
expect(newUser.teams, ['team1', 'team2']);
expect(newUser.language, 'fr');
});
});
}
@@ -4,21 +4,73 @@ import 'package:test/test.dart';
import '../../utils.dart';
void main() {
const id = 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e';
const role = 'test-role';
const name = 'John';
const image =
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow';
const extraDataStringTest = 'Extra data test';
const extraDataIntTest = 1;
const extraDataDoubleTest = 1.1;
const extraDataBoolTest = true;
const online = true;
const banned = true;
const teams = ['team-1', 'team-2'];
const createdAtString = '2021-08-03 12:39:21.817646';
const updatedAtString = '2021-08-04 12:39:21.817646';
const lastActiveString = '2021-08-05 12:39:21.817646';
group('src/models/user', () {
test('should parse json correctly', () {
final user = User.fromJson(jsonFixture('user.json'));
expect(user.id, 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e');
expect(user.name, 'John');
expect(user.id, id);
expect(user.role, role);
expect(user.name, name);
expect(user.image, image);
expect(user.extraData['image'], image);
expect(user.extraData['extraDataStringTest'], extraDataStringTest);
expect(user.extraData['extraDataIntTest'], extraDataIntTest);
expect(user.extraData['extraDataDoubleTest'], extraDataDoubleTest);
expect(user.extraData['extraDataBoolTest'], extraDataBoolTest);
expect(user.online, online);
expect(user.banned, banned);
expect(user.teams, teams);
expect(user.createdAt, DateTime.parse(createdAtString));
expect(user.updatedAt, DateTime.parse(updatedAtString));
expect(user.lastActive, DateTime.parse(lastActiveString));
expect(user.language, 'en');
});
test('should serialize to json correctly', () {
final user = User(
id: 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e',
role: 'abc',
id: id,
role: role,
name: name,
image: image,
extraData: const {
'extraDataStringTest': extraDataStringTest,
'extraDataIntTest': extraDataIntTest,
'extraDataDoubleTest': extraDataDoubleTest,
'extraDataBoolTest': extraDataBoolTest,
},
createdAt: DateTime.parse(createdAtString),
updatedAt: DateTime.parse(updatedAtString),
lastActive: DateTime.parse(lastActiveString),
banned: online,
online: banned,
teams: const ['team-1', 'team-2'],
language: 'fr',
);
expect(user.toJson(), {
'id': 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e',
'id': id,
'name': name,
'image': image,
'extraDataStringTest': extraDataStringTest,
'extraDataIntTest': extraDataIntTest,
'extraDataDoubleTest': extraDataDoubleTest,
'extraDataBoolTest': extraDataBoolTest,
'language': 'fr',
});
});
@@ -29,18 +81,141 @@ void main() {
expect(newUser.id, user.id);
expect(newUser.role, user.role);
expect(newUser.name, user.name);
expect(newUser.image, user.image);
expect(newUser.online, user.online);
expect(newUser.banned, user.banned);
expect(newUser.teams, user.teams);
expect(newUser.createdAt, user.createdAt);
expect(newUser.updatedAt, user.updatedAt);
expect(newUser.lastActive, user.lastActive);
expect(newUser.language, user.language);
newUser = user.copyWith(
id: 'test',
role: 'test',
extraData: {
'name': 'test',
},
name: 'test',
image: 'https://stream.io/new-image',
online: false,
banned: false,
teams: ['new-team1', 'new-team2'],
createdAt: DateTime.parse('2021-05-03 12:39:21.817646'),
updatedAt: DateTime.parse('2021-05-04 12:39:21.817646'),
lastActive: DateTime.parse('2021-05-06 12:39:21.817646'),
language: 'it',
);
expect(newUser.id, 'test');
expect(newUser.role, 'test');
expect(newUser.name, 'test');
expect(newUser.image, 'https://stream.io/new-image');
expect(newUser.extraData['image'], 'https://stream.io/new-image');
expect(newUser.online, false);
expect(newUser.banned, false);
expect(newUser.teams, ['new-team1', 'new-team2']);
expect(newUser.createdAt, DateTime.parse('2021-05-03 12:39:21.817646'));
expect(newUser.updatedAt, DateTime.parse('2021-05-04 12:39:21.817646'));
expect(newUser.lastActive, DateTime.parse('2021-05-06 12:39:21.817646'));
expect(newUser.language, 'it');
});
test('name property and extraData manipulation', () {
final user = User(id: id, name: name);
expect(user.name, name);
expect(user.extraData['name'], name);
expect(user.toJson(), {'id': id, 'name': name});
expect(User.fromJson(user.toJson()).toJson(), {'id': id, 'name': name});
const nameOne = 'Name One';
var newUser = user.copyWith(
extraData: {'name': nameOne},
);
expect(newUser.extraData['name'], nameOne);
expect(newUser.name, nameOne);
const nameTwo = 'Name Two';
newUser = user.copyWith(
name: nameTwo,
);
expect(newUser.extraData['name'], nameTwo);
expect(newUser.name, nameTwo);
const nameThree = 'Name Three';
newUser = user.copyWith(
name: nameThree,
extraData: {'name': nameThree},
);
expect(newUser.extraData['name'], nameThree);
expect(newUser.name, nameThree);
});
test('image property and extraData manipulation', () {
final user = User(id: id, image: image);
expect(user.image, image);
expect(user.extraData['image'], image);
expect(user.toJson(), {'id': id, 'image': image});
expect(User.fromJson(user.toJson()).toJson(), {'id': id, 'image': image});
const imageURLOne = 'https://stream.io/image-one';
var newUser = user.copyWith(
extraData: {'image': imageURLOne},
);
expect(newUser.extraData['image'], imageURLOne);
expect(newUser.image, imageURLOne);
const imageURLTwo = 'https://stream.io/image-two';
newUser = user.copyWith(
image: imageURLTwo,
);
expect(newUser.extraData['image'], imageURLTwo);
expect(newUser.image, imageURLTwo);
const imageURLThree = 'https://stream.io/image-three';
newUser = user.copyWith(
image: imageURLThree,
extraData: {'image': imageURLThree},
);
expect(newUser.extraData['image'], imageURLThree);
expect(newUser.image, imageURLThree);
});
test('default values, constructor', () {
final user = User(id: id);
expect(user.id, id);
expect(user.role, null);
expect(user.name, id, reason: 'if a name is not supplied, default to id');
expect(user.image, null);
expect(user.extraData, const {});
expect(user.online, false);
expect(user.banned, false);
expect(user.teams, []);
expect(user.lastActive, null);
expect(user.createdAt, isNotNull);
expect(user.updatedAt, isNotNull);
});
test('default values, parse json', () {
final user = User.fromJson(const {'id': id});
expect(user.id, id);
expect(user.role, null);
expect(user.name, id, reason: 'if a name is not supplied, default to id');
expect(user.image, null);
expect(user.extraData, const {});
expect(user.online, false);
expect(user.banned, false);
expect(user.teams, []);
expect(user.lastActive, null);
expect(user.createdAt, isNotNull);
expect(user.updatedAt, isNotNull);
});
});
}
@@ -22,8 +22,7 @@ void main() async {
/// https://getstream.io/chat/docs/ios_user_setup_and_tokens/
await client.connectUser(
User(id: 'super-band-9'),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.'
'0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A',
'''eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A''',
);
final channel = client.channel('messaging', id: 'godevs');
@@ -60,9 +60,7 @@ class UserAvatar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final hasImage = user.extraData.containsKey('image') &&
user.extraData['image'] != null &&
user.extraData['image'] != '';
final hasImage = user.image != null && user.image!.isNotEmpty;
final streamChatTheme = StreamChatTheme.of(context);
final placeholder =
@@ -80,8 +78,7 @@ class UserAvatar extends StatelessWidget {
? CachedNetworkImage(
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
// ignore: cast_nullable_to_non_nullable
imageUrl: user.extraData['image'] as String,
imageUrl: user.image!,
errorWidget: (context, __, ___) =>
streamChatTheme.defaultUserImage(context, user),
placeholder: placeholder != null
@@ -13,13 +13,10 @@ Future<void> main() async {
await client.connectUser(
User(
id: 'cool-shadow-7',
extraData: const {
'image':
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow',
},
image:
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow',
),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiY29vbC1zaGFkb3ctNyJ9'
'.gkOlCRb1qgy4joHPaxFwPOdXcGvSPvp6QY0S4mpRkVo',
'''eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiY29vbC1zaGFkb3ctNyJ9.gkOlCRb1qgy4joHPaxFwPOdXcGvSPvp6QY0S4mpRkVo''',
);
runApp(
@@ -401,8 +401,7 @@ void main() async {
/// https://getstream.io/chat/docs/ios_user_setup_and_tokens/
await client.connectUser(
User(id: 'super-band-9'),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.'
'0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A',
'''eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A''',
);
final channel = client.channel('messaging', id: 'godevs');
@@ -20,8 +20,7 @@ void main() async {
/// https://getstream.io/chat/docs/ios_user_setup_and_tokens/
await client.connectUser(
User(id: 'super-band-9'),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.'
'0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A',
'''eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A''',
);
final channel = client.channel('messaging', id: 'godevs');
@@ -45,8 +45,7 @@ void main() async {
/// https://getstream.io/chat/docs/ios_user_setup_and_tokens/
await client.connectUser(
User(id: 'super-band-9'),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.'
'0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A',
'''eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic3VwZXItYmFuZC05In0.0L6lGoeLwkz0aZRUcpZKsvaXtNEDHBcezVTZ0oPq40A''',
);
final channel = client.channel('messaging', id: 'godevs');
@@ -22,10 +22,8 @@ Future<void> main() async {
await client.connectUser(
User(
id: 'cool-shadow-7',
extraData: const {
'image':
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow',
},
image:
'https://getstream.io/random_png/?id=cool-shadow-7&amp;name=Cool+shadow',
),
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiY29vbC1zaGFkb3ctNyJ9.'
'gkOlCRb1qgy4joHPaxFwPOdXcGvSPvp6QY0S4mpRkVo',