Skip to content

Commit 1dd4ef7

Browse files
committed
fix(chat): fix failed to redirect to user space page
Use uid as parameter, if present. Fixes #174
1 parent 8a9c371 commit 1dd4ef7

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

lib/features/chat/models/chat_message.dart

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ final class ChatMessage with ChatMessageMappable {
1212
/// Constructor.
1313
const ChatMessage({
1414
required this.author,
15+
required this.authorUid,
1516
required this.authorAvatarUrl,
1617
required this.message,
1718
required this.dateTime,
@@ -22,6 +23,11 @@ final class ChatMessage with ChatMessageMappable {
2223
/// Optional because it's null when current sent the message.
2324
final String? author;
2425

26+
/// Uid of message author.
27+
///
28+
/// Required as it is used to visit user space page.
29+
final String? authorUid;
30+
2531
/// Avatar url of author.
2632
final String? authorAvatarUrl;
2733

@@ -38,15 +44,16 @@ final class ChatMessage with ChatMessageMappable {
3844
/// Build from node `<dl>` with id starts with "pmlist_".
3945
static ChatMessage? fromDl(uh.Element element) {
4046
// Not null when another user sent the message.
41-
final username =
42-
element.querySelector('dd.ptm > a')?.innerText ?? element.querySelector('dd.ptm > span.xi2')?.innerText;
47+
final username = element.querySelector('dd.ptm > a')?.innerText.trim();
4348
// Not null when current logged user sent the message.
44-
final currentUserNode = element.querySelector('dd.ptm > span.xi2');
45-
if (username == null && currentUserNode == null) {
49+
final currentUsername = element.querySelector('dd.ptm > span.xi2')?.innerText.trim();
50+
if (username == null && currentUsername == null) {
4651
talker.error('failed to build chat message: author not found');
4752
return null;
4853
}
4954

55+
final uid = element.querySelector('dd.m.avt > a')?.attributes['href']?.tryParseAsUri()?.queryParameters['uid'];
56+
5057
final message = element.querySelector('dd:nth-child(4)')?.innerHtml;
5158
if (message == null) {
5259
talker.error('failed to build chat message: message not found');
@@ -57,10 +64,20 @@ final class ChatMessage with ChatMessageMappable {
5764

5865
final authorAvatarUrl = element.querySelector('dd.m.avt > a > img')?.imageUrl();
5966

60-
return ChatMessage(author: username, authorAvatarUrl: authorAvatarUrl, message: message, dateTime: dateTime);
67+
return ChatMessage(
68+
author: username ?? currentUsername,
69+
authorUid: uid,
70+
authorAvatarUrl: authorAvatarUrl,
71+
message: message,
72+
dateTime: dateTime,
73+
);
6174
}
6275

6376
/// Build from node `<li class="cl pmm">`.
77+
///
78+
/// Chat page, not chat history page.
79+
///
80+
/// With username, without avatar and uid.
6481
static ChatMessage? fromLi(uh.Element element) {
6582
final username = element.querySelector('div.pmt')?.innerText.split(':').first;
6683
final message = element.querySelector('div.pmd')?.innerHtml;
@@ -72,6 +89,6 @@ final class ChatMessage with ChatMessageMappable {
7289
return null;
7390
}
7491

75-
return ChatMessage(author: username, authorAvatarUrl: null, message: message, dateTime: null);
92+
return ChatMessage(author: username, authorUid: null, authorAvatarUrl: null, message: message, dateTime: null);
7693
}
7794
}
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import 'package:dart_mappable/dart_mappable.dart';
2+
import 'package:tsdm_client/extensions/string.dart';
23
import 'package:tsdm_client/extensions/universal_html.dart';
34
import 'package:tsdm_client/instance.dart';
45
import 'package:universal_html/html.dart' as uh;
56

67
part 'chat_history_send_target.dart';
7-
88
part 'chat_message.dart';
9-
109
part 'chat_send_target.dart';
11-
1210
part 'models.mapper.dart';

lib/features/chat/widgets/chat_message_card.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ final class ChatMessageCard extends StatelessWidget {
2828
ListTile(
2929
leading: GestureDetector(
3030
onTap: chatMessage.author != null
31-
? () async =>
32-
context.pushNamed(ScreenPaths.profile, queryParameters: {'username': chatMessage.author})
31+
? () async => context.pushNamed(
32+
ScreenPaths.profile,
33+
queryParameters: {'uid': ?chatMessage.authorUid, 'username': ?chatMessage.author},
34+
)
3335
: null,
3436
child: HeroUserAvatar(
3537
username: chatMessage.author ?? '',

0 commit comments

Comments
 (0)