diff --git a/mobile/lib/features/channels/channel_member_profile_actions.dart b/mobile/lib/features/channels/channel_member_profile_actions.dart index 4ce31bd43f..6d3dc2d6d1 100644 --- a/mobile/lib/features/channels/channel_member_profile_actions.dart +++ b/mobile/lib/features/channels/channel_member_profile_actions.dart @@ -130,22 +130,20 @@ class ChannelMemberProfileActions extends HookConsumerWidget { AppListCard( horizontalPadding: 0, children: [ - if (!member.isBot) ...[ - if (member.role != 'admin') - AppListRow( - icon: BuzzIcons.shieldCheck, - title: 'Make channel admin', - onTap: busy.value ? null : () => perform(role: 'admin'), - ), - if (member.role == 'admin' || member.role == 'guest') - AppListRow( - icon: BuzzIcons.user, - title: member.role == 'guest' - ? 'Make member' - : 'Change to member', - onTap: busy.value ? null : () => perform(role: 'member'), - ), - ], + if (member.role != 'admin') + AppListRow( + icon: BuzzIcons.shieldCheck, + title: 'Make channel admin', + onTap: busy.value ? null : () => perform(role: 'admin'), + ), + if (member.role == 'admin' || member.role == 'guest') + AppListRow( + icon: BuzzIcons.user, + title: member.role == 'guest' + ? 'Make member' + : 'Change to member', + onTap: busy.value ? null : () => perform(role: 'member'), + ), AppListRow( icon: BuzzIcons.userMinus, title: 'Remove from channel', diff --git a/mobile/lib/features/channels/members_sheet.dart b/mobile/lib/features/channels/members_sheet.dart index 43fe47ff9d..89762ac69c 100644 --- a/mobile/lib/features/channels/members_sheet.dart +++ b/mobile/lib/features/channels/members_sheet.dart @@ -313,7 +313,6 @@ class _MemberTile extends ConsumerWidget { : ref .read(channelIdentityNamesProvider(channelId)) .labelFor(member.pubkey); - final canChangeRole = showManagementActions && !member.isBot; showBuzzModalBottomSheet( context: context, title: label, @@ -344,23 +343,21 @@ class _MemberTile extends ConsumerWidget { ], ), if (showManagementActions) ...[ - if (canChangeRole) ...[ - const SizedBox(height: Grid.xxs), - _RoleSelector( - selectedRole: member.role, - onChanged: (role) async { - Navigator.of(sheetContext).pop(); - await ref - .read(channelActionsProvider) - .changeMemberRole( - channelId: channelId, - pubkey: member.pubkey, - role: role, - ); - }, - ), - const SizedBox(height: Grid.xs), - ], + const SizedBox(height: Grid.xxs), + _RoleSelector( + selectedRole: member.isBot ? 'member' : member.role, + onChanged: (role) async { + Navigator.of(sheetContext).pop(); + await ref + .read(channelActionsProvider) + .changeMemberRole( + channelId: channelId, + pubkey: member.pubkey, + role: role, + ); + }, + ), + const SizedBox(height: Grid.xs), SheetActionSection( horizontalPadding: Grid.gutter, children: [ diff --git a/mobile/test/features/channels/channel_member_profile_actions_test.dart b/mobile/test/features/channels/channel_member_profile_actions_test.dart index 1b8cf60bdd..6d7198e1fd 100644 --- a/mobile/test/features/channels/channel_member_profile_actions_test.dart +++ b/mobile/test/features/channels/channel_member_profile_actions_test.dart @@ -246,13 +246,20 @@ void main() { await tester.tap(find.text('Change to member')); await tester.pumpAndSettle(); expect(actions.calls, ['test:alice:admin', 'test:alice:member']); + + // An owned agent demoted to ordinary membership is now reported as bot. + // That label must not remove the owner's ability to promote it again. + role = 'bot'; + container.invalidate(channelMembersProvider('test')); + await tester.pumpAndSettle(); + expect(find.text('Make channel admin'), findsOneWidget); }); for (final role in ['member', 'admin', 'guest', 'bot']) { testWidgets('management rows for $role', (tester) async { await _pump(tester, targetRole: role); expect( find.text('Make channel admin'), - role == 'member' || role == 'guest' ? findsOneWidget : findsNothing, + role == 'admin' ? findsNothing : findsOneWidget, ); expect( find.text('Change to member'), diff --git a/mobile/test/features/channels/members_sheet_test.dart b/mobile/test/features/channels/members_sheet_test.dart index da90fad951..dcbfa21586 100644 --- a/mobile/test/features/channels/members_sheet_test.dart +++ b/mobile/test/features/channels/members_sheet_test.dart @@ -259,7 +259,13 @@ void main() { ); await tester.pumpAndSettle(); expect(find.text('View activity'), findsOneWidget); - expect(find.text('Role'), findsNothing); + expect(find.text('Role'), findsOneWidget); + expect( + tester + .widget>(find.byType(SegmentedButton)) + .selected, + {'member'}, + ); expect(tester.takeException(), isNull); });