Merge pull request #1124 from GetStream/chore/deprecate_member_role

feat(llc,ui,persistence): Deprecated Member.role in favor of Member.channelRole
This commit is contained in:
Salvatore Giordano
2022-05-06 17:37:08 +02:00
committed by GitHub
16 changed files with 88 additions and 16 deletions
+5
View File
@@ -4,6 +4,11 @@
- Added support for extra data in attachment file uploader. Thanks, [@rlee1990](https://github.com/rlee1990).
🔄 Changed
- Deprecated `role` in `Member` in favor of `channelRole`
- Deprecated `currentUserRole` getter in `Channel` in favor of `currentUserChannelRole`
## 4.0.1
- Minor fixes
@@ -2017,8 +2017,12 @@ class ChannelClientState {
);
/// User role for the current user.
@Deprecated('Please use currentUserChannelRole')
String? get currentUserRole => currentUserMember?.role;
/// Channel role for the current user
String? get currentUserChannelRole => currentUserMember?.channelRole;
/// Channel read list.
List<Read> get read => _channelState.read ?? <Read>[];
@@ -1,3 +1,5 @@
// ignore_for_file: deprecated_member_use_from_same_package
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:stream_chat/src/core/models/user.dart';
@@ -15,6 +17,7 @@ class Member extends Equatable {
this.inviteRejectedAt,
this.invited = false,
this.role,
this.channelRole,
this.userId,
this.isModerator = false,
DateTime? createdAt,
@@ -46,8 +49,12 @@ class Member extends Equatable {
final bool invited;
/// The role of the user in the channel
@Deprecated('Please use channelRole')
final String? role;
/// The role of this member in the channel
final String? channelRole;
/// The id of the interested user
final String? userId;
@@ -76,6 +83,7 @@ class Member extends Equatable {
DateTime? inviteRejectedAt,
bool? invited,
String? role,
String? channelRole,
String? userId,
bool? isModerator,
DateTime? createdAt,
@@ -93,6 +101,7 @@ class Member extends Equatable {
banExpires: banExpires ?? this.banExpires,
shadowBanned: shadowBanned ?? this.shadowBanned,
role: role ?? this.role,
channelRole: channelRole ?? this.channelRole,
userId: userId ?? this.userId,
isModerator: isModerator ?? this.isModerator,
createdAt: createdAt ?? this.createdAt,
@@ -109,6 +118,7 @@ class Member extends Equatable {
inviteRejectedAt,
invited,
role,
channelRole,
userId,
isModerator,
banned,
@@ -18,6 +18,7 @@ Member _$MemberFromJson(Map<String, dynamic> json) => Member(
: DateTime.parse(json['invite_rejected_at'] as String),
invited: json['invited'] as bool? ?? false,
role: json['role'] as String?,
channelRole: json['channel_role'] as String?,
userId: json['user_id'] as String?,
isModerator: json['is_moderator'] as bool? ?? false,
createdAt: json['created_at'] == null
@@ -39,6 +40,7 @@ Map<String, dynamic> _$MemberToJson(Member instance) => <String, dynamic>{
'invite_rejected_at': instance.inviteRejectedAt?.toIso8601String(),
'invited': instance.invited,
'role': instance.role,
'channel_role': instance.channelRole,
'user_id': instance.userId,
'is_moderator': instance.isModerator,
'banned': instance.banned,
+1 -1
View File
@@ -9,7 +9,7 @@
"name": "Robin Papa",
"image": "https://pbs.twimg.com/profile_images/669512187778498560/L7wQctBt.jpg"
},
"role": "member",
"channel_role": "channel_member",
"created_at": "2020-01-28T22:17:30.95443Z",
"updated_at": "2020-01-28T22:17:30.95443Z"
}
@@ -9,7 +9,7 @@ void main() {
test('should parse json correctly', () {
final member = Member.fromJson(jsonFixture('member.json'));
expect(member.user, isA<User>());
expect(member.role, 'member');
expect(member.channelRole, 'channel_member');
expect(member.createdAt, DateTime.parse('2020-01-28T22:17:30.95443Z'));
expect(member.updatedAt, DateTime.parse('2020-01-28T22:17:30.95443Z'));
});
@@ -10,6 +10,10 @@
- Fixed attachment picker ui.
- Fixed message widget thread indicator in reverse mode.
🔄 Changed
- Removed `isOwner` condition from `ChannelBottomSheet` and `StreamChannelInfoBottomSheet` for delete option tile.
## 4.0.1
- Minor fixes
@@ -33,7 +33,6 @@ class _ChannelBottomSheetState extends State<ChannelBottomSheet> {
final userAsMember = members
.firstWhere((e) => e.user?.id == _streamChatState.currentUser?.id);
final isOwner = userAsMember.role == 'owner';
return Material(
color: _streamChatThemeData.colorTheme.barsBg,
@@ -179,9 +178,8 @@ class _ChannelBottomSheetState extends State<ChannelBottomSheet> {
});
},
),
if (isOwner &&
channel.ownCapabilities
.contains(PermissionType.deleteChannel))
if (channel.ownCapabilities
.contains(PermissionType.deleteChannel))
StreamOptionListTile(
leading: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
@@ -59,10 +59,6 @@ class StreamChannelInfoBottomSheet extends StatelessWidget {
final members = channel.state?.members ?? [];
final isOwner = members.any(
(it) => it.user?.id == currentUser?.id && it.role == 'owner',
);
// remove current user in case it's 1-1 conversation
if (isOneToOneChannel) {
members.removeWhere((it) => it.user?.id == currentUser?.id);
@@ -153,7 +149,7 @@ class StreamChannelInfoBottomSheet extends StatelessWidget {
),
onTap: onLeaveChannelTap,
),
if (isOwner)
if (channel.ownCapabilities.contains(PermissionType.deleteChannel))
StreamOptionListTile(
leading: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
@@ -1,3 +1,9 @@
## Upcoming
🔄 Changed
- Deprecated `role` field in `Member` table in favor of `channelRole`
## 4.0.1
- Updated `stream_chat` dependency to [`4.0.1`](https://pub.dev/packages/stream_chat/changelog).
@@ -56,7 +56,7 @@ class DriftChatDatabase extends _$DriftChatDatabase {
// you should bump this number whenever you change or add a table definition.
@override
int get schemaVersion => 7;
int get schemaVersion => 8;
@override
MigrationStrategy get migration => MigrationStrategy(
@@ -3888,6 +3888,9 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
/// The role of the user in the channel
final String? role;
/// The role of the user in the channel
final String? channelRole;
/// The date on which the user accepted the invite to the channel
final DateTime? inviteAcceptedAt;
@@ -3915,6 +3918,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
{required this.userId,
required this.channelCid,
this.role,
this.channelRole,
this.inviteAcceptedAt,
this.inviteRejectedAt,
required this.invited,
@@ -3932,6 +3936,8 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
.mapFromDatabaseResponse(data['${effectivePrefix}channel_cid'])!,
role: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}role']),
channelRole: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}channel_role']),
inviteAcceptedAt: const DateTimeType().mapFromDatabaseResponse(
data['${effectivePrefix}invite_accepted_at']),
inviteRejectedAt: const DateTimeType().mapFromDatabaseResponse(
@@ -3958,6 +3964,9 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
if (!nullToAbsent || role != null) {
map['role'] = Variable<String?>(role);
}
if (!nullToAbsent || channelRole != null) {
map['channel_role'] = Variable<String?>(channelRole);
}
if (!nullToAbsent || inviteAcceptedAt != null) {
map['invite_accepted_at'] = Variable<DateTime?>(inviteAcceptedAt);
}
@@ -3980,6 +3989,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
userId: serializer.fromJson<String>(json['userId']),
channelCid: serializer.fromJson<String>(json['channelCid']),
role: serializer.fromJson<String?>(json['role']),
channelRole: serializer.fromJson<String?>(json['channelRole']),
inviteAcceptedAt:
serializer.fromJson<DateTime?>(json['inviteAcceptedAt']),
inviteRejectedAt:
@@ -3999,6 +4009,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
'userId': serializer.toJson<String>(userId),
'channelCid': serializer.toJson<String>(channelCid),
'role': serializer.toJson<String?>(role),
'channelRole': serializer.toJson<String?>(channelRole),
'inviteAcceptedAt': serializer.toJson<DateTime?>(inviteAcceptedAt),
'inviteRejectedAt': serializer.toJson<DateTime?>(inviteRejectedAt),
'invited': serializer.toJson<bool>(invited),
@@ -4014,6 +4025,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
{String? userId,
String? channelCid,
Value<String?> role = const Value.absent(),
Value<String?> channelRole = const Value.absent(),
Value<DateTime?> inviteAcceptedAt = const Value.absent(),
Value<DateTime?> inviteRejectedAt = const Value.absent(),
bool? invited,
@@ -4026,6 +4038,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
userId: userId ?? this.userId,
channelCid: channelCid ?? this.channelCid,
role: role.present ? role.value : this.role,
channelRole: channelRole.present ? channelRole.value : this.channelRole,
inviteAcceptedAt: inviteAcceptedAt.present
? inviteAcceptedAt.value
: this.inviteAcceptedAt,
@@ -4045,6 +4058,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
..write('userId: $userId, ')
..write('channelCid: $channelCid, ')
..write('role: $role, ')
..write('channelRole: $channelRole, ')
..write('inviteAcceptedAt: $inviteAcceptedAt, ')
..write('inviteRejectedAt: $inviteRejectedAt, ')
..write('invited: $invited, ')
@@ -4062,6 +4076,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
userId,
channelCid,
role,
channelRole,
inviteAcceptedAt,
inviteRejectedAt,
invited,
@@ -4077,6 +4092,7 @@ class MemberEntity extends DataClass implements Insertable<MemberEntity> {
other.userId == this.userId &&
other.channelCid == this.channelCid &&
other.role == this.role &&
other.channelRole == this.channelRole &&
other.inviteAcceptedAt == this.inviteAcceptedAt &&
other.inviteRejectedAt == this.inviteRejectedAt &&
other.invited == this.invited &&
@@ -4091,6 +4107,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
final Value<String> userId;
final Value<String> channelCid;
final Value<String?> role;
final Value<String?> channelRole;
final Value<DateTime?> inviteAcceptedAt;
final Value<DateTime?> inviteRejectedAt;
final Value<bool> invited;
@@ -4103,6 +4120,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
this.userId = const Value.absent(),
this.channelCid = const Value.absent(),
this.role = const Value.absent(),
this.channelRole = const Value.absent(),
this.inviteAcceptedAt = const Value.absent(),
this.inviteRejectedAt = const Value.absent(),
this.invited = const Value.absent(),
@@ -4116,6 +4134,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
required String userId,
required String channelCid,
this.role = const Value.absent(),
this.channelRole = const Value.absent(),
this.inviteAcceptedAt = const Value.absent(),
this.inviteRejectedAt = const Value.absent(),
this.invited = const Value.absent(),
@@ -4130,6 +4149,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
Expression<String>? userId,
Expression<String>? channelCid,
Expression<String?>? role,
Expression<String?>? channelRole,
Expression<DateTime?>? inviteAcceptedAt,
Expression<DateTime?>? inviteRejectedAt,
Expression<bool>? invited,
@@ -4143,6 +4163,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
if (userId != null) 'user_id': userId,
if (channelCid != null) 'channel_cid': channelCid,
if (role != null) 'role': role,
if (channelRole != null) 'channel_role': channelRole,
if (inviteAcceptedAt != null) 'invite_accepted_at': inviteAcceptedAt,
if (inviteRejectedAt != null) 'invite_rejected_at': inviteRejectedAt,
if (invited != null) 'invited': invited,
@@ -4158,6 +4179,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
{Value<String>? userId,
Value<String>? channelCid,
Value<String?>? role,
Value<String?>? channelRole,
Value<DateTime?>? inviteAcceptedAt,
Value<DateTime?>? inviteRejectedAt,
Value<bool>? invited,
@@ -4170,6 +4192,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
userId: userId ?? this.userId,
channelCid: channelCid ?? this.channelCid,
role: role ?? this.role,
channelRole: channelRole ?? this.channelRole,
inviteAcceptedAt: inviteAcceptedAt ?? this.inviteAcceptedAt,
inviteRejectedAt: inviteRejectedAt ?? this.inviteRejectedAt,
invited: invited ?? this.invited,
@@ -4193,6 +4216,9 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
if (role.present) {
map['role'] = Variable<String?>(role.value);
}
if (channelRole.present) {
map['channel_role'] = Variable<String?>(channelRole.value);
}
if (inviteAcceptedAt.present) {
map['invite_accepted_at'] = Variable<DateTime?>(inviteAcceptedAt.value);
}
@@ -4226,6 +4252,7 @@ class MembersCompanion extends UpdateCompanion<MemberEntity> {
..write('userId: $userId, ')
..write('channelCid: $channelCid, ')
..write('role: $role, ')
..write('channelRole: $channelRole, ')
..write('inviteAcceptedAt: $inviteAcceptedAt, ')
..write('inviteRejectedAt: $inviteRejectedAt, ')
..write('invited: $invited, ')
@@ -4262,6 +4289,12 @@ class $MembersTable extends Members
late final GeneratedColumn<String?> role = GeneratedColumn<String?>(
'role', aliasedName, true,
type: const StringType(), requiredDuringInsert: false);
final VerificationMeta _channelRoleMeta =
const VerificationMeta('channelRole');
@override
late final GeneratedColumn<String?> channelRole = GeneratedColumn<String?>(
'channel_role', aliasedName, true,
type: const StringType(), requiredDuringInsert: false);
final VerificationMeta _inviteAcceptedAtMeta =
const VerificationMeta('inviteAcceptedAt');
@override
@@ -4327,6 +4360,7 @@ class $MembersTable extends Members
userId,
channelCid,
role,
channelRole,
inviteAcceptedAt,
inviteRejectedAt,
invited,
@@ -4363,6 +4397,12 @@ class $MembersTable extends Members
context.handle(
_roleMeta, role.isAcceptableOrUnknown(data['role']!, _roleMeta));
}
if (data.containsKey('channel_role')) {
context.handle(
_channelRoleMeta,
channelRole.isAcceptableOrUnknown(
data['channel_role']!, _channelRoleMeta));
}
if (data.containsKey('invite_accepted_at')) {
context.handle(
_inviteAcceptedAtMeta,
@@ -12,8 +12,12 @@ class Members extends Table {
text().customConstraint('REFERENCES channels(cid) ON DELETE CASCADE')();
/// The role of the user in the channel
@Deprecated('Please use channelRole')
TextColumn get role => text().nullable()();
/// The role of the user in the channel
TextColumn get channelRole => text().nullable()();
/// The date on which the user accepted the invite to the channel
DateTimeColumn get inviteAcceptedAt => dateTime().nullable()();
@@ -12,6 +12,7 @@ extension MemberEntityX on MemberEntity {
updatedAt: updatedAt,
createdAt: createdAt,
role: role,
channelRole: channelRole,
inviteAcceptedAt: inviteAcceptedAt,
invited: invited,
inviteRejectedAt: inviteRejectedAt,
@@ -32,7 +33,9 @@ extension MemberX on Member {
inviteRejectedAt: inviteRejectedAt,
invited: invited,
inviteAcceptedAt: inviteAcceptedAt,
// ignore: deprecated_member_use
role: role,
channelRole: channelRole,
updatedAt: updatedAt,
);
}
@@ -62,7 +62,7 @@ void main() {
expect(fetchedMember.createdAt, isSameDateAs(member.createdAt));
expect(fetchedMember.isModerator, member.isModerator);
expect(fetchedMember.invited, member.invited);
expect(fetchedMember.role, member.role);
expect(fetchedMember.channelRole, member.channelRole);
expect(fetchedMember.updatedAt, isSameDateAs(member.updatedAt));
expect(
fetchedMember.inviteAcceptedAt,
@@ -89,7 +89,7 @@ void main() {
expect(fetchedMember.createdAt, isSameDateAs(member.createdAt));
expect(fetchedMember.isModerator, member.isModerator);
expect(fetchedMember.invited, member.invited);
expect(fetchedMember.role, member.role);
expect(fetchedMember.channelRole, member.channelRole);
expect(fetchedMember.updatedAt, isSameDateAs(member.updatedAt));
expect(
fetchedMember.inviteAcceptedAt,
@@ -28,7 +28,7 @@ void main() {
expect(member.user!.id, entity.userId);
expect(member.createdAt, isSameDateAs(entity.createdAt));
expect(member.updatedAt, isSameDateAs(entity.updatedAt));
expect(member.role, entity.role);
expect(member.channelRole, entity.channelRole);
expect(member.inviteAcceptedAt, isSameDateAs(entity.inviteAcceptedAt!));
expect(member.inviteRejectedAt, isSameDateAs(entity.inviteRejectedAt!));
expect(member.invited, entity.invited);
@@ -58,7 +58,7 @@ void main() {
expect(entity.userId, member.user!.id);
expect(entity.createdAt, isSameDateAs(member.createdAt));
expect(entity.updatedAt, isSameDateAs(member.updatedAt));
expect(entity.role, member.role);
expect(entity.channelRole, member.channelRole);
expect(entity.inviteAcceptedAt, isSameDateAs(member.inviteAcceptedAt!));
expect(entity.inviteRejectedAt, isSameDateAs(member.inviteRejectedAt!));
expect(entity.invited, member.invited);