wip: bloc for holidays

This commit is contained in:
2024-05-14 14:54:01 +02:00
parent 328c4f410c
commit 634fe41e78
23 changed files with 803 additions and 40 deletions

View File

@ -17,23 +17,40 @@ abstract class LoadableHydratedBloc<
LoadableState<TState>
> {
late TRepository _repository;
LoadableHydratedBloc() : super(const LoadableState()) {
LoadableHydratedBloc() : super(const LoadableState(
error: null,
data: null,
isLoading: true,
lastFetch: null,
reFetch: null,
)) {
on<Emit<TState>>((event, emit) => emit(LoadableState(
isLoading: event.loading,
on<Emit<TState>>((event, emit) {
emit(LoadableState(
isLoading: state.isLoading,
data: event.state(innerState ?? fromNothing()),
lastFetch: DateTime.now().millisecondsSinceEpoch,
reFetch: retry
lastFetch: state.lastFetch,
reFetch: retry,
error: state.error,
));
});
on<DataGathered<TState>>((event, emit) => emit(LoadableState(
isLoading: false,
data: event.state(innerState ?? fromNothing()),
lastFetch: DateTime.now().millisecondsSinceEpoch,
reFetch: retry,
error: null,
)));
on<RefetchStarted<TState>>((event, emit) => emit(LoadableState(
isLoading: true,
data: innerState,
lastFetch: state.lastFetch
lastFetch: state.lastFetch,
reFetch: null,
error: null,
)));
on<ClearState<TState>>((event, emit) => emit(const LoadableState()));
on<Error<TState>>((event, emit) => emit(LoadableState(
isLoading: false,
data: innerState,
@ -61,7 +78,7 @@ abstract class LoadableHydratedBloc<
(e) {
log('Error while fetching ${TState.toString()}: ${e.toString()}');
add(Error(LoadingError(
message: e.message,
message: e.message ?? e.toString(),
allowRetry: true,
)));
},
@ -73,14 +90,30 @@ abstract class LoadableHydratedBloc<
@override
fromJson(Map<String, dynamic> json) {
var rawData = LoadableSaveContext.unwrap(json);
return LoadableState(isLoading: true, lastFetch: rawData.meta.timestamp, data: fromStorage(rawData.data));
return LoadableState(
isLoading: true,
data: fromStorage(rawData.data),
lastFetch: rawData.meta.timestamp,
reFetch: null,
error: null,
);
}
@override
Map<String, dynamic>? toJson(LoadableState<TState> state) => LoadableSaveContext.wrap(
toStorage(state.data),
Map<String, dynamic>? toJson(LoadableState<TState> state) {
Map<String, dynamic>? data;
try {
data = toStorage(state.data);
} catch(e) {
log('Failed to save state ${TState.toString()}: ${e.toString()}');
data = null;
}
return LoadableSaveContext.wrap(
data,
state.lastFetch ?? DateTime.now().millisecondsSinceEpoch
);
);
}
Future<void> gatherData();
TRepository repository();

View File

@ -3,10 +3,12 @@ import '../../loadableState/loading_error.dart';
class LoadableHydratedBlocEvent<TState> {}
class Emit<TState> extends LoadableHydratedBlocEvent<TState> {
final TState Function(TState state) state;
final bool loading;
Emit(this.state, {this.loading = false});
Emit(this.state);
}
class DataGathered<TState> extends LoadableHydratedBlocEvent<TState> {
final TState Function(TState state) state;
DataGathered(this.state);
}
class ClearState<TState> extends LoadableHydratedBlocEvent<TState> {}
class Error<TState> extends LoadableHydratedBlocEvent<TState> {
final LoadingError error;
Error(this.error);

View File

@ -21,4 +21,3 @@ class LoadableSaveContext with _$LoadableSaveContext {
static ({Map<String, dynamic> data, LoadableSaveContext meta}) unwrap(Map<String, dynamic> data) =>
(data: data[dataKey] as Map<String, dynamic>, meta: LoadableSaveContext.fromJson(data[metaKey]));
}