218 lines
5.2 KiB
Dart
218 lines
5.2 KiB
Dart
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<FolderModel> 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<FolderModel>? 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<String, dynamic> 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<String, dynamic> toMap() {
|
|
return {
|
|
'id': id,
|
|
'name': name,
|
|
'icon': icon,
|
|
'imageCount': imageCount,
|
|
'createdAt': createdAt.toIso8601String(),
|
|
'lastUsedAt': lastUsedAt.toIso8601String(),
|
|
};
|
|
}
|
|
}
|
|
|
|
/// 文件夹Provider - 提供文件夹管理功能
|
|
class FolderProvider extends StateNotifier<FolderState> {
|
|
final FolderRepository _folderRepository;
|
|
|
|
FolderProvider(this._folderRepository) : super(FolderState.initial());
|
|
|
|
/// 加载文件夹列表
|
|
Future<void> 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<String?> 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<bool> 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<bool> deleteFolder(String id) async {
|
|
try {
|
|
await _folderRepository.deleteFolder(id);
|
|
|
|
// 重新加载文件夹列表
|
|
await loadFolders();
|
|
|
|
return true;
|
|
} catch (e) {
|
|
state = state.copyWithLoading(error: e.toString());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// 更新文件夹最后使用时间
|
|
Future<void> updateLastUsedTime(String folderId) async {
|
|
try {
|
|
await _folderRepository.updateFolderLastUsed(folderId);
|
|
|
|
// 重新加载文件夹列表
|
|
await loadFolders();
|
|
} catch (e) {
|
|
// 静默处理错误,不显示给用户
|
|
debugPrint('更新文件夹使用时间失败: $e');
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 文件夹Provider实例
|
|
final folderProvider = StateNotifierProvider<FolderProvider, FolderState>((ref) {
|
|
final folderRepository = ref.watch(folderRepositoryProvider);
|
|
return FolderProvider(folderRepository);
|
|
});
|
|
|
|
/// 文件夹Repository Provider
|
|
final folderRepositoryProvider = Provider<FolderRepository>((ref) {
|
|
final folderDao = ref.watch(folderDaoProvider);
|
|
return FolderRepositoryImpl(folderDao);
|
|
});
|
|
|
|
/// 文件夹DAO Provider
|
|
final folderDaoProvider = Provider<FolderDao>((ref) {
|
|
return FolderDao();
|
|
}); |