Skip to content

Commit f7dc61e

Browse files
committed
chore: refactor create/edit room dialog and fix join rules popup (#83)
1 parent 93b3c99 commit f7dc61e

21 files changed

+426
-417
lines changed

lib/chat_master/view/chat_new_chat_popup_menu_button.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
22
import 'package:yaru/yaru.dart';
33

44
import '../../l10n/l10n.dart';
5-
import '../../chat_room/create_or_edit/chat_create_or_edit_room_dialog.dart';
6-
import '../../chat_room/create_or_edit/chat_new_direct_chat_dialog.dart';
5+
import '../../chat_room/create_or_edit/create_or_edit_room_dialog.dart';
6+
import '../../chat_room/create_or_edit/create_direct_chat_dialog.dart';
77

88
class ChatNewChatPopupMenuButton extends StatelessWidget {
99
const ChatNewChatPopupMenuButton({super.key});
@@ -20,7 +20,7 @@ class ChatNewChatPopupMenuButton extends StatelessWidget {
2020
PopupMenuItem(
2121
onTap: () => showDialog(
2222
context: context,
23-
builder: (context) => const ChatNewDirectChatDialog(),
23+
builder: (context) => const CreateDirectChatDialog(),
2424
),
2525
child: Row(
2626
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -30,7 +30,7 @@ class ChatNewChatPopupMenuButton extends StatelessWidget {
3030
PopupMenuItem(
3131
onTap: () => showDialog(
3232
context: context,
33-
builder: (context) => const ChatCreateOrEditRoomDialog(),
33+
builder: (context) => const CreateOrEditRoomDialog(),
3434
),
3535
child: Row(
3636
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -40,8 +40,7 @@ class ChatNewChatPopupMenuButton extends StatelessWidget {
4040
PopupMenuItem(
4141
onTap: () => showDialog(
4242
context: context,
43-
builder: (context) =>
44-
const ChatCreateOrEditRoomDialog(space: true),
43+
builder: (context) => const CreateOrEditRoomDialog(space: true),
4544
),
4645
child: Row(
4746
mainAxisAlignment: MainAxisAlignment.spaceBetween,

lib/chat_master/view/chat_space_control_panel.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:yaru/yaru.dart';
55
import '../../common/view/snackbars.dart';
66
import '../../common/view/ui_constants.dart';
77
import '../../l10n/l10n.dart';
8-
import '../../chat_room/create_or_edit/chat_create_or_edit_room_dialog.dart';
8+
import '../../chat_room/create_or_edit/create_or_edit_room_dialog.dart';
99
import '../../common/chat_model.dart';
1010
import '../../common/search_model.dart';
1111

@@ -32,8 +32,7 @@ class ChatSpaceControlPanel extends StatelessWidget with WatchItMixin {
3232
style: OutlinedButton.styleFrom(padding: EdgeInsets.zero),
3333
onPressed: () => showDialog(
3434
context: context,
35-
builder: (context) =>
36-
ChatCreateOrEditRoomDialog(room: activeSpace),
35+
builder: (context) => CreateOrEditRoomDialog(room: activeSpace),
3736
),
3837
child: const Icon(YaruIcons.pen),
3938
),

lib/chat_room/create_or_edit/chat_room_join_rules_drop_down.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ChatRoomJoinRulesDropDown extends StatelessWidget with WatchItMixin {
2828
preserveState: false,
2929
initialValue: room.canChangeJoinRules,
3030
).data ??
31-
false;
31+
room.canChangeJoinRules;
3232

3333
final joinRules =
3434
watchStream(
@@ -46,6 +46,8 @@ class ChatRoomJoinRulesDropDown extends StatelessWidget with WatchItMixin {
4646
title: const Text('Join Rules'),
4747
enabled: canChangeJoinRules,
4848
trailing: YaruPopupMenuButton<JoinRules>(
49+
enabled: canChangeJoinRules,
50+
initialValue: joinRules,
4951
onSelected: canChangeJoinRules
5052
? (v) => showFutureLoadingDialog(
5153
context: context,

lib/chat_room/create_or_edit/chat_room_permissions.dart

Lines changed: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'package:matrix/matrix.dart';
44
import 'package:watch_it/watch_it.dart';
55
import 'package:yaru/yaru.dart';
66

7-
import '../../common/chat_model.dart';
87
import '../../common/view/build_context_x.dart';
98
import '../../common/view/snackbars.dart';
109
import '../../common/view/ui_constants.dart';
@@ -13,10 +12,10 @@ import 'create_or_edit_room_model.dart';
1312

1413
// Credit: this code has been inspired by https://github.com/krille-chan/fluffychat permissions
1514
// Thank you @krille-chan
16-
class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
15+
class ChatRoomPermissions extends StatelessWidget with WatchItMixin {
1716
final Room room;
1817

19-
const ChatPermissionsSettingsView({required this.room, super.key});
18+
const ChatRoomPermissions({required this.room, super.key});
2019

2120
@override
2221
Widget build(BuildContext context) {
@@ -26,7 +25,7 @@ class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
2625

2726
final canChangePowerLevel =
2827
watchStream(
29-
(ChatModel m) => m
28+
(CreateOrEditRoomModel m) => m
3029
.getJoinedRoomUpdate(room.id)
3130
.map((_) => room.canChangePowerLevel),
3231
initialValue: room.canChangePowerLevel,
@@ -36,7 +35,7 @@ class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
3635

3736
final powerLevelsContent =
3837
watchStream(
39-
(ChatModel m) => m.getPermissionsStream(room),
38+
(CreateOrEditRoomModel m) => m.getPermissionsStream(room),
4039
initialValue:
4140
room.getState(EventTypes.RoomPowerLevels)?.content ?? {},
4241
).data ??
@@ -233,7 +232,9 @@ class _ChatRoomPermissionTile extends StatelessWidget with WatchItMixin {
233232
? theme.textTheme.bodyMedium
234233
: theme.textTheme.bodyMedium?.copyWith(color: theme.disabledColor);
235234

236-
final color = permission >= 100
235+
final color = !canEdit
236+
? theme.disabledColor
237+
: permission >= 100
237238
? colorScheme.warning
238239
: permission >= 50
239240
? colorScheme.link
@@ -244,51 +245,41 @@ class _ChatRoomPermissionTile extends StatelessWidget with WatchItMixin {
244245
getLocalizedPowerLevelString(context),
245246
style: theme.textTheme.titleSmall,
246247
),
247-
trailing: Material(
248-
color: canEdit ? color.withAlpha(32) : null,
249-
borderRadius: BorderRadius.circular(kYaruContainerRadius),
250-
child: DropdownButton<int>(
251-
isDense: true,
252-
style: style,
253-
icon: const SizedBox.shrink(),
254-
padding: const EdgeInsets.symmetric(
255-
horizontal: kMediumPadding,
256-
vertical: kSmallPadding,
257-
),
258-
borderRadius: BorderRadius.circular(kYaruContainerRadius),
259-
underline: const SizedBox.shrink(),
260-
onChanged: onChanged,
261-
value: permission,
262-
items: [
263-
DropdownMenuItem(
264-
value: permission < 50 ? permission : 0,
265-
child: Text(
266-
l10n.userLevel(permission < 50 ? permission : 0),
267-
style: style,
268-
),
269-
),
270-
DropdownMenuItem(
271-
value: permission < 100 && permission >= 50 ? permission : 50,
272-
child: Text(
273-
l10n.moderatorLevel(
274-
permission < 100 && permission >= 50 ? permission : 50,
275-
),
276-
style: style,
277-
),
248+
trailing: YaruPopupMenuButton<int>(
249+
onSelected: onChanged,
250+
initialValue: permission,
251+
child: Text(
252+
permission.toString(),
253+
style: style?.copyWith(color: color),
254+
),
255+
itemBuilder: (context) => [
256+
PopupMenuItem(
257+
enabled: canEdit,
258+
value: permission < 50 ? permission : 0,
259+
child: Text(
260+
l10n.userLevel(permission < 50 ? permission : 0),
261+
style: style,
278262
),
279-
DropdownMenuItem(
280-
value: permission >= 100 ? permission : 100,
281-
child: Text(
282-
l10n.adminLevel(permission >= 100 ? permission : 100),
283-
style: style,
263+
),
264+
PopupMenuItem(
265+
enabled: canEdit,
266+
value: permission < 100 && permission >= 50 ? permission : 50,
267+
child: Text(
268+
l10n.moderatorLevel(
269+
permission < 100 && permission >= 50 ? permission : 50,
284270
),
271+
style: style,
285272
),
286-
DropdownMenuItem(
287-
value: null,
288-
child: Text(l10n.custom, style: style),
273+
),
274+
PopupMenuItem(
275+
enabled: canEdit,
276+
value: permission >= 100 ? permission : 100,
277+
child: Text(
278+
l10n.adminLevel(permission >= 100 ? permission : 100),
279+
style: style,
289280
),
290-
],
291-
),
281+
),
282+
],
292283
),
293284
);
294285
}

lib/chat_room/create_or_edit/chat_new_direct_chat_dialog.dart renamed to lib/chat_room/create_or_edit/create_direct_chat_dialog.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@ import '../../l10n/l10n.dart';
99
import '../../common/chat_model.dart';
1010
import '../../common/view/search_auto_complete.dart';
1111

12-
class ChatNewDirectChatDialog extends StatefulWidget {
13-
const ChatNewDirectChatDialog({super.key});
12+
class CreateDirectChatDialog extends StatefulWidget {
13+
const CreateDirectChatDialog({super.key});
1414

1515
@override
16-
State<ChatNewDirectChatDialog> createState() =>
17-
_ChatNewDirectChatDialogState();
16+
State<CreateDirectChatDialog> createState() => _CreateDirectChatDialogState();
1817
}
1918

20-
class _ChatNewDirectChatDialogState extends State<ChatNewDirectChatDialog> {
19+
class _CreateDirectChatDialogState extends State<CreateDirectChatDialog> {
2120
String? _error;
2221
final _searchController = TextEditingController();
2322

lib/chat_room/create_or_edit/chat_room_create_or_edit_avatar.dart renamed to lib/chat_room/create_or_edit/create_or_edit_room_avatar.dart

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import 'dart:typed_data';
2-
31
import 'package:flutter/material.dart';
42
import 'package:matrix/matrix.dart';
53
import 'package:watch_it/watch_it.dart';
@@ -13,49 +11,46 @@ import '../../common/view/snackbars.dart';
1311
import '../../common/view/theme.dart';
1412
import '../../common/view/ui_constants.dart';
1513
import '../../l10n/l10n.dart';
16-
import '../input/draft_model.dart';
14+
import 'create_or_edit_room_model.dart';
1715

18-
class ChatRoomCreateOrEditAvatar extends StatelessWidget with WatchItMixin {
19-
const ChatRoomCreateOrEditAvatar({
20-
super.key,
21-
required this.room,
22-
this.avatarDraftBytes,
23-
});
16+
class CreateOrEditRoomAvatar extends StatelessWidget with WatchItMixin {
17+
const CreateOrEditRoomAvatar({super.key, required this.room});
2418

2519
final Room? room;
26-
final Uint8List? avatarDraftBytes;
2720

2821
@override
2922
Widget build(BuildContext context) {
23+
final avatarDraftBytes = watchPropertyValue(
24+
(CreateOrEditRoomModel m) => m.avatarDraftFile?.bytes,
25+
);
26+
3027
final theme = context.theme;
3128
final textTheme = theme.textTheme;
3229
final colorScheme = theme.colorScheme;
3330
final l10n = context.l10n;
3431
final roomAvatarError = watchPropertyValue(
35-
(DraftModel m) => m.roomAvatarError,
32+
(CreateOrEditRoomModel m) => m.roomAvatarError,
3633
);
37-
final ava = watchStream(
38-
(ChatModel m) => m.getJoinedRoomAvatarStream(room),
39-
initialValue: room?.avatar,
40-
).data;
4134
final foreGroundColor = context.colorScheme.isLight
4235
? Colors.black
4336
: Colors.white;
4437
final attachingAvatar = watchPropertyValue(
45-
(DraftModel m) => m.attachingAvatar,
38+
(CreateOrEditRoomModel m) => m.attachingAvatar,
4639
);
4740

4841
return Column(
4942
spacing: kMediumPadding,
5043
children: [
5144
Stack(
52-
key: ValueKey(ava?.toString()),
5345
children: [
5446
Padding(
5547
padding: const EdgeInsets.all(kSmallPadding),
5648
child: room != null
5749
? ChatAvatar(
58-
avatarUri: ava,
50+
avatarUri: watchStream(
51+
(ChatModel m) => m.getJoinedRoomAvatarStream(room),
52+
initialValue: room?.avatar,
53+
).data,
5954
dimension: 80,
6055
fallBackIconSize: 40,
6156
)
@@ -72,7 +67,7 @@ class ChatRoomCreateOrEditAvatar extends StatelessWidget with WatchItMixin {
7267
child: avatarDraftBytes == null
7368
? const Icon(YaruIcons.user, size: 40)
7469
: Image.memory(
75-
avatarDraftBytes!,
70+
avatarDraftBytes,
7671
fit: BoxFit.cover,
7772
),
7873
),
@@ -95,7 +90,7 @@ class ChatRoomCreateOrEditAvatar extends StatelessWidget with WatchItMixin {
9590
),
9691
onPressed: attachingAvatar
9792
? null
98-
: () => di<DraftModel>().setRoomAvatar(
93+
: () => di<CreateOrEditRoomModel>().setRoomAvatar(
9994
room: room,
10095
wrongFormatString: l10n.notAnImage,
10196
onFail: (error) =>

0 commit comments

Comments
 (0)