You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
4.0 KiB

import 'package:get/get.dart';
import 'package:intl/intl.dart';
import '../controllers/translation_controller.dart';
class TranslationHistoryController extends GetxController {
// 引用主翻译控制器,以访问历史记录数据
final TranslationController translationController = Get.find<TranslationController>();
// 按日期分组的历史记录
final Rx<Map<String, List<TranslationItem>>> groupedHistory = Rx<Map<String, List<TranslationItem>>>({});
// 排序后的日期列表
final RxList<String> sortedDates = <String>[].obs;
// 会话映射表,用于存储每个会话的所有项目
final Rx<Map<String, List<TranslationItem>>> sessionMap = Rx<Map<String, List<TranslationItem>>>({});
@override
void onInit() {
super.onInit();
// 监听翻译历史记录的变化
ever(translationController.translationHistory, (_) {
_groupHistoryByDate();
_groupHistoryBySession();
});
// 初始分组
_groupHistoryByDate();
_groupHistoryBySession();
}
// 按日期对历史记录进行分组
void _groupHistoryByDate() {
final Map<String, List<TranslationItem>> newGroupedHistory = {};
// 筛选出每个会话的第一条记录
final List<TranslationItem> firstItemsOfSessions = translationController.translationHistory
.where((item) => item.isFirstInSession)
.toList();
for (var item in firstItemsOfSessions) {
final DateTime date = item.timestamp;
String key;
final now = DateTime.now();
final today = DateTime(now.year, now.month, now.day);
final yesterday = today.subtract(const Duration(days: 1));
final twoDaysAgo = today.subtract(const Duration(days: 2));
final itemDate = DateTime(date.year, date.month, date.day);
if (itemDate == today) {
key = 'TODAY';
} else if (itemDate == yesterday) {
key = '1 DAY AGO';
} else if (itemDate == twoDaysAgo) {
key = '2 DAYS AGO';
} else {
key = DateFormat('yyyy-MM-dd').format(date);
}
if (!newGroupedHistory.containsKey(key)) {
newGroupedHistory[key] = [];
}
newGroupedHistory[key]!.add(item);
}
// 对每个日期组内的项目按时间倒序排序
newGroupedHistory.forEach((key, items) {
items.sort((a, b) => b.timestamp.compareTo(a.timestamp));
});
// 更新分组后的历史记录
groupedHistory.value = newGroupedHistory;
// 按日期排序
final List<String> dates = newGroupedHistory.keys.toList()
..sort((a, b) {
if (a == 'TODAY') return -1;
if (b == 'TODAY') return 1;
if (a == '1 DAY AGO') return -1;
if (b == '1 DAY AGO') return 1;
if (a == '2 DAYS AGO') return -1;
if (b == '2 DAYS AGO') return 1;
return b.compareTo(a); // 降序排列其他日期
});
sortedDates.value = dates;
}
// 按会话ID对历史记录进行分组
void _groupHistoryBySession() {
final Map<String, List<TranslationItem>> newSessionMap = {};
for (var item in translationController.translationHistory) {
if (!newSessionMap.containsKey(item.sessionId)) {
newSessionMap[item.sessionId] = [];
}
newSessionMap[item.sessionId]!.add(item);
}
// 对每个会话内的项目按时间升序排序
newSessionMap.forEach((key, items) {
items.sort((a, b) => a.timestamp.compareTo(b.timestamp));
});
// 更新会话映射表
sessionMap.value = newSessionMap;
}
// 获取指定会话的所有翻译项
List<TranslationItem> getSessionItems(String sessionId) {
return sessionMap.value[sessionId] ?? [];
}
// 播放翻译项
void playTranslationItem(TranslationItem item) {
translationController.playTranslationItem(item);
}
// 播放指定文本
void playText(String text) {
translationController.playTranslatedText(text);
}
// 检查是否有历史记录
bool get hasHistory => translationController.translationHistory.isNotEmpty;
}