mirror of https://github.com/immich-app/immich.git
refactor(mobile): riverpod codegen + riverpod lint (#4836)
* build(mobile): add riverpod_lint * refactor(mobile): riverpod_generator for providers * test(mobile): fix integration test helper * refactor: ApiService to riverpod codegen * refactor(mobile): return curatedcontent instead of people dto * refactor: person provider to asyncnotifier * mobile: update service providers to use lambda * mobile: update scaffoldbody default error icon * remove logger mixin --------- Co-authored-by: shalong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>pull/5160/head
parent
bfab86b70d
commit
983473261b
@ -0,0 +1,27 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart';
|
||||||
|
import 'package:immich_mobile/shared/ui/scaffold_error_body.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
|
extension ScaffoldBody<T> on AsyncValue<T> {
|
||||||
|
static final Logger _scaffoldBodyLog = Logger("ScaffoldBody");
|
||||||
|
|
||||||
|
Widget scaffoldBodyWhen({
|
||||||
|
required Widget Function(T data) onData,
|
||||||
|
Widget? onError,
|
||||||
|
}) {
|
||||||
|
if (isLoading) {
|
||||||
|
return const Center(
|
||||||
|
child: ImmichLoadingIndicator(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasError && !hasValue) {
|
||||||
|
_scaffoldBodyLog.severe("Error occured in AsyncValue", error, stackTrace);
|
||||||
|
return onError ?? const ScaffoldErrorBody();
|
||||||
|
}
|
||||||
|
|
||||||
|
return onData(requireValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,44 +1,51 @@
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
||||||
import 'package:immich_mobile/modules/home/ui/asset_grid/asset_grid_data_structure.dart';
|
import 'package:immich_mobile/modules/home/ui/asset_grid/asset_grid_data_structure.dart';
|
||||||
|
import 'package:immich_mobile/modules/search/models/curated_content.dart';
|
||||||
import 'package:immich_mobile/modules/search/services/person.service.dart';
|
import 'package:immich_mobile/modules/search/services/person.service.dart';
|
||||||
import 'package:openapi/api.dart';
|
import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart';
|
||||||
|
import 'package:immich_mobile/modules/settings/services/app_settings.service.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
final personAssetsProvider = FutureProvider.family
|
part 'people.provider.g.dart';
|
||||||
.autoDispose<RenderList, String>((ref, personId) async {
|
|
||||||
final PersonService personService = ref.watch(personServiceProvider);
|
|
||||||
|
|
||||||
final assets = await personService.getPersonAssets(personId);
|
@riverpod
|
||||||
|
Future<List<CuratedContent>> getCuratedPeople(
|
||||||
if (assets == null) {
|
GetCuratedPeopleRef ref,
|
||||||
return RenderList.empty();
|
) async {
|
||||||
}
|
final PersonService personService = ref.read(personServiceProvider);
|
||||||
|
|
||||||
return RenderList.fromAssets(assets, GroupAssetsBy.auto);
|
|
||||||
});
|
|
||||||
|
|
||||||
final getCuratedPeopleProvider =
|
|
||||||
FutureProvider.autoDispose<List<PersonResponseDto>>((ref) async {
|
|
||||||
final PersonService personService = ref.watch(personServiceProvider);
|
|
||||||
|
|
||||||
final curatedPeople = await personService.getCuratedPeople();
|
final curatedPeople = await personService.getCuratedPeople();
|
||||||
|
|
||||||
return curatedPeople ?? [];
|
return curatedPeople
|
||||||
});
|
.map((p) => CuratedContent(id: p.id, label: p.name))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
class UpdatePersonName {
|
@riverpod
|
||||||
final String id;
|
Future<RenderList> personAssets(PersonAssetsRef ref, String personId) async {
|
||||||
final String name;
|
final PersonService personService = ref.read(personServiceProvider);
|
||||||
|
final assets = await personService.getPersonAssets(personId);
|
||||||
|
if (assets == null) {
|
||||||
|
return RenderList.empty();
|
||||||
|
}
|
||||||
|
|
||||||
UpdatePersonName(this.id, this.name);
|
final settings = ref.read(appSettingsServiceProvider);
|
||||||
|
final groupBy =
|
||||||
|
GroupAssetsBy.values[settings.getSetting(AppSettingsEnum.groupAssetsBy)];
|
||||||
|
return await RenderList.fromAssets(assets, groupBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
final updatePersonNameProvider =
|
@riverpod
|
||||||
StateProvider.family<void, UpdatePersonName>((ref, dto) async {
|
Future<bool> updatePersonName(
|
||||||
final PersonService personService = ref.watch(personServiceProvider);
|
UpdatePersonNameRef ref,
|
||||||
|
String personId,
|
||||||
final person = await personService.updateName(dto.id, dto.name);
|
String updatedName,
|
||||||
|
) async {
|
||||||
|
final PersonService personService = ref.read(personServiceProvider);
|
||||||
|
final person = await personService.updateName(personId, updatedName);
|
||||||
|
|
||||||
if (person != null && person.name == dto.name) {
|
if (person != null && person.name == updatedName) {
|
||||||
ref.invalidate(getCuratedPeopleProvider);
|
ref.invalidate(getCuratedPeopleProvider);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@ -0,0 +1,320 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'people.provider.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$getCuratedPeopleHash() => r'2a534553812abe69abce2c2e41aa62b8de16e9d0';
|
||||||
|
|
||||||
|
/// See also [getCuratedPeople].
|
||||||
|
@ProviderFor(getCuratedPeople)
|
||||||
|
final getCuratedPeopleProvider =
|
||||||
|
AutoDisposeFutureProvider<List<CuratedContent>>.internal(
|
||||||
|
getCuratedPeople,
|
||||||
|
name: r'getCuratedPeopleProvider',
|
||||||
|
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$getCuratedPeopleHash,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef GetCuratedPeopleRef
|
||||||
|
= AutoDisposeFutureProviderRef<List<CuratedContent>>;
|
||||||
|
String _$personAssetsHash() => r'1d6eff5ca3aa630b58c4dad9516193b21896984d';
|
||||||
|
|
||||||
|
/// Copied from Dart SDK
|
||||||
|
class _SystemHash {
|
||||||
|
_SystemHash._();
|
||||||
|
|
||||||
|
static int combine(int hash, int value) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + value);
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||||
|
return hash ^ (hash >> 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int finish(int hash) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = hash ^ (hash >> 11);
|
||||||
|
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [personAssets].
|
||||||
|
@ProviderFor(personAssets)
|
||||||
|
const personAssetsProvider = PersonAssetsFamily();
|
||||||
|
|
||||||
|
/// See also [personAssets].
|
||||||
|
class PersonAssetsFamily extends Family<AsyncValue<RenderList>> {
|
||||||
|
/// See also [personAssets].
|
||||||
|
const PersonAssetsFamily();
|
||||||
|
|
||||||
|
/// See also [personAssets].
|
||||||
|
PersonAssetsProvider call(
|
||||||
|
String personId,
|
||||||
|
) {
|
||||||
|
return PersonAssetsProvider(
|
||||||
|
personId,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
PersonAssetsProvider getProviderOverride(
|
||||||
|
covariant PersonAssetsProvider provider,
|
||||||
|
) {
|
||||||
|
return call(
|
||||||
|
provider.personId,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||||
|
_allTransitiveDependencies;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String? get name => r'personAssetsProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [personAssets].
|
||||||
|
class PersonAssetsProvider extends AutoDisposeFutureProvider<RenderList> {
|
||||||
|
/// See also [personAssets].
|
||||||
|
PersonAssetsProvider(
|
||||||
|
String personId,
|
||||||
|
) : this._internal(
|
||||||
|
(ref) => personAssets(
|
||||||
|
ref as PersonAssetsRef,
|
||||||
|
personId,
|
||||||
|
),
|
||||||
|
from: personAssetsProvider,
|
||||||
|
name: r'personAssetsProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$personAssetsHash,
|
||||||
|
dependencies: PersonAssetsFamily._dependencies,
|
||||||
|
allTransitiveDependencies:
|
||||||
|
PersonAssetsFamily._allTransitiveDependencies,
|
||||||
|
personId: personId,
|
||||||
|
);
|
||||||
|
|
||||||
|
PersonAssetsProvider._internal(
|
||||||
|
super._createNotifier, {
|
||||||
|
required super.name,
|
||||||
|
required super.dependencies,
|
||||||
|
required super.allTransitiveDependencies,
|
||||||
|
required super.debugGetCreateSourceHash,
|
||||||
|
required super.from,
|
||||||
|
required this.personId,
|
||||||
|
}) : super.internal();
|
||||||
|
|
||||||
|
final String personId;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Override overrideWith(
|
||||||
|
FutureOr<RenderList> Function(PersonAssetsRef provider) create,
|
||||||
|
) {
|
||||||
|
return ProviderOverride(
|
||||||
|
origin: this,
|
||||||
|
override: PersonAssetsProvider._internal(
|
||||||
|
(ref) => create(ref as PersonAssetsRef),
|
||||||
|
from: from,
|
||||||
|
name: null,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
debugGetCreateSourceHash: null,
|
||||||
|
personId: personId,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AutoDisposeFutureProviderElement<RenderList> createElement() {
|
||||||
|
return _PersonAssetsProviderElement(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is PersonAssetsProvider && other.personId == personId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, personId.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mixin PersonAssetsRef on AutoDisposeFutureProviderRef<RenderList> {
|
||||||
|
/// The parameter `personId` of this provider.
|
||||||
|
String get personId;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PersonAssetsProviderElement
|
||||||
|
extends AutoDisposeFutureProviderElement<RenderList> with PersonAssetsRef {
|
||||||
|
_PersonAssetsProviderElement(super.provider);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get personId => (origin as PersonAssetsProvider).personId;
|
||||||
|
}
|
||||||
|
|
||||||
|
String _$updatePersonNameHash() => r'c7179a7cc558669c3b30b03fbca7782a42f2b6fd';
|
||||||
|
|
||||||
|
/// See also [updatePersonName].
|
||||||
|
@ProviderFor(updatePersonName)
|
||||||
|
const updatePersonNameProvider = UpdatePersonNameFamily();
|
||||||
|
|
||||||
|
/// See also [updatePersonName].
|
||||||
|
class UpdatePersonNameFamily extends Family<AsyncValue<bool>> {
|
||||||
|
/// See also [updatePersonName].
|
||||||
|
const UpdatePersonNameFamily();
|
||||||
|
|
||||||
|
/// See also [updatePersonName].
|
||||||
|
UpdatePersonNameProvider call(
|
||||||
|
String personId,
|
||||||
|
String updatedName,
|
||||||
|
) {
|
||||||
|
return UpdatePersonNameProvider(
|
||||||
|
personId,
|
||||||
|
updatedName,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
UpdatePersonNameProvider getProviderOverride(
|
||||||
|
covariant UpdatePersonNameProvider provider,
|
||||||
|
) {
|
||||||
|
return call(
|
||||||
|
provider.personId,
|
||||||
|
provider.updatedName,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||||
|
_allTransitiveDependencies;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String? get name => r'updatePersonNameProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [updatePersonName].
|
||||||
|
class UpdatePersonNameProvider extends AutoDisposeFutureProvider<bool> {
|
||||||
|
/// See also [updatePersonName].
|
||||||
|
UpdatePersonNameProvider(
|
||||||
|
String personId,
|
||||||
|
String updatedName,
|
||||||
|
) : this._internal(
|
||||||
|
(ref) => updatePersonName(
|
||||||
|
ref as UpdatePersonNameRef,
|
||||||
|
personId,
|
||||||
|
updatedName,
|
||||||
|
),
|
||||||
|
from: updatePersonNameProvider,
|
||||||
|
name: r'updatePersonNameProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$updatePersonNameHash,
|
||||||
|
dependencies: UpdatePersonNameFamily._dependencies,
|
||||||
|
allTransitiveDependencies:
|
||||||
|
UpdatePersonNameFamily._allTransitiveDependencies,
|
||||||
|
personId: personId,
|
||||||
|
updatedName: updatedName,
|
||||||
|
);
|
||||||
|
|
||||||
|
UpdatePersonNameProvider._internal(
|
||||||
|
super._createNotifier, {
|
||||||
|
required super.name,
|
||||||
|
required super.dependencies,
|
||||||
|
required super.allTransitiveDependencies,
|
||||||
|
required super.debugGetCreateSourceHash,
|
||||||
|
required super.from,
|
||||||
|
required this.personId,
|
||||||
|
required this.updatedName,
|
||||||
|
}) : super.internal();
|
||||||
|
|
||||||
|
final String personId;
|
||||||
|
final String updatedName;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Override overrideWith(
|
||||||
|
FutureOr<bool> Function(UpdatePersonNameRef provider) create,
|
||||||
|
) {
|
||||||
|
return ProviderOverride(
|
||||||
|
origin: this,
|
||||||
|
override: UpdatePersonNameProvider._internal(
|
||||||
|
(ref) => create(ref as UpdatePersonNameRef),
|
||||||
|
from: from,
|
||||||
|
name: null,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
debugGetCreateSourceHash: null,
|
||||||
|
personId: personId,
|
||||||
|
updatedName: updatedName,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AutoDisposeFutureProviderElement<bool> createElement() {
|
||||||
|
return _UpdatePersonNameProviderElement(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is UpdatePersonNameProvider &&
|
||||||
|
other.personId == personId &&
|
||||||
|
other.updatedName == updatedName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, personId.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, updatedName.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mixin UpdatePersonNameRef on AutoDisposeFutureProviderRef<bool> {
|
||||||
|
/// The parameter `personId` of this provider.
|
||||||
|
String get personId;
|
||||||
|
|
||||||
|
/// The parameter `updatedName` of this provider.
|
||||||
|
String get updatedName;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _UpdatePersonNameProviderElement
|
||||||
|
extends AutoDisposeFutureProviderElement<bool> with UpdatePersonNameRef {
|
||||||
|
_UpdatePersonNameProviderElement(super.provider);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get personId => (origin as UpdatePersonNameProvider).personId;
|
||||||
|
@override
|
||||||
|
String get updatedName => (origin as UpdatePersonNameProvider).updatedName;
|
||||||
|
}
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'person.service.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$personServiceHash() => r'3fc3dcf4603c7b55c0deae65f39f6c212eea492b';
|
||||||
|
|
||||||
|
/// See also [personService].
|
||||||
|
@ProviderFor(personService)
|
||||||
|
final personServiceProvider = AutoDisposeProvider<PersonService>.internal(
|
||||||
|
personService,
|
||||||
|
name: r'personServiceProvider',
|
||||||
|
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$personServiceHash,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef PersonServiceRef = AutoDisposeProviderRef<PersonService>;
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||||
@ -1,4 +1,8 @@
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
||||||
import 'package:immich_mobile/modules/settings/services/app_settings.service.dart';
|
import 'package:immich_mobile/modules/settings/services/app_settings.service.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
final appSettingsServiceProvider = Provider((ref) => AppSettingsService());
|
part 'app_settings.provider.g.dart';
|
||||||
|
|
||||||
|
@Riverpod(keepAlive: true)
|
||||||
|
AppSettingsService appSettingsService(AppSettingsServiceRef ref) =>
|
||||||
|
AppSettingsService();
|
||||||
|
|||||||
@ -0,0 +1,26 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'app_settings.provider.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$appSettingsServiceHash() =>
|
||||||
|
r'957a65af6967701112f3076b507f9738fec4b7be';
|
||||||
|
|
||||||
|
/// See also [appSettingsService].
|
||||||
|
@ProviderFor(appSettingsService)
|
||||||
|
final appSettingsServiceProvider = Provider<AppSettingsService>.internal(
|
||||||
|
appSettingsService,
|
||||||
|
name: r'appSettingsServiceProvider',
|
||||||
|
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$appSettingsServiceHash,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef AppSettingsServiceRef = ProviderRef<AppSettingsService>;
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||||
@ -1,4 +1,7 @@
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
||||||
import 'package:immich_mobile/shared/services/api.service.dart';
|
import 'package:immich_mobile/shared/services/api.service.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
final apiServiceProvider = Provider((ref) => ApiService());
|
part 'api.provider.g.dart';
|
||||||
|
|
||||||
|
@Riverpod(keepAlive: true)
|
||||||
|
ApiService apiService(ApiServiceRef ref) => ApiService();
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'api.provider.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$apiServiceHash() => r'03cbd33147a7058d56175e532ac47e1aa4858c6d';
|
||||||
|
|
||||||
|
/// See also [apiService].
|
||||||
|
@ProviderFor(apiService)
|
||||||
|
final apiServiceProvider = Provider<ApiService>.internal(
|
||||||
|
apiService,
|
||||||
|
name: r'apiServiceProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product') ? null : _$apiServiceHash,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef ApiServiceRef = ProviderRef<ApiService>;
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
|
|
||||||
|
// Error widget to be used in Scaffold when an AsyncError is received
|
||||||
|
class ScaffoldErrorBody extends StatelessWidget {
|
||||||
|
final IconData icon;
|
||||||
|
|
||||||
|
const ScaffoldErrorBody({this.icon = Icons.error_outline, super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
const Text(
|
||||||
|
"scaffold_body_error_occured",
|
||||||
|
style:
|
||||||
|
TextStyle(fontSize: 14, fontWeight: FontWeight.bold, height: 3),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
).tr(),
|
||||||
|
Center(
|
||||||
|
child: Icon(
|
||||||
|
icon,
|
||||||
|
size: 100,
|
||||||
|
color: context.themeData.iconTheme.color?.withOpacity(0.5),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue