Skip to content

Commit 603df53

Browse files
authored
chore: extract create or edit widgets (#77)
1 parent 960cfd9 commit 603df53

14 files changed

+694
-350
lines changed

lib/chat_room/create_or_edit/chat_create_or_edit_room_dialog.dart

Lines changed: 38 additions & 286 deletions
Large diffs are not rendered by default.

lib/chat_room/create_or_edit/chat_room_history_visibility_drop_down.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import '../../common/view/snackbars.dart';
88
import '../../common/view/ui_constants.dart';
99
import '../../l10n/app_localizations.dart';
1010
import '../../l10n/l10n.dart';
11+
import 'create_or_edit_room_model.dart';
1112

1213
class ChatRoomHistoryVisibilityDropDown extends StatelessWidget
1314
with WatchItMixin {
@@ -47,8 +48,8 @@ class ChatRoomHistoryVisibilityDropDown extends StatelessWidget
4748
onSelected: canChangeHistoryVisibility
4849
? (v) => showFutureLoadingDialog(
4950
context: context,
50-
future: () =>
51-
di<ChatModel>().setHistoryVisibility(room: room, value: v),
51+
future: () => di<CreateOrEditRoomModel>()
52+
.setHistoryVisibilityForRoom(room: room, value: v),
5253
onError: (e) {
5354
showSnackBar(context, content: Text(e.toString()));
5455
return e;

lib/chat_room/create_or_edit/chat_room_join_rules_drop_down.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import '../../common/view/snackbars.dart';
99
import '../../common/view/ui_constants.dart';
1010
import '../../l10n/app_localizations.dart';
1111
import '../../l10n/l10n.dart';
12+
import 'create_or_edit_room_model.dart';
1213

1314
class ChatRoomJoinRulesDropDown extends StatelessWidget with WatchItMixin {
1415
const ChatRoomJoinRulesDropDown({super.key, required this.room});
@@ -52,8 +53,10 @@ class ChatRoomJoinRulesDropDown extends StatelessWidget with WatchItMixin {
5253
showErrorSnackBar(context, e);
5354
return e;
5455
},
55-
future: () =>
56-
di<ChatModel>().setJoinRules(room: room, value: v),
56+
future: () => di<CreateOrEditRoomModel>().setJoinRulesForRoom(
57+
room: room,
58+
value: v,
59+
),
5760
)
5861
: null,
5962
itemBuilder: (context) => JoinRules.values

lib/chat_room/create_or_edit/chat_room_permissions.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import '../../common/view/build_context_x.dart';
99
import '../../common/view/snackbars.dart';
1010
import '../../common/view/ui_constants.dart';
1111
import '../../l10n/l10n.dart';
12+
import 'create_or_edit_room_model.dart';
1213

1314
// Credit: this code has been inspired by https://github.com/krille-chan/fluffychat permissions
1415
// Thank you @krille-chan
@@ -21,7 +22,7 @@ class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
2122
Widget build(BuildContext context) {
2223
final theme = context.theme;
2324
final l10n = context.l10n;
24-
final chatModel = di<ChatModel>();
25+
final model = di<CreateOrEditRoomModel>();
2526

2627
final canChangePowerLevel =
2728
watchStream(
@@ -82,7 +83,7 @@ class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
8283
showSnackBar(context, content: Text(e.toString()));
8384
return e;
8485
},
85-
future: () => chatModel.editPowerLevel(
86+
future: () => model.editPowerLevel(
8687
room: room,
8788
key: entry.key,
8889
newLevel: level,
@@ -114,7 +115,7 @@ class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
114115
showSnackBar(context, content: Text(e.toString()));
115116
return e;
116117
},
117-
future: () => chatModel.editPowerLevel(
118+
future: () => model.editPowerLevel(
118119
room: room,
119120
key: key,
120121
newLevel: level,
@@ -143,7 +144,7 @@ class ChatPermissionsSettingsView extends StatelessWidget with WatchItMixin {
143144
showSnackBar(context, content: Text(e.toString()));
144145
return e;
145146
},
146-
future: () => di<ChatModel>().editPowerLevel(
147+
future: () => model.editPowerLevel(
147148
room: room,
148149
key: entry.key,
149150
newLevel: level,
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:watch_it/watch_it.dart';
3+
import '../../common/chat_model.dart';
4+
import '../../common/view/common_widgets.dart';
5+
import '../../common/view/snackbars.dart';
6+
import '../../l10n/l10n.dart';
7+
import '../input/draft_model.dart';
8+
import 'create_or_edit_room_model.dart';
9+
10+
class CreateOrEditRoomButton extends StatelessWidget with WatchItMixin {
11+
const CreateOrEditRoomButton({super.key});
12+
13+
@override
14+
Widget build(BuildContext context) {
15+
final l10n = context.l10n;
16+
final name = watchPropertyValue((CreateOrEditRoomModel m) => m.name);
17+
final topic = watchPropertyValue((CreateOrEditRoomModel m) => m.topic);
18+
final space = watchPropertyValue((CreateOrEditRoomModel m) => m.isSpace);
19+
final profiles = watchPropertyValue(
20+
(CreateOrEditRoomModel m) => m.profiles,
21+
);
22+
final joinRules = watchPropertyValue(
23+
(CreateOrEditRoomModel m) => m.joinRules,
24+
);
25+
final historyVisibility = watchPropertyValue(
26+
(CreateOrEditRoomModel m) => m.historyVisibility,
27+
);
28+
final groupCall = watchPropertyValue(
29+
(CreateOrEditRoomModel m) => m.groupCall,
30+
);
31+
final federated = watchPropertyValue(
32+
(CreateOrEditRoomModel m) => m.federated,
33+
);
34+
final encrypted = watchPropertyValue(
35+
(CreateOrEditRoomModel m) => m.enableEncryption,
36+
);
37+
final avatarDraftFile = watchPropertyValue(
38+
(DraftModel m) => m.avatarDraftFile,
39+
);
40+
41+
return ImportantButton(
42+
onPressed: name.trim().isEmpty
43+
? null
44+
: () {
45+
if (context.mounted && Navigator.of(context).canPop()) {
46+
Navigator.of(context).pop();
47+
}
48+
if (space) {
49+
di<ChatModel>().createSpace(
50+
name: name,
51+
topic: topic,
52+
invite: profiles.map((p) => p.userId).toList(),
53+
joinRules: joinRules,
54+
onFail: (error) =>
55+
showSnackBar(context, content: Text(error)),
56+
onSuccess: () {
57+
di<DraftModel>().resetAvatar();
58+
},
59+
);
60+
} else {
61+
di<ChatModel>().createRoom(
62+
avatarFile: avatarDraftFile,
63+
enableEncryption: encrypted,
64+
invite: profiles.map((p) => p.userId).toList(),
65+
groupName: name,
66+
joinRules: joinRules,
67+
historyVisibility: historyVisibility,
68+
onFail: (error) =>
69+
showSnackBar(context, content: Text(error)),
70+
onSuccess: () {
71+
di<DraftModel>().resetAvatar();
72+
},
73+
groupCall: groupCall,
74+
federated: federated,
75+
);
76+
}
77+
},
78+
child: Text(space ? l10n.createNewSpace : l10n.createGroup),
79+
);
80+
}
81+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:future_loading_dialog/future_loading_dialog.dart';
3+
import 'package:matrix/matrix.dart';
4+
import 'package:watch_it/watch_it.dart';
5+
import 'package:yaru/yaru.dart';
6+
7+
import '../../common/chat_model.dart';
8+
import '../../common/view/common_widgets.dart';
9+
import '../../common/view/snackbars.dart';
10+
import '../../common/view/ui_constants.dart';
11+
import '../../l10n/l10n.dart';
12+
import 'chat_room_history_visibility_drop_down.dart';
13+
import 'chat_room_join_rules_drop_down.dart';
14+
import 'create_or_edit_room_model.dart';
15+
import 'create_or_edit_room_name_text_field.dart';
16+
import 'create_or_edit_room_topic_text_field.dart';
17+
18+
class CreateOrEditRoomHeader extends StatelessWidget with WatchItMixin {
19+
const CreateOrEditRoomHeader({super.key, this.room});
20+
21+
final Room? room;
22+
23+
@override
24+
Widget build(BuildContext context) {
25+
final isSpace = watchPropertyValue((CreateOrEditRoomModel m) => m.isSpace);
26+
27+
final encrypted = room == null
28+
? watchPropertyValue((CreateOrEditRoomModel m) => m.enableEncryption)
29+
: room!.encrypted;
30+
31+
final canChangeEncryption = room == null
32+
? true
33+
: room!.encrypted
34+
? false
35+
: watchStream(
36+
(ChatModel m) => m
37+
.getJoinedRoomUpdate(room?.id)
38+
.map(
39+
(_) => room!.canChangeStateEvent(EventTypes.Encryption),
40+
),
41+
initialValue: room!.canChangeStateEvent(EventTypes.Encryption),
42+
preserveState: false,
43+
).data ??
44+
false;
45+
46+
final l10n = context.l10n;
47+
return YaruSection(
48+
headline: Text(l10n.group),
49+
child: Padding(
50+
padding: const EdgeInsets.all(kMediumPadding),
51+
child: Column(
52+
spacing: kBigPadding,
53+
children: [
54+
CreateOrEditRoomNameTextField(room: room),
55+
CreateOrEditRoomTopicTextField(room: room),
56+
if (!isSpace)
57+
YaruTile(
58+
leading: encrypted
59+
? const Icon(YaruIcons.shield_filled)
60+
: const Icon(YaruIcons.shield),
61+
padding: const EdgeInsets.symmetric(horizontal: kMediumPadding),
62+
trailing: CommonSwitch(
63+
value: encrypted,
64+
onChanged: canChangeEncryption
65+
? (v) {
66+
if (room == null) {
67+
di<CreateOrEditRoomModel>().setEnableEncryption(v);
68+
} else {
69+
showFutureLoadingDialog(
70+
context: context,
71+
future: () => di<CreateOrEditRoomModel>()
72+
.enableEncryptionForRoom(room!),
73+
onError: (e) {
74+
showErrorSnackBar(context, e);
75+
return e;
76+
},
77+
);
78+
}
79+
}
80+
: null,
81+
),
82+
title: Text(l10n.encrypted),
83+
),
84+
if (room != null)
85+
ChatRoomHistoryVisibilityDropDown(room: room!)
86+
else if (!isSpace)
87+
ChatCreateRoomHistoryVisibilityDropDown(
88+
initialValue: watchPropertyValue(
89+
(CreateOrEditRoomModel m) => m.historyVisibility,
90+
),
91+
onSelected: di<CreateOrEditRoomModel>().setHistoryVisibility,
92+
),
93+
if (room != null)
94+
ChatRoomJoinRulesDropDown(room: room!)
95+
else
96+
ChatCreateRoomJoinRulesDropDown(
97+
joinRules: watchPropertyValue(
98+
(CreateOrEditRoomModel m) => m.joinRules,
99+
),
100+
onSelected: di<CreateOrEditRoomModel>().setJoinRules,
101+
),
102+
],
103+
),
104+
),
105+
);
106+
}
107+
}

0 commit comments

Comments
 (0)