import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../data/repositories/folder_repository.dart'; import '../../data/repositories/folder_repository_impl.dart'; import '../../data/datasources/local/folder_dao.dart'; /// 文件夹状态类 - 管理文件夹列表的状态 class FolderState { /// 文件夹列表 final List folders; /// 是否正在加载 final bool isLoading; /// 错误信息 final String? error; FolderState({ required this.folders, this.isLoading = false, this.error, }); /// 创建初始状态 factory FolderState.initial() { return FolderState(folders: []); } /// 创建加载状态 FolderState copyWithLoading({ List? folders, bool? isLoading, String? error, }) { return FolderState( folders: folders ?? this.folders, isLoading: isLoading ?? this.isLoading, error: error, ); } } /// 文件夹模型 - 简化的文件夹数据模型 class FolderModel { /// 文件夹ID final String id; /// 文件夹名称 final String name; /// 文件夹图标 final String icon; /// 文件夹中的图片数量 final int imageCount; /// 创建时间 final DateTime createdAt; /// 最后使用时间 final DateTime lastUsedAt; FolderModel({ required this.id, required this.name, required this.icon, this.imageCount = 0, required this.createdAt, required this.lastUsedAt, }); /// 从Map创建FolderModel factory FolderModel.fromMap(Map map) { return FolderModel( id: map['id'] as String, name: map['name'] as String, icon: map['icon'] as String? ?? 'folder', imageCount: map['imageCount'] as int? ?? 0, createdAt: DateTime.parse(map['createdAt'] as String), lastUsedAt: DateTime.parse(map['lastUsedAt'] as String), ); } /// 转换为Map Map toMap() { return { 'id': id, 'name': name, 'icon': icon, 'imageCount': imageCount, 'createdAt': createdAt.toIso8601String(), 'lastUsedAt': lastUsedAt.toIso8601String(), }; } } /// 文件夹Provider - 提供文件夹管理功能 class FolderProvider extends StateNotifier { final FolderRepository _folderRepository; FolderProvider(this._folderRepository) : super(FolderState.initial()); /// 加载文件夹列表 Future loadFolders() async { state = state.copyWithLoading(isLoading: true, error: null); try { final folders = await _folderRepository.getAllFolders(); final folderModels = folders.map((folder) => FolderModel.fromMap({ 'id': folder.id, 'name': folder.name, 'icon': folder.icon, 'imageCount': folder.imageCount, 'createdAt': folder.createdAt.toIso8601String(), 'lastUsedAt': folder.lastUsedAt.toIso8601String(), })).toList(); state = state.copyWithLoading( folders: folderModels, isLoading: false, ); } catch (e) { state = state.copyWithLoading( isLoading: false, error: e.toString(), ); } } /// 创建新文件夹 Future createFolder({ required String name, required String icon, }) async { try { final folderId = await _folderRepository.createFolder( name: name, icon: icon, ); // 重新加载文件夹列表 await loadFolders(); return folderId; } catch (e) { state = state.copyWithLoading(error: e.toString()); return null; } } /// 更新文件夹信息 Future updateFolder({ required String id, required String name, required String icon, }) async { try { await _folderRepository.updateFolder( id: id, name: name, icon: icon, ); // 重新加载文件夹列表 await loadFolders(); return true; } catch (e) { state = state.copyWithLoading(error: e.toString()); return false; } } /// 删除文件夹 Future deleteFolder(String id) async { try { await _folderRepository.deleteFolder(id); // 重新加载文件夹列表 await loadFolders(); return true; } catch (e) { state = state.copyWithLoading(error: e.toString()); return false; } } /// 更新文件夹最后使用时间 Future updateLastUsedTime(String folderId) async { try { await _folderRepository.updateFolderLastUsed(folderId); // 重新加载文件夹列表 await loadFolders(); } catch (e) { // 静默处理错误,不显示给用户 debugPrint('更新文件夹使用时间失败: $e'); } } } /// 文件夹Provider实例 final folderProvider = StateNotifierProvider((ref) { final folderRepository = ref.watch(folderRepositoryProvider); return FolderProvider(folderRepository); }); /// 文件夹Repository Provider final folderRepositoryProvider = Provider((ref) { final folderDao = ref.watch(folderDaoProvider); return FolderRepositoryImpl(folderDao); }); /// 文件夹DAO Provider final folderDaoProvider = Provider((ref) { return FolderDao(); });