import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../providers/auth_provider.dart'; import '../providers/chat_provider.dart'; /// 对话历史列表项 class ConversationListItem { final String id; final String? title; final String? summary; final int messageCount; final DateTime updatedAt; const ConversationListItem({ required this.id, this.title, this.summary, required this.messageCount, required this.updatedAt, }); factory ConversationListItem.fromJson(Map json) => ConversationListItem( id: json['id']?.toString() ?? '', title: json['title']?.toString(), summary: json['summary']?.toString(), messageCount: (json['messageCount'] as num?)?.toInt() ?? 0, updatedAt: DateTime.tryParse(json['updatedAt']?.toString() ?? '')?.toLocal() ?? DateTime.now(), ); } /// 对话历史 Notifier:缓存列表,提供刷新/删除/清空。 class ConversationHistoryNotifier extends AsyncNotifier> { @override Future> build() { final session = ref.watch(userSessionIdentityProvider); if (session == null) return Future.value(const []); return _fetch(); } Future> _fetch() async { final api = ref.read(apiClientProvider); final res = await api.get('/api/ai/conversations'); final raw = (res.data['data'] as List?) ?? const []; return raw .whereType() .map((m) => ConversationListItem.fromJson(Map.from(m))) .toList(); } Future refresh() async { state = const AsyncValue.loading(); state = await AsyncValue.guard(_fetch); } /// 删除单条;后端确认成功后再更新 UI。 Future deleteOne(String id) async { final previous = state.asData?.value ?? const []; final api = ref.read(apiClientProvider); await api.delete('/api/ai/conversations/$id'); state = AsyncValue.data(previous.where((e) => e.id != id).toList()); // 同步清掉当前 chat state(如果删的就是当前会话) final chat = ref.read(chatProvider); if (chat.conversationId == id) { await ref.read(chatProvider.notifier).resetSession(); } } /// 一键清空当前用户的全部对话。 Future clearAll() async { final api = ref.read(apiClientProvider); final res = await api.delete('/api/ai/conversations'); state = const AsyncValue.data([]); await ref.read(chatProvider.notifier).resetSession(); final deleted = res.data['data']?['deleted']; return deleted is num ? deleted.toInt() : 0; } } final conversationHistoryProvider = AsyncNotifierProvider< ConversationHistoryNotifier, List >(ConversationHistoryNotifier.new);