staking_team_provider.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import '../core/network/dio_client.dart';
  3. import '../data/models/finance/staking_team_overview.dart';
  4. import '../data/services/staking_service.dart';
  5. class StakingTeamState {
  6. final bool isLoading;
  7. final bool isLoadingMore;
  8. final String? errorMessage;
  9. final StakingTeamOverview? overview;
  10. final List<StakingDirectMember> directList;
  11. final int pageNo;
  12. final bool hasMore;
  13. const StakingTeamState({
  14. this.isLoading = false,
  15. this.isLoadingMore = false,
  16. this.errorMessage,
  17. this.overview,
  18. this.directList = const [],
  19. this.pageNo = 1,
  20. this.hasMore = false,
  21. });
  22. StakingTeamState copyWith({
  23. bool? isLoading,
  24. bool? isLoadingMore,
  25. String? errorMessage,
  26. StakingTeamOverview? overview,
  27. List<StakingDirectMember>? directList,
  28. int? pageNo,
  29. bool? hasMore,
  30. }) {
  31. return StakingTeamState(
  32. isLoading: isLoading ?? this.isLoading,
  33. isLoadingMore: isLoadingMore ?? this.isLoadingMore,
  34. errorMessage: errorMessage,
  35. overview: overview ?? this.overview,
  36. directList: directList ?? this.directList,
  37. pageNo: pageNo ?? this.pageNo,
  38. hasMore: hasMore ?? this.hasMore,
  39. );
  40. }
  41. }
  42. class StakingTeamNotifier extends AutoDisposeNotifier<StakingTeamState> {
  43. static const _pageSize = 20;
  44. StakingService get _service => StakingService(ref.read(dioClientProvider));
  45. @override
  46. StakingTeamState build() => const StakingTeamState();
  47. Future<void> init() async {
  48. state = state.copyWith(isLoading: true, errorMessage: null);
  49. try {
  50. final results = await Future.wait([
  51. _service.getTeamOverview(),
  52. _service.getDirectList(pageNo: 1, pageSize: _pageSize),
  53. ]);
  54. final overview = results[0] as StakingTeamOverview;
  55. final page = results[1] as StakingDirectListPage;
  56. state = state.copyWith(
  57. isLoading: false,
  58. overview: overview,
  59. directList: page.content,
  60. pageNo: page.pageNo,
  61. hasMore: page.hasMore,
  62. );
  63. } catch (e) {
  64. state = state.copyWith(
  65. isLoading: false,
  66. errorMessage: '$e',
  67. overview: null,
  68. directList: const [],
  69. );
  70. }
  71. }
  72. Future<void> loadMore() async {
  73. if (state.isLoadingMore || !state.hasMore) {
  74. return;
  75. }
  76. state = state.copyWith(isLoadingMore: true);
  77. try {
  78. final nextPage = state.pageNo + 1;
  79. final page = await _service.getDirectList(
  80. pageNo: nextPage,
  81. pageSize: _pageSize,
  82. );
  83. state = state.copyWith(
  84. isLoadingMore: false,
  85. directList: [...state.directList, ...page.content],
  86. pageNo: page.pageNo,
  87. hasMore: page.hasMore,
  88. );
  89. } catch (e) {
  90. state = state.copyWith(isLoadingMore: false, errorMessage: '$e');
  91. }
  92. }
  93. }
  94. final stakingTeamProvider =
  95. AutoDisposeNotifierProvider<StakingTeamNotifier, StakingTeamState>(
  96. StakingTeamNotifier.new,
  97. );