-
Notifications
You must be signed in to change notification settings - Fork 149
/
home_cubit.dart
102 lines (84 loc) · 2.71 KB
/
home_cubit.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import 'dart:developer';
import 'package:beacon/Bloc/core/resources/data_state.dart';
import 'package:beacon/Bloc/domain/entities/group/group_entity.dart';
import 'package:beacon/Bloc/domain/usecase/home_usecase.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
abstract class HomeState {}
class InitialHomeState extends HomeState {}
class ReloadState extends HomeState {}
class ShrimmerState extends HomeState {}
class LoadingMoreGroups extends HomeState {}
class NewGroupLoadingState extends HomeState {}
class ErrorHomeState extends HomeState {
String error;
ErrorHomeState({required this.error});
}
class HomeCubit extends Cubit<HomeState> {
final HomeUseCase homeUseCase;
HomeCubit({required this.homeUseCase}) : super(InitialHomeState());
int page = 1;
int pageSize = 4;
bool isLoadingMore = false;
bool isCompletelyFetched = false;
List<GroupEntity> _totalGroups = [];
List<GroupEntity> get totalGroups => _totalGroups;
Future<void> createGroup(String title) async {
emit(NewGroupLoadingState());
final dataState = await homeUseCase.createGroup(title);
if (dataState is DataFailed) {
emit(ErrorHomeState(error: dataState.error!));
} else {
GroupEntity? group = dataState.data;
group != null ? _totalGroups.insert(0, group) : null;
emit(ReloadState());
}
}
Future<void> joinGroup(String shortCode) async {
emit(NewGroupLoadingState());
DataState<GroupEntity> state = await homeUseCase.joinGroup(shortCode);
if (state is DataFailed) {
emit(ErrorHomeState(error: state.error!));
} else {
GroupEntity? group = state.data;
group != null ? _totalGroups.insert(0, group) : null;
emit(ReloadState());
}
}
Future<void> fetchUserGroups() async {
// if already loading then return
if (isCompletelyFetched == true || isLoadingMore == true) return;
if (page != 1) log('fetching next set of groups');
if (page == 1) {
emit(ShrimmerState());
} else {
isLoadingMore = true;
emit(LoadingMoreGroups());
}
DataState<List<GroupEntity>> state =
await homeUseCase.groups(page, pageSize);
if (state is DataFailed) {
isLoadingMore = false;
emit(ErrorHomeState(error: state.error!));
} else {
List<GroupEntity> newGroups = state.data ?? [];
if (newGroups.isEmpty) {
isCompletelyFetched = true;
emit(ReloadState());
return;
}
for (var newGroup in newGroups) {
_totalGroups.add(newGroup);
}
page++;
isLoadingMore = false;
emit(ReloadState());
}
}
clear() {
page = 1;
isLoadingMore = false;
isCompletelyFetched = false;
_totalGroups.clear();
emit(InitialHomeState());
}
}