169 lines
5.4 KiB
Dart
169 lines
5.4 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:maibu_satabot_v2/core/app/app_user_cubit.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/site/presentation/cubit/site_cubit.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/home/domain/entities/site_entity.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/home/domain/usecases/get_home_data_usecase.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/home/domain/usecases/get_site_list_usecase.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/home/presentation/bloc/home_v2_event.dart';
|
|
import 'package:maibu_satabot_v2/features/v2/home/presentation/bloc/home_v2_state.dart';
|
|
import '../../../../../core/network/error_handler.dart';
|
|
|
|
class HomeV2Bloc extends Bloc<HomeV2Event, HomeV2State> {
|
|
final GetHomeDataUseCase getHomeDataUseCase;
|
|
final GetSiteListUseCase getSiteListUseCase;
|
|
final AppUserCubit appUserCubit;
|
|
final SiteCubit siteCubit;
|
|
|
|
HomeV2Bloc(
|
|
this.getHomeDataUseCase,
|
|
this.getSiteListUseCase,
|
|
this.appUserCubit,
|
|
this.siteCubit,
|
|
) : super(const HomeV2Initial()) {
|
|
on<HomeV2LoadData>(_onLoadData);
|
|
on<HomeV2Refresh>(_onRefresh);
|
|
on<HomeV2ToggleTrendType>(_onToggleTrendType);
|
|
}
|
|
|
|
Future<void> _onLoadData(
|
|
HomeV2LoadData event,
|
|
Emitter<HomeV2State> emit,
|
|
) async {
|
|
emit(const HomeV2Loading());
|
|
|
|
final user = appUserCubit.state.user;
|
|
if (user == null) {
|
|
emit(const HomeV2Error(message: '用户未登录', shouldShowError: true));
|
|
return;
|
|
}
|
|
|
|
// 并行加载首页数据和场站列表
|
|
final homeResult = await getHomeDataUseCase(const NoParams());
|
|
final siteResult = await getSiteListUseCase(user.userId); // 使用用户的 userId
|
|
|
|
homeResult.fold(
|
|
(failure) => emit(
|
|
HomeV2Error(
|
|
message: ErrorHandler.getErrorMessage(failure.message),
|
|
shouldShowError: true, // 🔥 标记需要显示弹窗
|
|
),
|
|
),
|
|
(homeData) {
|
|
List<SiteEntity> sites = [];
|
|
SiteEntity? selectedSite;
|
|
|
|
siteResult.fold(
|
|
(failure) {
|
|
print('加载场站列表失败: ${failure.message}');
|
|
},
|
|
(siteList) {
|
|
sites = siteList;
|
|
// 从全局 SiteCubit 获取之前选中的场站
|
|
final savedSelectedSite = siteCubit.state.selectedSite;
|
|
|
|
// 尝试找到之前选中的场站
|
|
if (savedSelectedSite != null && siteList.isNotEmpty) {
|
|
selectedSite = siteList.firstWhere(
|
|
(site) => site.id == savedSelectedSite.id,
|
|
orElse: () => siteList.first,
|
|
);
|
|
} else {
|
|
// 没有选中过,默认选中第一个
|
|
selectedSite = siteList.isNotEmpty ? siteList.first : null;
|
|
}
|
|
|
|
// 更新全局 SiteCubit 的选中状态
|
|
if (selectedSite != null) {
|
|
siteCubit.selectSite(selectedSite!);
|
|
}
|
|
},
|
|
);
|
|
|
|
emit(
|
|
HomeV2Loaded(
|
|
homeData: homeData,
|
|
sites: sites,
|
|
selectedSite: selectedSite,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
Future<void> _onRefresh(
|
|
HomeV2Refresh event,
|
|
Emitter<HomeV2State> emit,
|
|
) async {
|
|
if (state is HomeV2Loaded) {
|
|
final currentState = state as HomeV2Loaded;
|
|
|
|
final user = appUserCubit.state.user;
|
|
if (user == null) {
|
|
emit(const HomeV2Error(message: '用户未登录', shouldShowError: true));
|
|
return;
|
|
}
|
|
|
|
// 并行刷新首页数据和电站列表
|
|
final homeResult = await getHomeDataUseCase(const NoParams());
|
|
final siteResult = await getSiteListUseCase(user.userId);
|
|
|
|
homeResult.fold(
|
|
(failure) => emit(
|
|
HomeV2Error(
|
|
message: ErrorHandler.getErrorMessage(failure.message),
|
|
shouldShowError: true, // 🔥 标记需要显示弹窗
|
|
),
|
|
),
|
|
(homeData) {
|
|
List<SiteEntity> sites = currentState.sites;
|
|
SiteEntity? selectedSite = currentState.selectedSite;
|
|
|
|
siteResult.fold(
|
|
(failure) {
|
|
print('刷新场站列表失败: ${failure.message}');
|
|
},
|
|
(siteList) {
|
|
sites = siteList;
|
|
// 保持当前选中的场站
|
|
final savedSelectedSite = siteCubit.state.selectedSite;
|
|
if (savedSelectedSite != null && siteList.isNotEmpty) {
|
|
selectedSite = siteList.firstWhere(
|
|
(site) => site.id == savedSelectedSite.id,
|
|
orElse: () => siteList.first,
|
|
);
|
|
} else if (siteList.isNotEmpty) {
|
|
selectedSite = siteList.first;
|
|
}
|
|
|
|
// 更新全局 SiteCubit 的选中状态
|
|
if (selectedSite != null) {
|
|
siteCubit.selectSite(selectedSite!);
|
|
}
|
|
},
|
|
);
|
|
|
|
emit(
|
|
HomeV2Loaded(
|
|
homeData: homeData,
|
|
trendType: currentState.trendType,
|
|
sites: sites,
|
|
selectedSite: selectedSite,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
void _onToggleTrendType(
|
|
HomeV2ToggleTrendType event,
|
|
Emitter<HomeV2State> emit,
|
|
) {
|
|
if (state is HomeV2Loaded) {
|
|
final currentState = state as HomeV2Loaded;
|
|
emit(currentState.copyWith(trendType: event.type));
|
|
print('切换趋势类型:${event.type}');
|
|
}
|
|
}
|
|
}
|