asyncvalue_extensions.dart 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import 'package:flutter/material.dart';
  2. import 'package:hooks_riverpod/hooks_riverpod.dart';
  3. import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart';
  4. import 'package:immich_mobile/shared/ui/scaffold_error_body.dart';
  5. import 'package:logging/logging.dart';
  6. extension LogOnError<T> on AsyncValue<T> {
  7. static final Logger _asyncErrorLogger = Logger("AsyncValue");
  8. Widget widgetWhen({
  9. bool skipLoadingOnRefresh = true,
  10. Widget Function()? onLoading,
  11. Widget Function(Object? error, StackTrace? stack)? onError,
  12. required Widget Function(T data) onData,
  13. }) {
  14. if (isLoading) {
  15. bool skip = false;
  16. if (isRefreshing) {
  17. skip = skipLoadingOnRefresh;
  18. }
  19. if (!skip) {
  20. return onLoading?.call() ??
  21. const Center(
  22. child: ImmichLoadingIndicator(),
  23. );
  24. }
  25. }
  26. if (hasError && !hasValue) {
  27. _asyncErrorLogger.severe("Error occured", error, stackTrace);
  28. return onError?.call(error, stackTrace) ?? const ScaffoldErrorBody();
  29. }
  30. return onData(requireValue);
  31. }
  32. }