Skip to content

Commit cb5e9d8

Browse files
authored
chore: organize room edit (#91)
1 parent 5890637 commit cb5e9d8

19 files changed

+469
-175
lines changed

lib/authentication/view/uia_request_handler.dart

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22

3+
import 'package:adaptive_dialog/adaptive_dialog.dart';
34
import 'package:flutter/material.dart';
45
import 'package:matrix/matrix.dart';
56
import 'package:url_launcher/url_launcher_string.dart';
@@ -62,17 +63,19 @@ Future<void> uiaRequestHandler({
6263
clientSecret: currentClientSecret,
6364
),
6465
);
65-
return showDialog(
66-
context: context,
67-
builder: (context) => ConfirmationDialog(
68-
title: Text(l10n.weSentYouAnEmail),
69-
content: Text(l10n.pleaseClickOnLink),
70-
confirmLabel: l10n.iHaveClickedOnLink,
71-
cancelLabel: l10n.cancel,
72-
onCancel: uiaRequest.cancel,
73-
onConfirm: () async => uiaRequest.completeStage(auth),
74-
),
75-
);
66+
await showOkCancelAlertDialog(
67+
context: navigatorContext,
68+
title: l10n.weSentYouAnEmail,
69+
message: l10n.pleaseClickOnLink,
70+
okLabel: l10n.iHaveClickedOnLink,
71+
cancelLabel: l10n.cancel,
72+
).then((result) {
73+
if (result == OkCancelResult.ok) {
74+
uiaRequest.completeStage(auth);
75+
} else {
76+
uiaRequest.cancel();
77+
}
78+
});
7679

7780
case AuthenticationTypes.dummy:
7881
return uiaRequest.completeStage(
@@ -87,17 +90,19 @@ Future<void> uiaRequestHandler({
8790
);
8891
launchUrlString(url.toString());
8992

90-
return showDialog(
93+
await showOkCancelAlertDialog(
9194
context: context,
92-
builder: (context) => ConfirmationDialog(
93-
title: Text(l10n.pleaseFollowInstructionsOnWeb),
94-
confirmLabel: l10n.next,
95-
onConfirm: () async => uiaRequest.completeStage(
96-
AuthenticationData(session: uiaRequest.session),
97-
),
98-
onCancel: uiaRequest.cancel,
99-
),
100-
);
95+
title: l10n.pleaseFollowInstructionsOnWeb,
96+
okLabel: l10n.next,
97+
).then((result) {
98+
if (result == OkCancelResult.ok) {
99+
uiaRequest.completeStage(
100+
AuthenticationData(type: stage, session: uiaRequest.session),
101+
);
102+
} else {
103+
uiaRequest.cancel();
104+
}
105+
});
101106
}
102107
} catch (e, s) {
103108
Logs().e('Error while background UIA', e, s);

lib/chat_master/view/chat_space_control_panel.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ChatSpaceControlPanel extends StatelessWidget with WatchItMixin {
6767
'${context.l10n.leave} ${activeSpace.getLocalizedDisplayname()}',
6868
),
6969
context: context,
70-
onConfirm: () {
70+
onConfirm: () async {
7171
Navigator.of(context).pop();
7272
showFutureLoadingDialog(
7373
context: context,

lib/chat_master/view/chat_spaces_search_list.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class ChatSpacesSearchList extends StatelessWidget with WatchItMixin {
7171
],
7272
),
7373
context: context,
74-
onConfirm: () {
74+
onConfirm: () async {
7575
Navigator.of(context).pop();
7676
showFutureLoadingDialog(
7777
context: context,
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import 'package:collection/collection.dart';
2+
import 'package:matrix/matrix.dart';
3+
import 'package:watch_it/watch_it.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:yaru/yaru.dart';
6+
7+
import '../../../common/view/build_context_x.dart';
8+
import '../../../common/view/confirm.dart';
9+
import '../../../l10n/l10n.dart';
10+
import '../../create_or_edit/create_or_edit_room_model.dart';
11+
12+
class ChatRoomUserListTilePowerLevelButton extends StatelessWidget
13+
with WatchItMixin {
14+
const ChatRoomUserListTilePowerLevelButton({required this.user, super.key});
15+
16+
final User user;
17+
18+
@override
19+
Widget build(BuildContext context) {
20+
final l10n = context.l10n;
21+
final room = user.room;
22+
23+
final myUser = room.getParticipants().firstWhereOrNull(
24+
(u) => u.id == room.client.userID,
25+
);
26+
27+
final ownPowerLevel = myUser == null
28+
? 0
29+
: watchStream(
30+
(CreateOrEditRoomModel m) => m
31+
.getJoinedRoomUpdate(room.id)
32+
.map((r) => myUser.powerLevel),
33+
initialValue: myUser.powerLevel,
34+
).data ??
35+
myUser.powerLevel;
36+
37+
final userPowerLevel =
38+
watchStream(
39+
(CreateOrEditRoomModel m) =>
40+
m.getJoinedRoomUpdate(room.id).map((r) => user.powerLevel),
41+
initialValue: user.powerLevel,
42+
).data ??
43+
0;
44+
45+
final canChangePowerLevel = room.canChangeStateEvent(
46+
EventTypes.RoomPowerLevels,
47+
);
48+
49+
if (canChangePowerLevel && user.id != room.client.userID) {
50+
return PopupMenuButton<int>(
51+
initialValue: userPowerLevel,
52+
tooltip: ownPowerLevel > userPowerLevel
53+
? l10n.changePowerLevel
54+
: l10n.canNotChangePowerLevel,
55+
enabled: ownPowerLevel > userPowerLevel,
56+
itemBuilder: (context) => [
57+
PopupMenuItem(
58+
enabled: ownPowerLevel > memberPowerLevel,
59+
value: memberPowerLevel,
60+
child: Text(l10n.member),
61+
),
62+
PopupMenuItem(
63+
enabled: ownPowerLevel > moderatorPowerLevel,
64+
value: moderatorPowerLevel,
65+
child: Text(l10n.moderator),
66+
),
67+
PopupMenuItem(
68+
enabled: ownPowerLevel >= adminPowerLevel,
69+
value: adminPowerLevel,
70+
child: Text(l10n.admin),
71+
),
72+
],
73+
onSelected: (v) => ConfirmationDialog.show(
74+
context: context,
75+
title: Text(l10n.changePowerLevel),
76+
content: Text(
77+
l10n.changePowerLevelForUserToValue(
78+
user.displayName ?? user.id,
79+
switch (v) {
80+
memberPowerLevel => l10n.member,
81+
moderatorPowerLevel => l10n.moderator,
82+
adminPowerLevel => l10n.admin,
83+
_ => 'unknown',
84+
},
85+
),
86+
),
87+
onConfirm: () => di<CreateOrEditRoomModel>().changePowerLevel(
88+
user: user,
89+
powerLevel: v,
90+
),
91+
),
92+
icon: Icon(
93+
YaruIcons.settings,
94+
color: ownPowerLevel > userPowerLevel
95+
? null
96+
: context.theme.disabledColor,
97+
),
98+
);
99+
}
100+
return const SizedBox.shrink();
101+
}
102+
}

lib/chat_room/common/view/chat_room_users_list.dart

Lines changed: 48 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:collection/collection.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:future_loading_dialog/future_loading_dialog.dart';
34
import 'package:matrix/matrix.dart';
45
import 'package:watch_it/watch_it.dart';
56
import 'package:yaru/yaru.dart';
@@ -13,6 +14,7 @@ import '../../../common/view/confirm.dart';
1314
import '../../../common/view/ui_constants.dart';
1415
import '../../../l10n/l10n.dart';
1516
import '../../create_or_edit/create_or_edit_room_model.dart';
17+
import 'chat_room_user_list_power_level_button.dart';
1618

1719
class ChatRoomUsersList extends StatelessWidget with WatchItMixin {
1820
const ChatRoomUsersList({
@@ -64,12 +66,14 @@ class ChatRoomUsersList extends StatelessWidget with WatchItMixin {
6466
if (room.canKick && !user.isLoggedInUser)
6567
IconButton(
6668
tooltip: l10n.kickFromChat,
67-
onPressed: () => showDialog(
69+
onPressed: () => ConfirmationDialog.show(
6870
context: context,
69-
builder: (context) => ConfirmationDialog(
70-
title: Text(l10n.kickFromChat),
71-
content: Text(user.id),
72-
onConfirm: () => room.kick(user.id),
71+
title: Text(l10n.kickFromChat),
72+
content: Text(user.id),
73+
onConfirm: () => showFutureLoadingDialog(
74+
context: context,
75+
future: () => di<CreateOrEditRoomModel>()
76+
.removeUserFromRoom(user),
7377
),
7478
),
7579
icon: Icon(
@@ -80,19 +84,22 @@ class ChatRoomUsersList extends StatelessWidget with WatchItMixin {
8084
if (room.canBan && !user.isLoggedInUser)
8185
IconButton(
8286
tooltip: context.l10n.banFromChat,
83-
onPressed: () => showDialog(
87+
onPressed: () => ConfirmationDialog.show(
8488
context: context,
85-
builder: (context) => ConfirmationDialog(
86-
title: Text(l10n.banFromChat),
87-
content: Text(user.id),
88-
onConfirm: () => room.ban(user.id),
89+
title: Text(l10n.banFromChat),
90+
content: Text(user.id),
91+
onConfirm: () => showFutureLoadingDialog(
92+
context: context,
93+
future: () =>
94+
di<CreateOrEditRoomModel>().banUserFromRoom(user),
8995
),
9096
),
9197
icon: Icon(
9298
YaruIcons.private_mask,
9399
color: context.colorScheme.error,
94100
),
95101
),
102+
ChatRoomUserListTilePowerLevelButton(user: user),
96103
],
97104
)
98105
: const SizedBox.shrink(),
@@ -110,33 +117,43 @@ class ChatRoomUsersList extends StatelessWidget with WatchItMixin {
110117
}
111118
}
112119

113-
class _UserTile extends StatelessWidget {
120+
class _UserTile extends StatelessWidget with WatchItMixin {
114121
const _UserTile({super.key, required this.user, this.trailing});
115122

116123
final User user;
117124
final Widget? trailing;
118125

119126
@override
120-
Widget build(BuildContext context) => ListTile(
121-
key: key,
122-
leading: Opacity(
123-
opacity: user.membership == Membership.invite ? 0.5 : 1,
124-
child: ChatAvatar(
125-
avatarUri: user.avatarUrl,
126-
onTap: () => showDialog(
127-
context: context,
128-
builder: (context) => ChatProfileDialog(userId: user.id),
127+
Widget build(BuildContext context) {
128+
final userPowerLevel =
129+
watchStream(
130+
(CreateOrEditRoomModel m) =>
131+
m.getJoinedRoomUpdate(user.room.id).map((r) => user.powerLevel),
132+
initialValue: user.powerLevel,
133+
).data ??
134+
0;
135+
return ListTile(
136+
key: key,
137+
leading: Opacity(
138+
opacity: user.membership == Membership.invite ? 0.5 : 1,
139+
child: ChatAvatar(
140+
avatarUri: user.avatarUrl,
141+
onTap: () => showDialog(
142+
context: context,
143+
builder: (context) => ChatProfileDialog(userId: user.id),
144+
),
129145
),
130146
),
131-
),
132-
title: Text(user.displayName ?? user.id),
133-
subtitle: user.membership == Membership.invite
134-
? Text(context.l10n.invited)
135-
: Text(
136-
user.powerLevel == 0
137-
? context.l10n.participant
138-
: context.l10n.admin,
139-
),
140-
trailing: trailing,
141-
);
147+
title: Text(user.displayName ?? user.id),
148+
subtitle: user.membership == Membership.invite
149+
? Text(context.l10n.invited)
150+
: Text(switch (userPowerLevel) {
151+
memberPowerLevel => context.l10n.member,
152+
moderatorPowerLevel => context.l10n.moderator,
153+
adminPowerLevel => context.l10n.admin,
154+
_ => 'unknown',
155+
}),
156+
trailing: trailing,
157+
);
158+
}
142159
}

0 commit comments

Comments
 (0)