Skip to content

Commit c2f65c6

Browse files
authored
feat: use commands for joining (#132)
1 parent 3f157a7 commit c2f65c6

File tree

11 files changed

+172
-101
lines changed

11 files changed

+172
-101
lines changed

lib/chat_master/view/chat_room_master_tile.dart

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

6-
import '../../chat_room/common/view/chat_invitation_dialog.dart';
6+
import '../../chat_room/common/view/chat_join_room_dialog.dart';
77
import '../../chat_room/create_or_edit/edit_room_manager.dart';
88
import '../../chat_room/input/draft_manager.dart';
99
import '../../chat_room/titlebar/chat_room_pin_button.dart';
@@ -76,7 +76,7 @@ class ChatRoomMasterTile extends StatelessWidget with WatchItMixin {
7676
Membership.invite => showDialog(
7777
context: context,
7878
builder: (context) =>
79-
ChatInvitationDialog(room: room),
79+
ChatJoinRoomDialog(room: room),
8080
),
8181
_ => Future.value(),
8282
};

lib/chat_master/view/chat_spaces_search_list.dart

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_it/flutter_it.dart';
33
import 'package:yaru/yaru.dart';
44

5-
import '../../chat_room/create_or_edit/edit_room_service.dart';
5+
import '../../chat_room/create_or_edit/edit_room_manager.dart';
66
import '../../common/chat_manager.dart';
77
import '../../common/rooms_filter.dart';
88
import '../../common/search_manager.dart';
@@ -77,18 +77,8 @@ class ChatSpacesSearchList extends StatelessWidget with WatchItMixin {
7777
),
7878
context: context,
7979
onConfirm: () async {
80-
final maybe = await di<EditRoomService>().knockOrJoinRoomChunk(
81-
chunk,
82-
);
83-
if (maybe != null) {
84-
di<ChatManager>().setSelectedRoom(maybe);
85-
if (maybe.isSpace) {
86-
di<ChatManager>().setActiveSpace(maybe);
87-
}
88-
}
89-
if (context.mounted) {
90-
Navigator.of(context).pop();
91-
}
80+
Navigator.of(context).pop();
81+
di<EditRoomManager>().knockOrJoinCommand.run(chunk);
9282
},
9383
),
9484
),
Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_it/flutter_it.dart';
3-
import 'package:future_loading_dialog/future_loading_dialog.dart';
43
import 'package:matrix/matrix.dart';
54

65
import '../../../common/chat_manager.dart';
76
import '../../../common/view/confirm.dart';
87
import '../../../l10n/l10n.dart';
98
import '../../create_or_edit/edit_room_manager.dart';
10-
import '../../create_or_edit/edit_room_service.dart';
119

12-
class ChatInvitationDialog extends StatelessWidget with WatchItMixin {
13-
const ChatInvitationDialog({super.key, required this.room});
10+
class ChatJoinRoomDialog extends StatelessWidget with WatchItMixin {
11+
const ChatJoinRoomDialog({super.key, required this.room});
1412

1513
final Room room;
1614

@@ -23,14 +21,6 @@ class ChatInvitationDialog extends StatelessWidget with WatchItMixin {
2321
di<EditRoomManager>().getLeaveRoomCommand(room).run();
2422
},
2523
confirmLabel: context.l10n.accept,
26-
onConfirm: () =>
27-
showFutureLoadingDialog(
28-
context: context,
29-
future: () => di<EditRoomService>().joinRoom(room),
30-
).then((result) {
31-
if (result.asValue?.value != null) {
32-
di<ChatManager>().setSelectedRoom(result.asValue!.value);
33-
}
34-
}),
24+
onConfirm: () => di<EditRoomManager>().joinRoomCommand.run(room),
3525
);
3626
}

lib/chat_room/common/view/chat_no_selected_room_page.dart

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,71 @@ import 'dart:io';
22

