Skip to content

Commit 416a224

Browse files
authored
chore: detach account data from settings (#88)
1 parent 7031252 commit 416a224

32 files changed

+604
-516
lines changed

lib/chat_master/view/chat_master_detail_page.dart

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,6 @@ class _ChatMasterDetailPageState extends State<ChatMasterDetailPage> {
9090
(ChatModel m) => m.selectedRoom?.isArchived == true,
9191
);
9292

93-
final loadingArchive = watchPropertyValue(
94-
(ChatModel m) => m.loadingArchive,
95-
);
96-
9793
return Scaffold(
9894
key: masterScaffoldKey,
9995
drawer: !Platforms.isMacOS
@@ -115,9 +111,7 @@ class _ChatMasterDetailPageState extends State<ChatMasterDetailPage> {
115111
),
116112
if (context.showSideBar)
117113
const VerticalDivider(width: 0, thickness: 0),
118-
if (loadingArchive)
119-
const Expanded(child: Center(child: Progress()))
120-
else if (selectedRoom == null)
114+
if (selectedRoom == null)
121115
const Expanded(child: ChatNoSelectedRoomPage())
122116
else
123117
Expanded(

lib/chat_master/view/chat_master_panel.dart

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import 'package:flutter/material.dart';
2+
import 'package:future_loading_dialog/future_loading_dialog.dart';
23
import 'package:watch_it/watch_it.dart';
34
import 'package:yaru/yaru.dart';
45

56
import '../../common/chat_model.dart';
67
import '../../common/rooms_filter.dart';
78
import '../../common/search_model.dart';
89
import '../../common/view/build_context_x.dart';
9-
import '../../common/view/common_widgets.dart';
1010
import '../../common/view/theme.dart';
1111
import '../../common/view/ui_constants.dart';
1212
import '../../l10n/l10n.dart';
13-
import '../../settings/view/chat_settings_avatar.dart';
1413
import '../../settings/view/chat_settings_dialog.dart';
1514
import 'chat_master_list_filter_bar.dart';
15+
import 'chat_master_settings_tile_avatar.dart';
1616
import 'chat_master_title_bar.dart';
1717
import 'chat_rooms_list.dart';
1818
import 'chat_rooms_search_field.dart';
@@ -26,9 +26,7 @@ class ChatMasterSidePanel extends StatelessWidget with WatchItMixin {
2626
final l10n = context.l10n;
2727
final searchActive = watchPropertyValue((SearchModel m) => m.searchActive);
2828
final archiveActive = watchPropertyValue((ChatModel m) => m.archiveActive);
29-
final loadingArchive = watchPropertyValue(
30-
(ChatModel m) => m.loadingArchive,
31-
);
29+
3230
final roomsFilter = watchPropertyValue((ChatModel m) => m.roomsFilter);
3331
final chatModel = di<ChatModel>();
3432

@@ -41,21 +39,14 @@ class ChatMasterSidePanel extends StatelessWidget with WatchItMixin {
4139
const ChatMasterListFilterBar(),
4240
if (roomsFilter == RoomsFilter.spaces && !archiveActive)
4341
const ChatSpaceFilter(),
44-
45-
if (loadingArchive)
46-
const Expanded(child: Center(child: Progress()))
47-
else
48-
const Expanded(child: ChatRoomsList()),
42+
const Expanded(child: ChatRoomsList()),
4943
Padding(
5044
padding: const EdgeInsets.symmetric(vertical: kMediumPadding),
5145
child: Stack(
5246
alignment: Alignment.center,
5347
children: [
5448
YaruMasterTile(
55-
leading: const ChatSettingsAvatar(
56-
dimension: 25,
57-
showEditButton: false,
58-
),
49+
leading: const ChatMasterSettingsTileAvatar(),
5950
title: Text(l10n.settings),
6051
onTap: () => showDialog(
6152
context: context,
@@ -68,7 +59,10 @@ class ChatMasterSidePanel extends StatelessWidget with WatchItMixin {
6859
tooltip: context.l10n.archive,
6960
selectedIcon: const Icon(YaruIcons.trash_filled),
7061
isSelected: archiveActive,
71-
onPressed: chatModel.toggleArchive,
62+
onPressed: () => showFutureLoadingDialog(
63+
context: context,
64+
future: chatModel.toggleArchive,
65+
),
7266
icon: const Icon(YaruIcons.trash),
7367
),
7468
),
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:matrix/matrix.dart';
3+
import 'package:watch_it/watch_it.dart';
4+
5+
import '../../settings/account_model.dart';
6+
import '../../settings/view/chat_settings_avatar.dart';
7+
8+
class ChatMasterSettingsTileAvatar extends StatefulWidget {
9+
const ChatMasterSettingsTileAvatar({super.key});
10+
11+
@override
12+
State<ChatMasterSettingsTileAvatar> createState() =>
13+
_ChatMasterSettingsTileAvatarState();
14+
}
15+
16+
class _ChatMasterSettingsTileAvatarState
17+
extends State<ChatMasterSettingsTileAvatar> {
18+
late Future<Profile?> _profileFuture;
19+
20+
@override
21+
void initState() {
22+
super.initState();
23+
_profileFuture = di<AccountModel>().getMyProfile();
24+
}
25+
26+
@override
27+
Widget build(BuildContext context) => FutureBuilder(
28+
future: _profileFuture,
29+
builder: (context, asyncSnapshot) {
30+
return ChatSettingsAvatar(
31+
key: ValueKey(asyncSnapshot.data?.avatarUrl ?? 'settings_avatar'),
32+
profile: asyncSnapshot.hasError ? null : asyncSnapshot.data,
33+
dimension: 25,
34+
showEditButton: false,
35+
);
36+
},
37+
);
38+
}

lib/chat_master/view/chat_master_tile_menu.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ class _ChatMasterTileMenuState extends State<ChatMasterTileMenu> {
7878
showFutureLoadingDialog(
7979
context: context,
8080
future: () => di<CreateOrEditRoomModel>().leaveRoom(
81-
room: widget.room,
82-
forget: false,
81+
widget.room,
8382
),
8483
).then((_) {
8584
if (mounted) {

lib/chat_master/view/chat_room_master_tile.dart

Lines changed: 46 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import 'package:flutter/material.dart';
2-
import 'package:future_loading_dialog/future_loading_dialog.dart';
32
import 'package:matrix/matrix.dart';
43
import 'package:watch_it/watch_it.dart';
54
import 'package:yaru/yaru.dart';
65

76
import '../../chat_room/common/view/chat_invitation_dialog.dart';
8-
import '../../chat_room/create_or_edit/create_or_edit_room_model.dart';
97
import '../../chat_room/input/draft_model.dart';
108
import '../../chat_room/titlebar/chat_room_pin_button.dart';
119
import '../../common/chat_model.dart';
@@ -28,82 +26,57 @@ class ChatRoomMasterTile extends StatelessWidget with WatchItMixin {
2826

2927
final selectedRoom = watchPropertyValue((ChatModel m) => m.selectedRoom);
3028

31-
final loadingArchive = watchPropertyValue(
32-
(ChatModel m) => m.loadingArchive,
33-
);
34-
3529
return ChatMasterTileMenu(
3630
room: room,
37-
child: Opacity(
38-
opacity: loadingArchive ? 0.3 : 1,
39-
child: Padding(
40-
padding: const EdgeInsets.only(bottom: kSmallPadding),
41-
child: Stack(
42-
alignment: Alignment.center,
43-
children: [
44-
YaruMasterTile(
45-
key: ValueKey('${room.id}_master_tile'),
46-
selected:
47-
selectedRoom?.id != null && selectedRoom?.id == room.id,
48-
leading: ChatRoomMasterTileAvatar(room: room),
49-
title: Text(
50-
room.membership == Membership.invite
51-
? context.l10n.invite
52-
: room.getLocalizedDisplayname(),
53-
maxLines: 2,
54-
),
55-
subtitle: room.membership == Membership.invite
56-
? Text(room.getLocalizedDisplayname())
57-
: ChatRoomMasterTileSubTitle(room: room),
58-
onTap: loadingArchive
59-
? null
60-
: () async {
61-
if (room.isArchived) {
62-
chatModel.setSelectedRoom(room);
63-
} else {
64-
if (room.membership == Membership.invite) {
65-
showDialog(
66-
context: context,
67-
builder: (context) =>
68-
ChatInvitationDialog(room: room),
69-
);
70-
} else {
71-
showFutureLoadingDialog(
72-
context: context,
73-
future: () =>
74-
di<CreateOrEditRoomModel>().joinRoom(room),
75-
).then((result) {
76-
if (result.asValue?.value != null) {
77-
chatModel.setSelectedRoom(
78-
result.asValue!.value,
79-
);
80-
}
81-
});
82-
}
83-
}
84-
di<DraftModel>().setAttaching(false);
85-
86-
masterScaffoldKey.currentState?.hideDrawer();
87-
},
31+
child: Padding(
32+
padding: const EdgeInsets.only(bottom: kSmallPadding),
33+
child: Stack(
34+
alignment: Alignment.center,
35+
children: [
36+
YaruMasterTile(
37+
key: ValueKey('${room.id}_master_tile'),
38+
selected: selectedRoom?.id != null && selectedRoom?.id == room.id,
39+
leading: ChatRoomMasterTileAvatar(room: room),
40+
title: Text(
41+
room.membership == Membership.invite
42+
? context.l10n.invite
43+
: room.getLocalizedDisplayname(),
44+
maxLines: 2,
8845
),
89-
if (!room.isArchived) ...[
90-
if (room.notificationCount > 0)
91-
Positioned(
92-
right: kBigPadding,
93-
child: Badge(
94-
largeSize: 11,
95-
smallSize: 11,
96-
label: Text(room.notificationCount.toString()),
97-
),
98-
)
99-
else if (room.isFavourite)
100-
Positioned(
101-
right: kBigPadding - 3,
102-
child: ChatRoomPinButton(room: room, small: true),
46+
subtitle: room.membership == Membership.invite
47+
? Text(room.getLocalizedDisplayname())
48+
: ChatRoomMasterTileSubTitle(room: room),
49+
onTap: () async {
50+
di<DraftModel>().setAttaching(false);
51+
masterScaffoldKey.currentState?.hideDrawer();
52+
return switch (room.membership) {
53+
Membership.join ||
54+
Membership.leave => chatModel.setSelectedRoom(room),
55+
Membership.invite => showDialog(
56+
context: context,
57+
builder: (context) => ChatInvitationDialog(room: room),
58+
),
59+
_ => Future.value(),
60+
};
61+
},
62+
),
63+
if (!room.isArchived) ...[
64+
if (room.notificationCount > 0)
65+
Positioned(
66+
right: kBigPadding,
67+
child: Badge(
68+
largeSize: 11,
69+
smallSize: 11,
70+
label: Text(room.notificationCount.toString()),
10371
),
104-
],
72+
)
73+
else if (room.isFavourite)
74+
Positioned(
75+
right: kBigPadding - 3,
76+
child: ChatRoomPinButton(room: room, small: true),
77+
),
10578
],
106-
),
79+
],
10780
),
10881
),
10982
);

lib/chat_master/view/chat_space_control_panel.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ class ChatSpaceControlPanel extends StatelessWidget with WatchItMixin {
7272
showFutureLoadingDialog(
7373
context: context,
7474
future: () => di<CreateOrEditRoomModel>().leaveRoom(
75-
room: activeSpace,
76-
forget: false,
75+
activeSpace,
7776
),
7877
).then((_) {
7978
di<ChatModel>().setSelectedRoom(null);

lib/chat_room/common/view/chat_invitation_dialog.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:watch_it/watch_it.dart';
55

66
import '../../../common/chat_model.dart';
77
import '../../../common/view/confirm.dart';
8+
import '../../../l10n/l10n.dart';
89
import '../../create_or_edit/create_or_edit_room_model.dart';
910

1011
class ChatInvitationDialog extends StatelessWidget with WatchItMixin {
@@ -14,17 +15,18 @@ class ChatInvitationDialog extends StatelessWidget with WatchItMixin {
1415

1516
@override
1617
Widget build(BuildContext context) => ConfirmationDialog(
17-
title: Text(room.getLocalizedDisplayname()),
18-
onCancel: () =>
18+
title: Text('${context.l10n.invite}: ${room.getLocalizedDisplayname()}'),
19+
cancelLabel: context.l10n.reject,
20+
onCancel: () async =>
1921
showFutureLoadingDialog(
2022
context: context,
21-
future: () =>
22-
di<CreateOrEditRoomModel>().leaveRoom(room: room, forget: false),
23+
future: () => di<CreateOrEditRoomModel>().leaveRoom(room),
2324
).then((_) {
2425
if (context.mounted) {
2526
di<ChatModel>().setSelectedRoom(null);
2627
}
2728
}),
29+
confirmLabel: context.l10n.accept,
2830
onConfirm: () =>
2931
showFutureLoadingDialog(
3032
context: context,

lib/chat_room/common/view/chat_room_page.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ class _ChatRoomPageState extends State<ChatRoomPage> {
6666
registerStreamHandler(
6767
select: (ChatModel m) => m.getLeftRoomStream(widget.room.id),
6868
handler: (context, leftRoomUpdate, cancel) {
69-
if (!di<ChatModel>().archiveActive &&
70-
!di<ChatModel>().loadingArchive &&
71-
leftRoomUpdate.hasData) {
69+
if (!di<ChatModel>().archiveActive && leftRoomUpdate.hasData) {
7270
di<ChatModel>().setSelectedRoom(null);
7371
showDialog(
7472
context: context,

lib/chat_room/create_or_edit/create_or_edit_room_model.dart

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:safe_change_notifier/safe_change_notifier.dart';
88
import '../../common/logging.dart';
99
import '../../common/platforms.dart';
1010
import '../../common/room_x.dart';
11+
import '../../common/xtypegroup_x.dart';
1112

1213
class CreateOrEditRoomModel {
1314
CreateOrEditRoomModel({required Client client}) : _client = client;
@@ -300,7 +301,12 @@ class CreateOrEditRoomModel {
300301
try {
301302
XFile? xFile;
302303
if (Platforms.isLinux) {
303-
xFile = await openFile();
304+
xFile = await openFile(
305+
acceptedTypeGroups: <XTypeGroup>[
306+
XTypeGroupX.jpgsTypeGroup,
307+
XTypeGroupX.pngTypeGroup,
308+
],
309+
);
304310
} else {
305311
final result = await FilePicker.platform.pickFiles(
306312
allowMultiple: false,
@@ -457,12 +463,19 @@ class CreateOrEditRoomModel {
457463
return room;
458464
}
459465

460-
Future<void> leaveRoom({required Room room, required bool forget}) async {
466+
Future<void> leaveRoom(Room room) async {
461467
try {
462-
await Future.wait([
463-
if (forget) room.forget() else room.leave(),
464-
if (forget) _client.oneShotSync(),
465-
]);
468+
await room.leave();
469+
} on Exception catch (e, s) {
470+
printMessageInDebugMode(e, s);
471+
rethrow;
472+
}
473+
}
474+
475+
Future<void> forgetRoom(Room room) async {
476+
try {
477+
await room.forget();
478+
await _client.oneShotSync();
466479
} on Exception catch (e, s) {
467480
printMessageInDebugMode(e, s);
468481
rethrow;

lib/chat_room/info_drawer/chat_room_info_drawer_forget_button.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ class ChatRoomInfoDrawerForgetButton extends StatelessWidget {
4242
barrierDismissible: true,
4343
title: context.l10n.delete,
4444
context: context,
45-
future: () =>
46-
di<CreateOrEditRoomModel>().leaveRoom(room: room, forget: true),
45+
future: () => di<CreateOrEditRoomModel>().forgetRoom(room),
4746
);
4847
},
4948
icon: Icon(

0 commit comments

Comments
 (0)