Skip to content

Commit 7031252

Browse files
authored
chore: refactor createoreditroommodel to use safevaluenotifier instead of changenotifier (#87)
1 parent 274b271 commit 7031252

17 files changed

+207
-199
lines changed

lib/chat_master/view/active_space_info.dart renamed to lib/chat_master/view/chat_master_active_space_info.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import '../../common/view/sliver_sticky_panel.dart';
88
import '../../common/view/snackbars.dart';
99
import '../../common/view/ui_constants.dart';
1010

11-
class ActiveSpaceInfo extends StatelessWidget with WatchItMixin {
12-
const ActiveSpaceInfo({super.key});
11+
class ChatMasterActiveSpaceInfo extends StatelessWidget with WatchItMixin {
12+
const ChatMasterActiveSpaceInfo({super.key});
1313

1414
@override
1515
Widget build(BuildContext context) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:future_loading_dialog/future_loading_dialog.dart';
3+
import 'package:watch_it/watch_it.dart';
4+
import 'package:yaru/yaru.dart';
5+
6+
import '../../chat_room/create_or_edit/create_or_edit_room_model.dart';
7+
import '../../l10n/l10n.dart';
8+
9+
class ChatMasterClearArchiveButton extends StatelessWidget {
10+
const ChatMasterClearArchiveButton({super.key});
11+
12+
@override
13+
Widget build(BuildContext context) => IconButton(
14+
tooltip: context.l10n.clearArchive,
15+
onPressed: () => showFutureLoadingDialog(
16+
title: context.l10n.clearArchive,
17+
context: context,
18+
future: () => di<CreateOrEditRoomModel>().forgetAllArchivedRooms(),
19+
),
20+
icon: const Icon(YaruIcons.edit_clear_all),
21+
);
22+
}

lib/chat_master/view/chat_new_chat_popup_menu_button.dart renamed to lib/chat_master/view/chat_master_new_chat_popup_menu_button.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import '../../chat_room/create_or_edit/view/create_or_edit_room_dialog.dart';
66
import '../../l10n/l10n.dart';
77
import 'chat_rooms_or_spaces_search_dialog.dart';
88

9-
class ChatNewChatPopupMenuButton extends StatelessWidget {
10-
const ChatNewChatPopupMenuButton({super.key});
9+
class ChatMasterNewChatPopupMenuButton extends StatelessWidget {
10+
const ChatMasterNewChatPopupMenuButton({super.key});
1111

1212
@override
1313
Widget build(BuildContext context) {

lib/chat_master/view/chat_master_title_bar.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import '../../common/view/space.dart';
99
import '../../common/view/theme.dart';
1010
import '../../common/view/ui_constants.dart';
1111
import '../../l10n/l10n.dart';
12-
import 'chat_new_chat_popup_menu_button.dart';
12+
import 'chat_master_clear_archive_button.dart';
13+
import 'chat_master_new_chat_popup_menu_button.dart';
1314

1415
class ChatMasterTitleBar extends StatelessWidget with WatchItMixin {
1516
const ChatMasterTitleBar({super.key});
@@ -32,7 +33,11 @@ class ChatMasterTitleBar extends StatelessWidget with WatchItMixin {
3233
widthGap: kSmallPadding,
3334
skip: 0,
3435
children: [
35-
if (!archiveActive) const ChatNewChatPopupMenuButton(),
36+
if (!archiveActive)
37+
const ChatMasterNewChatPopupMenuButton()
38+
else
39+
const ChatMasterClearArchiveButton(),
40+
3641
IconButton(
3742
tooltip: context.l10n.search,
3843
isSelected: searchActive,

lib/chat_master/view/chat_room_master_tile_avatar.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ class ChatRoomMasterTileAvatar extends StatelessWidget with WatchItMixin {
2020
initialValue: room.pushRuleState,
2121
).data ??
2222
room.pushRuleState;
23+
2324
return ChatAvatar(
25+
key: ValueKey('${room.id}_avatar_${room.avatar ?? ''}_$pushRuleState'),
2426
avatarUri: pushRuleState == PushRuleState.dontNotify ? null : room.avatar,
2527
fallBackIcon: room.membership != Membership.invite
2628
? pushRuleState == PushRuleState.dontNotify

lib/chat_master/view/chat_rooms_list.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:watch_it/watch_it.dart';
33

44
import '../../common/chat_model.dart';
55
import '../../common/rooms_filter.dart';
6-
import 'active_space_info.dart';
6+
import 'chat_master_active_space_info.dart';
77
import 'chat_room_master_tile.dart';
88
import 'chat_space_control_panel.dart';
99
import 'chat_spaces_search_list.dart';
@@ -28,7 +28,7 @@ class ChatRoomsList extends StatelessWidget with WatchItMixin {
2828
return CustomScrollView(
2929
slivers: [
3030
if (activeSpace != null && roomsFilter == RoomsFilter.spaces) ...[
31-
const ActiveSpaceInfo(),
31+
const ChatMasterActiveSpaceInfo(),
3232
const ChatSpaceControlPanel(),
3333
const ChatSpacesSearchList(),
3434
],

lib/chat_master/view/chat_space_control_panel.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class ChatSpaceControlPanel extends StatelessWidget with WatchItMixin {
7777
),
7878
).then((_) {
7979
di<ChatModel>().setSelectedRoom(null);
80+
di<ChatModel>().setActiveSpace(null);
8081
});
8182
},
8283
),

lib/chat_room/create_or_edit/create_or_edit_room_model.dart

Lines changed: 58 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ import '../../common/logging.dart';
99
import '../../common/platforms.dart';
1010
import '../../common/room_x.dart';
1111

12-
class CreateOrEditRoomModel extends SafeChangeNotifier {
12+
class CreateOrEditRoomModel {
1313
CreateOrEditRoomModel({required Client client}) : _client = client;
1414

1515
final Client _client;
1616

1717
void init({required Room? room, required bool isSpace}) {
18-
_nameDraft = '';
19-
_topicDraft = '';
20-
_enableEncryptionDraft = false;
21-
_groupCallDraft = false;
22-
_visibilityDraft = Visibility.public;
23-
_createRoomPresetDraft = CreateRoomPreset.publicChat;
24-
_historyVisibilityDraft = HistoryVisibility.shared;
25-
_profilesDraft = {};
26-
_avatarDraftFile = null;
18+
nameDraft.value = '';
19+
topicDraft.value = '';
20+
enableEncryptionDraft.value = false;
21+
groupCallDraft.value = false;
22+
visibilityDraft.value = Visibility.public;
23+
createRoomPresetDraft.value = CreateRoomPreset.publicChat;
24+
historyVisibilityDraft.value = HistoryVisibility.shared;
25+
profilesDraft.value = {};
26+
avatarDraft.value = null;
2727
}
2828

2929
Stream<SyncUpdate> get _joinedUpdateStream =>
@@ -34,13 +34,7 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
3434

3535
// ROOM NAME
3636

37-
String _nameDraft = '';
38-
String get nameDraft => _nameDraft;
39-
void setNameDraft(String name) {
40-
if (name == _nameDraft) return;
41-
_nameDraft = name;
42-
notifyListeners();
43-
}
37+
SafeValueNotifier<String> nameDraft = SafeValueNotifier('');
4438

4539
Stream<String> getJoinedRoomNameStream(Room room) =>
4640
_getJoinedRoomUpdate(room.id).map((_) => room.name).distinct();
@@ -59,13 +53,7 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
5953

6054
// ROOM TOPIC
6155

62-
String _topicDraft = '';
63-
String get topicDraft => _topicDraft;
64-
void setTopicDraft(String topic) {
65-
if (topic == _topicDraft) return;
66-
_topicDraft = topic;
67-
notifyListeners();
68-
}
56+
SafeValueNotifier<String> topicDraft = SafeValueNotifier('');
6957

7058
Stream<String> getJoinedRoomTopicStream(Room room) =>
7159
_getJoinedRoomUpdate(room.id).map((_) => room.topic).distinct();
@@ -103,13 +91,7 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
10391

10492
// ROOM ENCRYPTION
10593

106-
bool _enableEncryptionDraft = false;
107-
bool get enableEncryptionDraft => _enableEncryptionDraft;
108-
void setEnableEncryptionDraft(bool enableEncryption) {
109-
if (enableEncryption == _enableEncryptionDraft) return;
110-
_enableEncryptionDraft = enableEncryption;
111-
notifyListeners();
112-
}
94+
SafeValueNotifier<bool> enableEncryptionDraft = SafeValueNotifier(false);
11395

11496
Stream<bool?> getIsRoomEncryptedStream(Room? room) =>
11597
_getJoinedRoomUpdate(room?.id)
@@ -139,21 +121,12 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
139121

140122
// ROOM JOIN RULES
141123

142-
Visibility _visibilityDraft = Visibility.public;
143-
Visibility get visibilityDraft => _visibilityDraft;
144-
void setVisibilityDraft(Visibility visibility) {
145-
if (visibility == _visibilityDraft) return;
146-
_visibilityDraft = visibility;
147-
notifyListeners();
148-
}
149-
150-
CreateRoomPreset _createRoomPresetDraft = CreateRoomPreset.publicChat;
151-
CreateRoomPreset get createRoomPresetDraft => _createRoomPresetDraft;
152-
void setCreateRoomPresetDraft(CreateRoomPreset preset) {
153-
if (preset == _createRoomPresetDraft) return;
154-
_createRoomPresetDraft = preset;
155-
notifyListeners();
156-
}
124+
SafeValueNotifier<CreateRoomPreset> createRoomPresetDraft = SafeValueNotifier(
125+
CreateRoomPreset.publicChat,
126+
);
127+
SafeValueNotifier<Visibility> visibilityDraft = SafeValueNotifier(
128+
Visibility.public,
129+
);
157130

158131
Future<void> setJoinRulesForRoom({
159132
required Room room,
@@ -175,13 +148,8 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
175148

176149
// ROOM HISTORY VISIBILITY
177150

178-
HistoryVisibility _historyVisibilityDraft = HistoryVisibility.shared;
179-
HistoryVisibility get historyVisibilityDraft => _historyVisibilityDraft;
180-
void setHistoryVisibilityDraft(HistoryVisibility historyVisibility) {
181-
if (historyVisibility == _historyVisibilityDraft) return;
182-
_historyVisibilityDraft = historyVisibility;
183-
notifyListeners();
184-
}
151+
SafeValueNotifier<HistoryVisibility> historyVisibilityDraft =
152+
SafeValueNotifier(HistoryVisibility.shared);
185153

186154
Future<void> setHistoryVisibilityForRoom({
187155
required Room room,
@@ -203,19 +171,16 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
203171

204172
// ROOM PROFILES DRAFT AND INVITES
205173

206-
Set<Profile> _profilesDraft = {};
207-
Set<Profile> get profilesDraft => _profilesDraft;
174+
SafeValueNotifier<Set<Profile>> profilesDraft = SafeValueNotifier({});
208175

209176
void addProfileToDraft(Profile profile) {
210-
if (_profilesDraft.contains(profile)) return;
211-
_profilesDraft.add(profile);
212-
notifyListeners();
177+
if (profilesDraft.value.contains(profile)) return;
178+
profilesDraft.value = {...profilesDraft.value, profile};
213179
}
214180

215181
void removeProfileFromDraft(Profile profile) {
216-
if (!_profilesDraft.contains(profile)) return;
217-
_profilesDraft.remove(profile);
218-
notifyListeners();
182+
if (!profilesDraft.value.contains(profile)) return;
183+
profilesDraft.value = {...profilesDraft.value..remove(profile)};
219184
}
220185

221186
Future<void> inviteUserToRoom({
@@ -317,8 +282,7 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
317282

318283
// ROOM AVATAR DRAFT OR UPLOAD
319284

320-
MatrixFile? _avatarDraftFile;
321-
MatrixFile? get avatarDraftFile => _avatarDraftFile;
285+
SafeValueNotifier<MatrixImageFile?> avatarDraft = SafeValueNotifier(null);
322286

323287
Stream<Uri?> getJoinedRoomAvatarStream(Room? room) =>
324288
_getJoinedRoomUpdate(room?.id)
@@ -359,7 +323,7 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
359323
throw Exception(wrongFormatString);
360324
}
361325

362-
_avatarDraftFile = await MatrixImageFile.shrink(
326+
avatarDraft.value = await MatrixImageFile.shrink(
363327
bytes: bytes,
364328
name: xFile.name,
365329
mimeType: mime,
@@ -368,8 +332,8 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
368332
);
369333

370334
if (room != null) {
371-
await room.setAvatar(_avatarDraftFile);
372-
_avatarDraftFile = null;
335+
await room.setAvatar(avatarDraft.value);
336+
avatarDraft.value = null;
373337
}
374338
} on Exception catch (e, s) {
375339
printMessageInDebugMode(e, s);
@@ -379,13 +343,7 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
379343

380344
// GROUP CALL DRAFT
381345

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-
}
346+
SafeValueNotifier<bool> groupCallDraft = SafeValueNotifier(false);
389347

390348
// CREATE ROOM, SPACE OR DIRECT CHAT
391349

@@ -400,29 +358,29 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
400358
try {
401359
roomId = space
402360
? await _client.createSpace(
403-
name: _nameDraft,
404-
visibility: _visibilityDraft,
405-
invite: _profilesDraft
361+
name: nameDraft.value,
362+
visibility: visibilityDraft.value,
363+
invite: profilesDraft.value
406364
.map((p) => p.userId)
407365
.toList(growable: false),
408366
invite3pid: null,
409367
roomVersion: null,
410-
topic: _topicDraft,
368+
topic: topicDraft.value,
411369
waitForSync: waitForSync,
412-
spaceAliasName: _nameDraft,
370+
spaceAliasName: nameDraft.value,
413371
)
414372
: await _client.createGroupChat(
415-
groupName: _nameDraft,
416-
enableEncryption: _enableEncryptionDraft,
417-
invite: _profilesDraft
373+
groupName: nameDraft.value,
374+
enableEncryption: enableEncryptionDraft.value,
375+
invite: profilesDraft.value
418376
.map((p) => p.userId)
419377
.toList(growable: false),
420378
initialState: initialState,
421-
visibility: _visibilityDraft,
422-
preset: _createRoomPresetDraft,
423-
historyVisibility: _historyVisibilityDraft,
379+
visibility: visibilityDraft.value,
380+
preset: createRoomPresetDraft.value,
381+
historyVisibility: historyVisibilityDraft.value,
424382
waitForSync: waitForSync,
425-
groupCall: _groupCallDraft,
383+
groupCall: groupCallDraft.value,
426384
federated: federated,
427385
powerLevelContentOverride: powerLevelContentOverride,
428386
);
@@ -434,9 +392,9 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
434392
final maybeRoom = _client.getRoomById(roomId);
435393
if (maybeRoom != null) {
436394
if (maybeRoom.canChangeStateEvent(EventTypes.RoomAvatar) &&
437-
_avatarDraftFile?.bytes != null) {
395+
avatarDraft.value?.bytes != null) {
438396
try {
439-
await maybeRoom.setAvatar(_avatarDraftFile);
397+
await maybeRoom.setAvatar(avatarDraft.value);
440398
} on Exception catch (e, s) {
441399
printMessageInDebugMode(e, s);
442400
}
@@ -511,6 +469,19 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
511469
}
512470
}
513471

472+
Future<void> forgetAllArchivedRooms() async {
473+
final archivedRooms = _client.archivedRooms;
474+
if (archivedRooms.isEmpty) return;
475+
476+
try {
477+
await Future.wait(archivedRooms.map((e) => e.room.forget()));
478+
await _client.oneShotSync();
479+
} on Exception catch (e, s) {
480+
printMessageInDebugMode(e, s);
481+
rethrow;
482+
}
483+
}
484+
514485
Future<Room?> knockOrJoinRoomChunk(PublicRoomsChunk chunk) async {
515486
final knock = chunk.joinRule == 'knock';
516487

@@ -543,7 +514,6 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
543514

544515
try {
545516
await space.setSpaceChild(room.id);
546-
notifyListeners();
547517
} on Exception catch (e, s) {
548518
printMessageInDebugMode(e, s);
549519
rethrow;
@@ -557,7 +527,6 @@ class CreateOrEditRoomModel extends SafeChangeNotifier {
557527

558528
try {
559529
await space.removeSpaceChild(room.id);
560-
notifyListeners();
561530
} on Exception catch (e, s) {
562531
printMessageInDebugMode(e, s);
563532
rethrow;

0 commit comments

Comments
 (0)