Skip to content

Commit 274b271

Browse files
authored
chore: simplify create group logic (#86)
1 parent de5e36e commit 274b271

16 files changed

+275
-347
lines changed

lib/chat_master/view/chat_master_title_bar.dart

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,15 @@ class ChatMasterTitleBar extends StatelessWidget with WatchItMixin {
3131
spaceEnd: true,
3232
widthGap: kSmallPadding,
3333
skip: 0,
34-
children: !archiveActive
35-
? [
36-
const ChatNewChatPopupMenuButton(),
37-
IconButton(
38-
tooltip: context.l10n.search,
39-
isSelected: searchActive,
40-
onPressed: searchModel.toggleSearch,
41-
icon: const Icon(YaruIcons.search),
42-
),
43-
]
44-
: [],
34+
children: [
35+
if (!archiveActive) const ChatNewChatPopupMenuButton(),
36+
IconButton(
37+
tooltip: context.l10n.search,
38+
isSelected: searchActive,
39+
onPressed: searchModel.toggleSearch,
40+
icon: const Icon(YaruIcons.search),
41+
),
42+
],
4543
),
4644
);
4745
}

lib/chat_room/create_or_edit/create_or_edit_room_model.dart

Lines changed: 84 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,25 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
1313
CreateOrEditRoomModel({required Client client}) : _client = client;
1414

1515
final Client _client;
16-
Stream<SyncUpdate> get _joinedUpdateStream =>
17-
_client.onSync.stream.where((e) => e.rooms?.join?.isNotEmpty ?? false);
18-
19-
Stream<JoinedRoomUpdate?> _getJoinedRoomUpdate(String? roomId) =>
20-
_joinedUpdateStream.map((e) => e.rooms?.join?[roomId]);
2116

2217
void init({required Room? room, required bool isSpace}) {
2318
_nameDraft = '';
2419
_topicDraft = '';
25-
_enableEncryption = false;
26-
_groupCall = false;
27-
_joinRules = JoinRules.public;
28-
_historyVisibility = HistoryVisibility.shared;
20+
_enableEncryptionDraft = false;
21+
_groupCallDraft = false;
22+
_visibilityDraft = Visibility.public;
23+
_createRoomPresetDraft = CreateRoomPreset.publicChat;
24+
_historyVisibilityDraft = HistoryVisibility.shared;
2925
_profilesDraft = {};
3026
_avatarDraftFile = null;
3127
}
3228

29+
Stream<SyncUpdate> get _joinedUpdateStream =>
30+
_client.onSync.stream.where((e) => e.rooms?.join?.isNotEmpty ?? false);
31+
32+
Stream<JoinedRoomUpdate?> _getJoinedRoomUpdate(String? roomId) =>
33+
_joinedUpdateStream.map((e) => e.rooms?.join?[roomId]);
34+
3335
// ROOM NAME
3436

3537
String _nameDraft = '';
@@ -80,13 +82,32 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
8082
}
8183
}
8284

85+
// ROOM CANONICAL ALIAS
86+
87+
Stream<String> getJoinedRoomCanonicalAliasStream(Room room) =>
88+
_getJoinedRoomUpdate(room.id).map((_) => room.canonicalAlias).distinct();
89+
90+
Stream<bool> getCanChangeCanonicalAliasStream(Room room) =>
91+
_getJoinedRoomUpdate(
92+
room.id,
93+
).map((_) => room.canChangeCanonicalAlias).distinct();
94+
95+
Future<void> changeRoomCanonicalAlias(Room room, String text) async {
96+
try {
97+
await room.setCanonicalAlias(text);
98+
} on Exception catch (e, s) {
99+
printMessageInDebugMode(e, s);
100+
rethrow;
101+
}
102+
}
103+
83104
// ROOM ENCRYPTION
84105

