Skip to content

Commit 44be3d2

Browse files
authored
Merge pull request #59 from mylxsw/feature/1.0.8
- 非 Web 端聊天支持显示 Latex 公式,代码高亮 - 聊天界面部分细节、错误信息展示优化 - 解决 Web 端聊天分享页面乱的问题
2 parents 4286077 + 024eacd commit 44be3d2

18 files changed

Lines changed: 505 additions & 89 deletions

lib/bloc/chat_event.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ class ChatMessageReceivedEvent extends ChatMessageEvent {
1111

1212
class ChatMessageSendEvent extends ChatMessageEvent {
1313
final Message message;
14+
final int? index;
15+
final bool isResent;
1416

15-
ChatMessageSendEvent(this.message);
17+
ChatMessageSendEvent(this.message, {this.index, this.isResent = false});
1618
}
1719

1820
class ChatMessageGetRecentEvent extends ChatMessageEvent {

lib/bloc/chat_message_bloc.dart

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,22 @@ class ChatMessageBloc extends BlocExt<ChatMessageEvent, ChatMessageState> {
265265
await chatMsgRepo.fixMessageStatus(roomId);
266266

267267
// 记录当前消息
268-
final sentMessageId = await chatMsgRepo.sendMessage(roomId, message);
268+
var sentMessageId = 0;
269+
if (event.isResent &&
270+
event.index == 0 &&
271+
last != null &&
272+
last.type == MessageType.text) {
273+
// 如果当前是消息重发,同时重发的是最后一条消息,则不会重新生成该消息,直接生成答案即可
274+
sentMessageId = last.id!;
275+
if (last.statusIsFailed()) {
276+
// 如果最后一条消息发送失败,则重新发送
277+
await chatMsgRepo.updateMessagePart(roomId, last.id!, [
278+
MessagePart('status', 0),
279+
]);
280+
}
281+
} else {
282+
sentMessageId = await chatMsgRepo.sendMessage(roomId, message);
283+
}
269284

270285
// 更新 Room 最后活跃时间
271286
// 这里没有使用 await,因为不需要等待更新完成,让 room 的更新异步的去处理吧
@@ -312,6 +327,15 @@ class ChatMessageBloc extends BlocExt<ChatMessageEvent, ChatMessageState> {
312327
if (systemCmds.isNotEmpty) {
313328
for (var element in systemCmds) {
314329
try {
330+
// SYSTEM 命令
331+
// - type: 命令类型
332+
//
333+
// type=summary (默认值)
334+
// - question_id: 问题 ID
335+
// - answer_id: 答案 ID
336+
// - quota_consumed: 消耗的配额
337+
// - token: 消耗的 token
338+
// - info: 提示信息
315339
final cmd = jsonDecode(element.content);
316340

317341
message.serverId = cmd['question_id'];
@@ -320,6 +344,11 @@ class ChatMessageBloc extends BlocExt<ChatMessageEvent, ChatMessageState> {
320344
final quotaConsumed = cmd['quota_consumed'] ?? 0;
321345
final tokenConsumed = cmd['token'] ?? 0;
322346

347+
final info = cmd['info'] ?? '';
348+
if (info != '') {
349+
waitMessage.setExtra({'info': info});
350+
}
351+
323352
if (quotaConsumed == 0 && tokenConsumed == 0) {
324353
continue;
325354
}

lib/bloc/group_chat_event.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ class GroupChatSendEvent extends GroupChatEvent {
2626
final int groupId;
2727
final String message;
2828
final List<int> members;
29+
final int? index;
30+
final bool isResent;
2931

30-
GroupChatSendEvent(this.groupId, this.message, this.members);
32+
GroupChatSendEvent(this.groupId, this.message, this.members,
33+
{this.index, this.isResent = false});
3134
}
3235

3336
class GroupChatUpdateMessageStatusEvent extends GroupChatEvent {

lib/helper/constant.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart';
22

33
// 客户端应用版本号
4-
const clientVersion = '1.0.7';
4+
const clientVersion = '1.0.8';
55
// 本地数据库版本号
66
const databaseVersion = 25;
77

lib/helper/error.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import 'package:dart_openai/openai.dart';
55
Object resolveErrorMessage(dynamic e, {bool isChat = false}) {
66
// TODO
77
if (e is RequestFailedException) {
8-
final msg = resolveHTTPStatusCode(e.statusCode, isChat: isChat);
8+
final msg =
9+
resolveHTTPStatusCode(e.statusCode, isChat: isChat, message: e.message);
910
if (msg != null) {
1011
return msg;
1112
}
@@ -16,7 +17,8 @@ Object resolveErrorMessage(dynamic e, {bool isChat = false}) {
1617
return e.toString();
1718
}
1819

19-
Object? resolveHTTPStatusCode(int statusCode, {bool isChat = false}) {
20+
Object? resolveHTTPStatusCode(int statusCode,
21+
{bool isChat = false, String? message}) {
2022
switch (statusCode) {
2123
case 400:
2224
return const LanguageText('请求参数错误');
@@ -46,6 +48,10 @@ Object? resolveHTTPStatusCode(int statusCode, {bool isChat = false}) {
4648
case 402:
4749
return const LanguageText(AppLocale.quotaExceeded, action: 'payment');
4850
case 500:
51+
if (message != null && message.isNotEmpty) {
52+
return message;
53+
}
54+
4955
return const LanguageText(AppLocale.internalServerError);
5056
case 502:
5157
return const LanguageText(AppLocale.badGateway);

lib/page/chat/component/group_avatar.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:askaide/helper/image.dart';
22
import 'package:cached_network_image/cached_network_image.dart';
33
import 'package:flutter/material.dart';
44

5+
// ignore: must_be_immutable
56
class GroupAvatar extends StatelessWidget {
67
final double size;
78
final double padding;

lib/page/chat/group/chat.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -411,16 +411,15 @@ class _GroupChatPageState extends State<GroupChatPage> {
411411
onDeleteMessage: (id) {
412412
handleDeleteMessage(context, id);
413413
},
414+
onResetContext: () => handleResetContext(context),
414415
onSpeakEvent: (message) {
415416
_audioPlayerController.playAudio(message.text);
416417
},
417-
onResentEvent: (message) {
418+
onResentEvent: (message, index) {
418419
_scrollController.animateTo(0,
419420
duration: const Duration(milliseconds: 500),
420421
curve: Curves.easeOut);
421-
_handleSubmit(
422-
message.text,
423-
);
422+
_handleSubmit(message.text, index: index, isResent: true);
424423
},
425424
helpWidgets: state.hasWaitTasks || loadedMessages.isEmpty
426425
? null
@@ -505,15 +504,23 @@ class _GroupChatPageState extends State<GroupChatPage> {
505504
}
506505

507506
/// 提交新消息
508-
void _handleSubmit(String text) {
507+
void _handleSubmit(
508+
String text, {
509+
int? index,
510+
bool isResent = false,
511+
}) {
509512
setState(() {
510513
_inputEnabled.value = false;
511514
});
512515

513516
var replyMemberIds = (selectedMembers ?? []).map((e) => e.id!).toList();
514-
context
515-
.read<GroupChatBloc>()
516-
.add(GroupChatSendEvent(widget.groupId, text, replyMemberIds));
517+
context.read<GroupChatBloc>().add(GroupChatSendEvent(
518+
widget.groupId,
519+
text,
520+
replyMemberIds,
521+
index: index,
522+
isResent: isResent,
523+
));
517524
}
518525

519526
/// 处理消息删除事件

lib/page/chat/home_chat.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,11 +411,13 @@ class _HomeChatPageState extends State<HomeChatPage> {
411411
onDeleteMessage: (id) {
412412
handleDeleteMessage(context, id, chatHistoryId: chatId);
413413
},
414-
onResentEvent: (message) {
414+
onResetContext: () => handleResetContext(context),
415+
onResentEvent: (message, index) {
415416
_scrollController.animateTo(0,
416417
duration: const Duration(milliseconds: 500), curve: Curves.easeOut);
417418

418-
_handleSubmit(message.text, messagetType: message.type);
419+
_handleSubmit(message.text,
420+
messagetType: message.type, index: index, isResent: true);
419421
},
420422
onSpeakEvent: (message) {
421423
_audioPlayerController.playAudio(message.text);
@@ -427,7 +429,12 @@ class _HomeChatPageState extends State<HomeChatPage> {
427429
}
428430

429431
/// 提交新消息
430-
void _handleSubmit(String text, {messagetType = MessageType.text}) {
432+
void _handleSubmit(
433+
String text, {
434+
messagetType = MessageType.text,
435+
int? index,
436+
bool isResent = false,
437+
}) {
431438
setState(() {
432439
_inputEnabled.value = false;
433440
});
@@ -443,6 +450,8 @@ class _HomeChatPageState extends State<HomeChatPage> {
443450
type: messagetType,
444451
chatHistoryId: chatId,
445452
),
453+
index: index,
454+
isResent: isResent,
446455
),
447456
);
448457

lib/page/chat/room_chat.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,14 +269,16 @@ class _RoomChatPageState extends State<RoomChatPage> {
269269
onDeleteMessage: (id) {
270270
handleDeleteMessage(context, id);
271271
},
272+
onResetContext: () => handleResetContext(context),
272273
onSpeakEvent: (message) {
273274
_audioPlayerController.playAudio(message.text);
274275
},
275-
onResentEvent: (message) {
276+
onResentEvent: (message, index) {
276277
_scrollController.animateTo(0,
277278
duration: const Duration(milliseconds: 500),
278279
curve: Curves.easeOut);
279-
_handleSubmit(message.text, messagetType: message.type);
280+
_handleSubmit(message.text,
281+
messagetType: message.type, index: index, isResent: true);
280282
},
281283
helpWidgets: state.processing || loadedMessages.last.isInitMessage()
282284
? null
@@ -390,7 +392,12 @@ class _RoomChatPageState extends State<RoomChatPage> {
390392
}
391393

392394
/// 提交新消息
393-
void _handleSubmit(String text, {messagetType = MessageType.text}) {
395+
void _handleSubmit(
396+
String text, {
397+
messagetType = MessageType.text,
398+
int? index,
399+
bool isResent = false,
400+
}) {
394401
setState(() {
395402
_inputEnabled.value = false;
396403
});
@@ -404,6 +411,8 @@ class _RoomChatPageState extends State<RoomChatPage> {
404411
ts: DateTime.now(),
405412
type: messagetType,
406413
),
414+
index: index,
415+
isResent: isResent,
407416
),
408417
);
409418

0 commit comments

Comments
 (0)