snap_wish/lib/presentation/providers/folder_provider.dart
2025-10-09 17:10:38 +08:00

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();
});