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() ?? '') ?? DateTime.now(), ); } /// 对话历史 Notifier:缓存列表,提供刷新/删除/清空。 class ConversationHistoryNotifier extends AsyncNotifier> { @override Future> build() => _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 []; state = AsyncValue.data(previous.where((e) => e.id != id).toList()); try { final api = ref.read(apiClientProvider); await api.delete('/api/ai/conversations/$id'); } catch (_) { state = AsyncValue.data(previous); rethrow; } // 同步清掉当前 chat state(如果删的就是当前会话) final chat = ref.read(chatProvider); if (chat.conversationId == id) { 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([]); 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, );