85-
bool _enableEncryption = false;
86-
bool get enableEncryption => _enableEncryption;
87-
void setEnableEncryption(bool enableEncryption) {
88-
if (enableEncryption == _enableEncryption) return;
89-
_enableEncryption = enableEncryption;
106+
bool _enableEncryptionDraft = false;
107+
bool get enableEncryptionDraft => _enableEncryptionDraft;
108+
void setEnableEncryptionDraft(bool enableEncryption) {
109+
if (enableEncryption == _enableEncryptionDraft) return;
110+
_enableEncryptionDraft = enableEncryption;
90111
notifyListeners();
91112
}
92113

@@ -116,21 +137,21 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
116137
}
117138
}
118139

119-
bool _groupCall = false;
120-
bool get groupCall => _groupCall;
121-
void setGroupCall(bool groupCall) {
122-
if (groupCall == _groupCall) return;
123-
_groupCall = groupCall;
140+
// ROOM JOIN RULES
141+
142+
Visibility _visibilityDraft = Visibility.public;
143+
Visibility get visibilityDraft => _visibilityDraft;
144+
void setVisibilityDraft(Visibility visibility) {
145+
if (visibility == _visibilityDraft) return;
146+
_visibilityDraft = visibility;
124147
notifyListeners();
125148
}
126149

127-
// ROOM JOIN RULES
128-
129-
JoinRules _joinRules = JoinRules.public;
130-
JoinRules get joinRules => _joinRules;
131-
void setJoinRules(JoinRules joinRule) {
132-
if (joinRule == _joinRules) return;
133-
_joinRules = joinRule;
150+
CreateRoomPreset _createRoomPresetDraft = CreateRoomPreset.publicChat;
151+
CreateRoomPreset get createRoomPresetDraft => _createRoomPresetDraft;
152+
void setCreateRoomPresetDraft(CreateRoomPreset preset) {
153+
if (preset == _createRoomPresetDraft) return;
154+
_createRoomPresetDraft = preset;
134155
notifyListeners();
135156
}
136157

@@ -154,11 +175,11 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
154175

155176
// ROOM HISTORY VISIBILITY
156177

157-
HistoryVisibility _historyVisibility = HistoryVisibility.shared;
158-
HistoryVisibility get historyVisibility => _historyVisibility;
159-
void setHistoryVisibility(HistoryVisibility historyVisibility) {
160-
if (historyVisibility == _historyVisibility) return;
161-
_historyVisibility = historyVisibility;
178+
HistoryVisibility _historyVisibilityDraft = HistoryVisibility.shared;
179+
HistoryVisibility get historyVisibilityDraft => _historyVisibilityDraft;
180+
void setHistoryVisibilityDraft(HistoryVisibility historyVisibility) {
181+
if (historyVisibility == _historyVisibilityDraft) return;
182+
_historyVisibilityDraft = historyVisibility;
162183
notifyListeners();
163184
}
164185

@@ -356,53 +377,52 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
356377
}
357378
}
358379

380+
// GROUP CALL DRAFT
381+
382+
bool _groupCallDraft = false;
383+
bool get groupCallDraft => _groupCallDraft;
384+
void setGroupCallDraft(bool groupCall) {
385+
if (groupCall == _groupCallDraft) return;
386+
_groupCallDraft = groupCall;
387+
notifyListeners();
388+
}
389+
359390
// CREATE ROOM, SPACE OR DIRECT CHAT
360391

361392
Future<Room?> createRoomOrSpace({
362-
String? groupName,
363-
bool enableEncryption = true,
364-
List<String>? invite,
365-
List<StateEvent>? initialState,
366-
required JoinRules joinRules,
367-
HistoryVisibility? historyVisibility,
393+
required bool space,
368394
bool waitForSync = true,
369-
bool groupCall = false,
395+
List<StateEvent>? initialState,
370396
bool federated = true,
371397
Map<String, dynamic>? powerLevelContentOverride,
372-
MatrixFile? avatarFile,
373-
bool space = false,
374-
List<Invite3pid>? spaceInvite3pid,
375-
String? spaceRoomVersion,
376-
String? spaceTopic,
377-
String? spaceAliasName,
378398
}) async {
379399
String? roomId;
380400
try {
381401
roomId = space
382402
? await _client.createSpace(
383-
name: groupName,
384-
visibility: joinRules == JoinRules.private
385-
? Visibility.private
386-
: Visibility.public,
387-
invite: invite,
388-
invite3pid: spaceInvite3pid,
389-
roomVersion: spaceRoomVersion,
390-
topic: spaceTopic,
403+
name: _nameDraft,
404+
visibility: _visibilityDraft,
405+
invite: _profilesDraft
406+
.map((p) => p.userId)
407+
.toList(growable: false),
408+
invite3pid: null,
409+
roomVersion: null,
410+
topic: _topicDraft,
391411
waitForSync: waitForSync,
392-
spaceAliasName: spaceAliasName,
412+
spaceAliasName: _nameDraft,
393413
)
394414
: await _client.createGroupChat(
395-
groupName: groupName,
396-
enableEncryption: enableEncryption,
397-
invite: invite,
415+
groupName: _nameDraft,
416+
enableEncryption: _enableEncryptionDraft,
417+
invite: _profilesDraft
418+
.map((p) => p.userId)
419+
.toList(growable: false),
398420
initialState: initialState,
399-
visibility: joinRules == JoinRules.private
400-
? Visibility.private
401-
: Visibility.public,
402-
403-
historyVisibility: historyVisibility,
421+
visibility: _visibilityDraft,
422+
preset: _createRoomPresetDraft,
423+
historyVisibility: _historyVisibilityDraft,
404424
waitForSync: waitForSync,
405-
groupCall: groupCall,
425+
groupCall: _groupCallDraft,
406426
federated: federated,
407427
powerLevelContentOverride: powerLevelContentOverride,
408428
);
@@ -414,9 +434,9 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
414434
final maybeRoom = _client.getRoomById(roomId);
415435
if (maybeRoom != null) {
416436
if (maybeRoom.canChangeStateEvent(EventTypes.RoomAvatar) &&
417-
avatarFile?.bytes != null) {
437+
_avatarDraftFile?.bytes != null) {
418438
try {
419-
await maybeRoom.setAvatar(avatarFile);
439+
await maybeRoom.setAvatar(_avatarDraftFile);
420440
} on Exception catch (e, s) {
421441
printMessageInDebugMode(e, s);
422442
}
@@ -543,22 +563,4 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
543563
rethrow;
544564
}
545565
}
546-
547-
Stream<String> getJoinedRoomCanonicalAliasStream(Room room) =>
548-
_getJoinedRoomUpdate(room.id).map((_) => room.canonicalAlias).distinct();
549-
550-
Stream<bool> getCanChangeCanonicalAliasStream(Room room) =>
551-
_getJoinedRoomUpdate(
552-
room.id,
553-
).map((_) => room.canChangeCanonicalAlias).distinct();
554-
555-
Future<void> changeRoomCanonicalAlias(Room room, String text) async {
556-
// Implement the logic to change the room's canonical alias
557-
try {
558-
await room.setCanonicalAlias(text);
559-
} on Exception catch (e, s) {
560-
printMessageInDebugMode(e, s);
561-
rethrow;
562-
}
563-
}
564566
}

lib/chat_room/create_or_edit/view/chat_room_history_visibility_drop_down.dart

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,33 @@ class ChatRoomHistoryVisibilityDropDown extends StatelessWidget
1313
with WatchItMixin {
1414
const ChatRoomHistoryVisibilityDropDown({super.key, required this.room});
1515

16-
final Room room;
16+
final Room? room;
1717

1818
@override
1919
Widget build(BuildContext context) {
2020
final l10n = context.l10n;
21-
final vis =
22-
watchStream(
23-
(CreateOrEditRoomModel m) =>
24-
m.getJoinedRoomHistoryVisibilityStream(room),
25-
initialValue: room.historyVisibility,
26-
preserveState: false,
27-
).data ??
28-
room.historyVisibility;
21+
final historyVisibilityDraft = watchPropertyValue(
22+
(CreateOrEditRoomModel m) => m.historyVisibilityDraft,
23+
);
24+
final vis = room == null
25+
? historyVisibilityDraft
26+
: watchStream(
27+
(CreateOrEditRoomModel m) =>
28+
m.getJoinedRoomHistoryVisibilityStream(room!),
29+
initialValue: room!.historyVisibility,
30+
preserveState: false,
31+
).data ??
32+
room!.historyVisibility;
2933

30-
final canChangeHistoryVisibility =
31-
watchStream(
32-
(CreateOrEditRoomModel m) =>
33-
m.getCanChangeHistoryVisibilityStream(room),
34-
initialValue: room.canChangeHistoryVisibility,
35-
preserveState: false,
36-
).data ??
37-
false;
34+
final canChangeHistoryVisibility = room == null
35+
? true
36+
: watchStream(
37+
(CreateOrEditRoomModel m) =>
38+
m.getCanChangeHistoryVisibilityStream(room!),
39+
initialValue: room!.canChangeHistoryVisibility,
40+
preserveState: false,
41+
).data ??
42+
false;
3843

3944
return YaruTile(
4045
leading: const Icon(YaruIcons.private_mask),
@@ -43,46 +48,23 @@ class ChatRoomHistoryVisibilityDropDown extends StatelessWidget
4348
trailing: YaruPopupMenuButton<HistoryVisibility>(
4449
initialValue: vis,
4550
enabled: canChangeHistoryVisibility,
46-
onSelected: canChangeHistoryVisibility
51+
onSelected: room == null
52+
? (v) => di<CreateOrEditRoomModel>().setHistoryVisibilityDraft(v)
53+
: canChangeHistoryVisibility
4754
? (v) => showFutureLoadingDialog(
4855
context: context,
4956
future: () => di<CreateOrEditRoomModel>()
50-
.setHistoryVisibilityForRoom(room: room, value: v),
57+
.setHistoryVisibilityForRoom(room: room!, value: v),
5158
)
5259
: null,
5360
itemBuilder: (context) => HistoryVisibility.values
5461
.map((e) => PopupMenuItem(value: e, child: Text(e.localize(l10n))))
5562
.toList(),
56-
child: Text(room.historyVisibility?.localize(l10n) ?? ''),
57-
),
58-
);
59-
}
60-
}
61-
62-
class ChatCreateRoomHistoryVisibilityDropDown extends StatelessWidget {
63-
const ChatCreateRoomHistoryVisibilityDropDown({
64-
super.key,
65-
required this.initialValue,
66-
required this.onSelected,
67-
});
68-
69-
final HistoryVisibility initialValue;
70-
final void Function(HistoryVisibility historyVisibility) onSelected;
71-
72-
@override
73-
Widget build(BuildContext context) {
74-
final l10n = context.l10n;
75-
return YaruTile(
76-
leading: const Icon(YaruIcons.private_mask),
77-
padding: const EdgeInsets.symmetric(horizontal: kMediumPadding),
78-
title: Text(l10n.visibilityOfTheChatHistory),
79-
trailing: YaruPopupMenuButton<HistoryVisibility>(
80-
initialValue: initialValue,
81-
onSelected: onSelected,
82-
itemBuilder: (context) => HistoryVisibility.values
83-
.map((e) => PopupMenuItem(value: e, child: Text(e.localize(l10n))))
84-
.toList(),
85-
child: Text(initialValue.localize(l10n)),
63+
child: Text(
64+
room == null
65+
? historyVisibilityDraft.localize(l10n)
66+
: room!.historyVisibility?.localize(l10n) ?? '',
67+
),
8668
),
8769
);
8870
}

0 commit comments

Comments
 (0)