33
import 'package:flutter/foundation.dart';
44
import 'package:flutter/material.dart';
5+
import 'package:flutter_it/flutter_it.dart';
56
import 'package:yaru/yaru.dart';
67

8+
import '../../../common/chat_manager.dart';
79
import '../../../common/view/build_context_x.dart';
810
import '../../../common/view/ui_constants.dart';
11+
import '../../create_or_edit/edit_room_manager.dart';
912
import '../../titlebar/side_bar_button.dart';
1013

11-
class ChatNoSelectedRoomPage extends StatelessWidget {
14+
class ChatNoSelectedRoomPage extends StatelessWidget with WatchItMixin {
1215
const ChatNoSelectedRoomPage({super.key});
1316

1417
@override
15-
Widget build(BuildContext context) => Scaffold(
16-
appBar: YaruWindowTitleBar(
17-
heroTag: '<Right hero tag>',
18-
border: BorderSide.none,
19-
backgroundColor: Colors.transparent,
20-
title: const Text(''),
21-
leading: !kIsWeb && !Platform.isMacOS && !context.showSideBar
22-
? const SideBarButton()
23-
: null,
24-
actions: [
25-
if (!context.showSideBar && !kIsWeb && Platform.isMacOS)
26-
const SideBarButton(),
27-
],
28-
),
29-
body: Padding(
30-
padding: const EdgeInsets.only(bottom: kYaruTitleBarHeight),
31-
child: Center(
32-
child: Column(
33-
mainAxisSize: MainAxisSize.min,
34-
spacing: kBigPadding,
35-
children: [
36-
Image.asset('assets/nebuchadnezzar.png', width: 100, height: 100),
37-
const Text('Please select a chatroom from the side panel.'),
38-
],
18+
Widget build(BuildContext context) {
19+
registerHandler(
20+
select: (EditRoomManager m) => m.knockOrJoinCommand,
21+
handler: (context, room, cancel) {
22+
if (room != null) {
23+
di<ChatManager>().setSelectedRoom(room);
24+
if (room.isSpace) {
25+
di<ChatManager>().setActiveSpace(room);
26+
}
27+
}
28+
},
29+
);
30+
31+
registerHandler(
32+
select: (EditRoomManager m) => m.joinRoomCommand,
33+
handler: (context, room, cancel) {
34+
if (room != null) {
35+
di<ChatManager>().setSelectedRoom(room);
36+
if (room.isSpace) {
37+
di<ChatManager>().setActiveSpace(room);
38+
}
39+
}
40+
},
41+
);
42+
43+
return Scaffold(
44+
appBar: YaruWindowTitleBar(
45+
heroTag: '<Right hero tag>',
46+
border: BorderSide.none,
47+
backgroundColor: Colors.transparent,
48+
title: const Text(''),
49+
leading: !kIsWeb && !Platform.isMacOS && !context.showSideBar
50+
? const SideBarButton()
51+
: null,
52+
actions: [
53+
if (!context.showSideBar && !kIsWeb && Platform.isMacOS)
54+
const SideBarButton(),
55+
],
56+
),
57+
body: Padding(
58+
padding: const EdgeInsets.only(bottom: kYaruTitleBarHeight),
59+
child: Center(
60+
child: Column(
61+
mainAxisSize: MainAxisSize.min,
62+
spacing: kBigPadding,
63+
children: [
64+
Image.asset('assets/nebuchadnezzar.png', width: 100, height: 100),
65+
const Text('Please select a chatroom from the side panel.'),
66+
],
67+
),
3968
),
4069
),
41-
),
42-
);
70+
);
71+
}
4372
}

lib/chat_room/common/view/chat_room_page.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import '../../../common/view/snackbars.dart';
1717
import '../../../common/view/theme.dart';
1818
import '../../../common/view/ui_constants.dart';
1919
import '../../../l10n/l10n.dart';
20+
import '../../create_or_edit/edit_room_manager.dart';
2021
import '../../info_drawer/chat_room_info_drawer.dart';
2122
import '../../input/draft_manager.dart';
2223
import '../../input/view/chat_input.dart';
@@ -65,6 +66,53 @@ class _ChatRoomPageState extends State<ChatRoomPage> {
6566

6667
@override
6768
Widget build(BuildContext context) {
69+
registerHandler(
70+
select: (EditRoomManager m) => m.knockOrJoinCommand,
71+
handler: (context, room, cancel) {
72+
if (room != null) {
73+
di<ChatManager>().setSelectedRoom(room);
74+
if (room.isSpace) {
75+
di<ChatManager>().setActiveSpace(room);
76+
}
77+
}
78+
},
79+
);
80+
81+
registerHandler(
82+
select: (EditRoomManager m) => m.joinRoomCommand,
83+
handler: (context, room, cancel) {
84+
if (room != null) {
85+
di<ChatManager>().setSelectedRoom(room);
86+
if (room.isSpace) {
87+
di<ChatManager>().setActiveSpace(room);
88+
}
89+
}
90+
},
91+
);
92+
93+
final knockIngOrJoining = watchValue(
94+
(EditRoomManager m) => m.knockOrJoinCommand.isRunning,
95+
);
96+
97+
final joining = watchValue(
98+
(EditRoomManager m) => m.joinRoomCommand.isRunning,
99+
);
100+
101+
if (knockIngOrJoining || joining) {
102+
return Scaffold(
103+
body: Center(
104+
child: Column(
105+
mainAxisSize: MainAxisSize.min,
106+
children: [
107+
const Progress(),
108+
const SizedBox(height: kMediumPadding),
109+
Text(context.l10n.loadingPleaseWait),
110+
],
111+
),
112+
),
113+
);
114+
}
115+
68116
final l10n = context.l10n;
69117
final colorScheme = context.colorScheme;
70118

lib/chat_room/create_or_edit/edit_room_manager.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,22 @@ import 'edit_room_service.dart';
55

66
class EditRoomManager {
77
EditRoomManager({required EditRoomService editRoomService})
8-
: _editRoomService = editRoomService;
8+
: _editRoomService = editRoomService {
9+
joinRoomCommand = Command.createAsync(
10+
editRoomService.joinRoom,
11+
initialValue: null,
12+
);
13+
knockOrJoinCommand = Command.createAsync(
14+
editRoomService.knockOrJoinRoomChunk,
15+
initialValue: null,
16+
);
17+
}
918

1019
final EditRoomService _editRoomService;
1120

21+
late final Command<Room, Room?> joinRoomCommand;
22+
late final Command<PublishedRoomsChunk, Room?> knockOrJoinCommand;
23+
1224
final Map<String, Command<void, void>> _leaveRoomCommands = {};
1325
Command<void, void> getLeaveRoomCommand(Room room) =>
1426
_leaveRoomCommands.putIfAbsent(

lib/chat_room/timeline/chat_room_timeline_list.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,12 @@ class _ChatRoomTimelineListState extends State<ChatRoomTimelineList> {
115115
showDisplayNameChanges: showDisplayNameChanges,
116116
)) ...[
117117
if (previous != null &&
118-
!previous.hideInTimeline(
119-
showAvatarChanges: showAvatarChanges,
120-
showDisplayNameChanges: showDisplayNameChanges,
121-
) &&
122118
event.originServerTs.toLocal().day !=
123119
previous.originServerTs.toLocal().day)
124120
Padding(
125-
padding: const EdgeInsets.all(8.0),
121+
padding: const EdgeInsets.symmetric(
122+
vertical: kSmallPadding,
123+
),
126124
child: Text(
127125
previous.originServerTs
128126
.toLocal()

lib/common/view/search_auto_complete.dart

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter/scheduler.dart';
3-
import 'package:future_loading_dialog/future_loading_dialog.dart';
4-
import 'package:matrix/matrix.dart';
53
import 'package:flutter_it/flutter_it.dart';
4+
import 'package:matrix/matrix.dart';
65

7-
import '../../chat_room/create_or_edit/edit_room_service.dart';
6+
import '../../chat_room/create_or_edit/edit_room_manager.dart';
87
import '../../l10n/l10n.dart';
9-
import '../chat_manager.dart';
108
import '../search_manager.dart';
119
import 'build_context_x.dart';
1210
import 'chat_avatar.dart';
@@ -40,18 +38,10 @@ class ChatRoomsAndSpacesAutoComplete extends StatelessWidget with WatchItMixin {
4038
focusNode: focusNode,
4139
autofocus: true,
4240
),
43-
onSelected: (option) =>
44-
showFutureLoadingDialog(
45-
context: context,
46-
future: () => di<EditRoomService>().knockOrJoinRoomChunk(option),
47-
).then((result) {
48-
if (result.asValue?.value != null) {
49-
if (context.mounted) {
50-
Navigator.of(context).pop();
51-
}
52-
di<ChatManager>().setSelectedRoom(result.asValue!.value!);
53-
}
54-
}),
41+
onSelected: (option) {
42+
Navigator.of(context).pop();
43+
di<EditRoomManager>().knockOrJoinCommand.run(option);
44+
},
5545
displayStringForOption: (chunk) => chunk.name ?? chunk.roomId,
5646

5747
optionsBuilder: (textEditingValue) =>
@@ -98,18 +88,10 @@ class ChatRoomsAndSpacesAutoComplete extends StatelessWidget with WatchItMixin {
9888
chunk.canonicalAlias ?? chunk.roomId,
9989
maxLines: 1,
10090
),
101-
onTap: () =>
102-
showFutureLoadingDialog(
103-
context: context,
104-
future: () => di<EditRoomService>()
105-
.knockOrJoinRoomChunk(chunk),
106-
).then((result) {
107-
if (result.asValue?.value != null) {
108-
di<ChatManager>().setSelectedRoom(
109-
result.asValue!.value!,
110-
);
111-
}
112-
}),
91+
onTap: () {
92+
Navigator.of(context).pop();
93+
di<EditRoomManager>().knockOrJoinCommand.run(chunk);
94+
},
11395
),
11496
);
11597
},

lib/events/view/chat_html_message.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:matrix/matrix.dart';
1010
import 'package:yaru/yaru.dart';
1111

1212
import '../../common/view/build_context_x.dart';
13+
import '../../extensions/event_x.dart';
1314
import 'chat_html_message_link_handler.dart';
1415
import 'chat_image.dart';
1516

@@ -29,7 +30,8 @@ class HtmlMessage extends StatelessWidget {
2930
Widget build(BuildContext context) {
3031
final theme = context.theme;
3132
final fontSize = style?.fontSize ?? 12;
32-
final defaultTextColor = context.colorScheme.onSurface;
33+
final colorScheme = context.colorScheme;
34+
final defaultTextColor = colorScheme.onSurface;
3335
final element = _linkifyHtml(
3436
HtmlParser.parseHTML(displayEvent.formattedText),
3537
);
@@ -44,7 +46,14 @@ class HtmlMessage extends StatelessWidget {
4446
'*': theStyle,
4547
'code': theStyle,
4648
'pre': theStyle,
47-
'a': theStyle.copyWith(color: context.colorScheme.link),
49+
'a': theStyle.copyWith(
50+
color: displayEvent.isUserEvent
51+
? colorScheme.primary.scale(
52+
lightness: theme.colorScheme.isLight ? -0.5 : 0.4,
53+
saturation: 1,
54+
)
55+
: colorScheme.link,
56+
),
4857
},
4958
extensions: [
5059
CodeExtension(fontSize: fontSize, isLight: theme.colorScheme.isLight),

0 commit comments

Comments
 (0)