103 lines
2.9 KiB
Dart
103 lines
2.9 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/my/domain/entities/my_entities.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/my/domain/usecases/clear_cache_usecase.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/my/domain/usecases/get_menu_items_usecase.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/my/domain/usecases/toggle_night_mode_usecase.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/my/presentation/states/my_state.dart';
|
|
|
|
/// 我的页面 Cubit
|
|
class MyCubit extends Cubit<MyState> {
|
|
MyCubit({
|
|
required GetMenuItemsUseCase getMenuItemsUseCase,
|
|
required ToggleNightModeUseCase toggleNightModeUseCase,
|
|
required ClearCacheUseCase clearCacheUseCase,
|
|
}) : _getMenuItemsUseCase = getMenuItemsUseCase,
|
|
_toggleNightModeUseCase = toggleNightModeUseCase,
|
|
_clearCacheUseCase = clearCacheUseCase,
|
|
super(MyInitial());
|
|
|
|
final GetMenuItemsUseCase _getMenuItemsUseCase;
|
|
final ToggleNightModeUseCase _toggleNightModeUseCase;
|
|
final ClearCacheUseCase _clearCacheUseCase;
|
|
|
|
/// 加载数据
|
|
Future<void> loadData() async {
|
|
emit(MyLoading());
|
|
|
|
try {
|
|
final menuResult = await _getMenuItemsUseCase();
|
|
|
|
final menuItems = menuResult.fold(
|
|
(failure) => <MenuItemEntity>[],
|
|
(items) => items,
|
|
);
|
|
|
|
if (menuItems.isEmpty) {
|
|
emit(const MyError('加载菜单失败'));
|
|
return;
|
|
}
|
|
|
|
// 模拟用户信息(实际应从 Auth 模块获取)
|
|
final userProfile = UserProfileEntity(
|
|
name: '张工程师',
|
|
role: '运维工程师',
|
|
avatar: '',
|
|
userId: 'ENG2024001',
|
|
);
|
|
|
|
emit(MyLoaded(
|
|
userProfile: userProfile,
|
|
menuItems: menuItems,
|
|
));
|
|
} catch (e) {
|
|
emit(MyError('加载数据失败: $e'));
|
|
}
|
|
}
|
|
|
|
/// 切换夜间模式
|
|
Future<void> toggleNightMode(bool enabled) async {
|
|
final currentState = state;
|
|
if (currentState is MyLoaded) {
|
|
// 乐观更新 UI
|
|
emit(currentState.copyWith(isNightMode: enabled));
|
|
|
|
final result = await _toggleNightModeUseCase(enabled);
|
|
|
|
result.fold(
|
|
(failure) {
|
|
// 如果失败,回滚状态
|
|
emit(currentState.copyWith(isNightMode: !enabled));
|
|
emit(MyError('切换夜间模式失败'));
|
|
},
|
|
(_) {
|
|
// 成功,保持当前状态
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
/// 清除缓存
|
|
Future<void> clearCache() async {
|
|
final currentState = state;
|
|
if (currentState is! MyLoaded) return;
|
|
|
|
emit(MyLoading());
|
|
|
|
final result = await _clearCacheUseCase();
|
|
|
|
result.fold(
|
|
(failure) {
|
|
emit(MyError('清除缓存失败: ${failure.message}'));
|
|
},
|
|
(success) {
|
|
emit(currentState.copyWith(cacheSize: '0 MB'));
|
|
},
|
|
);
|
|
}
|
|
|
|
/// 刷新数据
|
|
Future<void> refresh() async {
|
|
await loadData();
|
|
}
|
|
}
|