Merge pull request #484 from NBA2K1/main

Fixes, Refactors, and Async Improvements
This commit is contained in:
Moustapha Kodjo Amadou 2025-06-07 13:37:57 +01:00 committed by GitHub
commit 183e88ebd0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 148 additions and 566 deletions

View file

@ -4,11 +4,9 @@ import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/extensions_provider.dart';
import 'package:mangayomi/services/fetch_anime_sources.dart';
import 'package:mangayomi/services/fetch_manga_sources.dart';
import 'package:mangayomi/services/fetch_item_sources.dart';
import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/fetch_novel_sources.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:mangayomi/utils/language.dart';
import 'package:mangayomi/modules/browse/extension/widgets/extension_list_tile_widget.dart';
@ -30,48 +28,34 @@ class _ExtensionScreenState extends ConsumerState<ExtensionScreen> {
final ScrollController controller = ScrollController();
bool isUpdating = false;
Future<void> _refreshSources() {
return switch (widget.itemType) {
ItemType.manga => ref.refresh(
fetchMangaSourcesListProvider(id: null, reFresh: true).future,
),
ItemType.anime => ref.refresh(
fetchAnimeSourcesListProvider(id: null, reFresh: true).future,
),
_ => ref.refresh(
fetchNovelSourcesListProvider(id: null, reFresh: true).future,
),
};
return ref.refresh(
fetchItemSourcesListProvider(
id: null,
reFresh: true,
itemType: widget.itemType,
).future,
);
}
Future<void> _updateSource(Source source) {
switch (source.itemType) {
case ItemType.manga:
return ref.read(
fetchMangaSourcesListProvider(id: source.id, reFresh: true).future,
);
case ItemType.anime:
return ref.read(
fetchAnimeSourcesListProvider(id: source.id, reFresh: true).future,
);
default:
return ref.read(
fetchNovelSourcesListProvider(id: source.id, reFresh: true).future,
);
}
return ref.read(
fetchItemSourcesListProvider(
id: source.id,
reFresh: true,
itemType: source.itemType,
).future,
);
}
@override
Widget build(BuildContext context) {
switch (widget.itemType) {
case ItemType.manga:
ref.read(fetchMangaSourcesListProvider(id: null, reFresh: false));
break;
case ItemType.anime:
ref.read(fetchAnimeSourcesListProvider(id: null, reFresh: false));
break;
default:
ref.read(fetchNovelSourcesListProvider(id: null, reFresh: false));
}
ref.read(
fetchItemSourcesListProvider(
id: null,
reFresh: false,
itemType: widget.itemType,
),
);
final streamExtensions = ref.watch(
getExtensionsStreamProvider(widget.itemType),

View file

@ -1,12 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/services/fetch_anime_sources.dart';
import 'package:mangayomi/services/fetch_manga_sources.dart';
import 'package:mangayomi/services/fetch_item_sources.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/fetch_novel_sources.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:mangayomi/utils/cached_network.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
@ -45,28 +42,14 @@ class _ExtensionListTileWidgetState
setState(() => _isLoading = true);
try {
final future = switch (widget.source.itemType) {
ItemType.manga => ref.watch(
fetchMangaSourcesListProvider(
id: widget.source.id,
reFresh: true,
).future,
),
ItemType.anime => ref.watch(
fetchAnimeSourcesListProvider(
id: widget.source.id,
reFresh: true,
).future,
),
_ => ref.watch(
fetchNovelSourcesListProvider(
id: widget.source.id,
reFresh: true,
).future,
),
};
final provider = fetchItemSourcesListProvider(
id: widget.source.id,
reFresh: true,
itemType: widget.source.itemType,
);
await future;
if (!widget.source.isAdded!) ref.invalidate(provider);
await ref.watch(provider.future);
} finally {
if (mounted) setState(() => _isLoading = false);
}

View file

@ -14,14 +14,12 @@ import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart';
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
import 'package:mangayomi/modules/widgets/loading_icon.dart';
import 'package:mangayomi/services/fetch_anime_sources.dart';
import 'package:mangayomi/services/fetch_manga_sources.dart';
import 'package:mangayomi/services/fetch_item_sources.dart';
import 'package:mangayomi/modules/main_view/providers/migration.dart';
import 'package:mangayomi/modules/more/about/providers/check_for_update.dart';
import 'package:mangayomi/modules/more/data_and_storage/providers/auto_backup.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/router/router.dart';
import 'package:mangayomi/services/fetch_novel_sources.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:mangayomi/services/sync_server.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
@ -107,9 +105,15 @@ class _MainScreenState extends ConsumerState<MainScreen> {
Future.microtask(() {
if (mounted) {
ref.read(checkForUpdateProvider(context: context));
ref.read(fetchMangaSourcesListProvider(id: null, reFresh: false));
ref.read(fetchAnimeSourcesListProvider(id: null, reFresh: false));
ref.read(fetchNovelSourcesListProvider(id: null, reFresh: false));
for (var type in ItemType.values) {
ref.read(
FetchItemSourcesListProvider(
id: null,
reFresh: false,
itemType: type,
),
);
}
}
});
}

View file

@ -5,9 +5,7 @@ import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/services/fetch_anime_sources.dart';
import 'package:mangayomi/services/fetch_manga_sources.dart';
import 'package:mangayomi/services/fetch_novel_sources.dart';
import 'package:mangayomi/services/fetch_item_sources.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'browse_state_provider.g.dart';
@ -57,17 +55,13 @@ class ExtensionsRepoState extends _$ExtensionsRepoState {
a;
});
try {
final a = switch (itemType) {
ItemType.manga => ref.refresh(
fetchMangaSourcesListProvider(id: null, reFresh: false).future,
),
ItemType.anime => ref.refresh(
fetchAnimeSourcesListProvider(id: null, reFresh: false).future,
),
_ => ref.refresh(
fetchNovelSourcesListProvider(id: null, reFresh: false).future,
),
};
final a = ref.refresh(
fetchItemSourcesListProvider(
id: null,
reFresh: false,
itemType: itemType,
).future,
);
Future.wait([a]);
} catch (_) {}
}

View file

@ -4,23 +4,24 @@ import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_pr
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'fetch_anime_sources.g.dart';
part 'fetch_item_sources.g.dart';
@Riverpod(keepAlive: true)
Future<void> fetchAnimeSourcesList(
Future<void> fetchItemSourcesList(
Ref ref, {
int? id,
required bool reFresh,
required ItemType itemType,
}) async {
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
final repos = ref.watch(extensionsRepoStateProvider(ItemType.anime));
final repos = ref.watch(extensionsRepoStateProvider(itemType));
for (Repo repo in repos) {
await fetchSourcesList(
repo: repo,
refresh: reFresh,
id: id,
ref: ref,
itemType: ItemType.anime,
itemType: itemType,
);
}
}

View file

@ -1,13 +1,13 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'fetch_anime_sources.dart';
part of 'fetch_item_sources.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$fetchAnimeSourcesListHash() =>
r'e7f673d37239c74f3403de3a234bbc1d6e171332';
String _$fetchItemSourcesListHash() =>
r'16238be20517fddacf52a2694fbd50cafbfa7496';
/// Copied from Dart SDK
class _SystemHash {
@ -30,33 +30,36 @@ class _SystemHash {
}
}
/// See also [fetchAnimeSourcesList].
@ProviderFor(fetchAnimeSourcesList)
const fetchAnimeSourcesListProvider = FetchAnimeSourcesListFamily();
/// See also [fetchItemSourcesList].
@ProviderFor(fetchItemSourcesList)
const fetchItemSourcesListProvider = FetchItemSourcesListFamily();
/// See also [fetchAnimeSourcesList].
class FetchAnimeSourcesListFamily extends Family<AsyncValue<void>> {
/// See also [fetchAnimeSourcesList].
const FetchAnimeSourcesListFamily();
/// See also [fetchItemSourcesList].
class FetchItemSourcesListFamily extends Family<AsyncValue<void>> {
/// See also [fetchItemSourcesList].
const FetchItemSourcesListFamily();
/// See also [fetchAnimeSourcesList].
FetchAnimeSourcesListProvider call({
/// See also [fetchItemSourcesList].
FetchItemSourcesListProvider call({
int? id,
required bool reFresh,
required ItemType itemType,
}) {
return FetchAnimeSourcesListProvider(
return FetchItemSourcesListProvider(
id: id,
reFresh: reFresh,
itemType: itemType,
);
}
@override
FetchAnimeSourcesListProvider getProviderOverride(
covariant FetchAnimeSourcesListProvider provider,
FetchItemSourcesListProvider getProviderOverride(
covariant FetchItemSourcesListProvider provider,
) {
return call(
id: provider.id,
reFresh: provider.reFresh,
itemType: provider.itemType,
);
}
@ -72,35 +75,38 @@ class FetchAnimeSourcesListFamily extends Family<AsyncValue<void>> {
_allTransitiveDependencies;
@override
String? get name => r'fetchAnimeSourcesListProvider';
String? get name => r'fetchItemSourcesListProvider';
}
/// See also [fetchAnimeSourcesList].
class FetchAnimeSourcesListProvider extends FutureProvider<void> {
/// See also [fetchAnimeSourcesList].
FetchAnimeSourcesListProvider({
/// See also [fetchItemSourcesList].
class FetchItemSourcesListProvider extends FutureProvider<void> {
/// See also [fetchItemSourcesList].
FetchItemSourcesListProvider({
int? id,
required bool reFresh,
required ItemType itemType,
}) : this._internal(
(ref) => fetchAnimeSourcesList(
ref as FetchAnimeSourcesListRef,
(ref) => fetchItemSourcesList(
ref as FetchItemSourcesListRef,
id: id,
reFresh: reFresh,
itemType: itemType,
),
from: fetchAnimeSourcesListProvider,
name: r'fetchAnimeSourcesListProvider',
from: fetchItemSourcesListProvider,
name: r'fetchItemSourcesListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$fetchAnimeSourcesListHash,
dependencies: FetchAnimeSourcesListFamily._dependencies,
: _$fetchItemSourcesListHash,
dependencies: FetchItemSourcesListFamily._dependencies,
allTransitiveDependencies:
FetchAnimeSourcesListFamily._allTransitiveDependencies,
FetchItemSourcesListFamily._allTransitiveDependencies,
id: id,
reFresh: reFresh,
itemType: itemType,
);
FetchAnimeSourcesListProvider._internal(
FetchItemSourcesListProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
@ -109,19 +115,21 @@ class FetchAnimeSourcesListProvider extends FutureProvider<void> {
required super.from,
required this.id,
required this.reFresh,
required this.itemType,
}) : super.internal();
final int? id;
final bool reFresh;
final ItemType itemType;
@override
Override overrideWith(
FutureOr<void> Function(FetchAnimeSourcesListRef provider) create,
FutureOr<void> Function(FetchItemSourcesListRef provider) create,
) {
return ProviderOverride(
origin: this,
override: FetchAnimeSourcesListProvider._internal(
(ref) => create(ref as FetchAnimeSourcesListRef),
override: FetchItemSourcesListProvider._internal(
(ref) => create(ref as FetchItemSourcesListRef),
from: from,
name: null,
dependencies: null,
@ -129,20 +137,22 @@ class FetchAnimeSourcesListProvider extends FutureProvider<void> {
debugGetCreateSourceHash: null,
id: id,
reFresh: reFresh,
itemType: itemType,
),
);
}
@override
FutureProviderElement<void> createElement() {
return _FetchAnimeSourcesListProviderElement(this);
return _FetchItemSourcesListProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is FetchAnimeSourcesListProvider &&
return other is FetchItemSourcesListProvider &&
other.id == id &&
other.reFresh == reFresh;
other.reFresh == reFresh &&
other.itemType == itemType;
}
@override
@ -150,6 +160,7 @@ class FetchAnimeSourcesListProvider extends FutureProvider<void> {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, id.hashCode);
hash = _SystemHash.combine(hash, reFresh.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
}
@ -157,22 +168,27 @@ class FetchAnimeSourcesListProvider extends FutureProvider<void> {
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin FetchAnimeSourcesListRef on FutureProviderRef<void> {
mixin FetchItemSourcesListRef on FutureProviderRef<void> {
/// The parameter `id` of this provider.
int? get id;
/// The parameter `reFresh` of this provider.
bool get reFresh;
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
class _FetchAnimeSourcesListProviderElement extends FutureProviderElement<void>
with FetchAnimeSourcesListRef {
_FetchAnimeSourcesListProviderElement(super.provider);
class _FetchItemSourcesListProviderElement extends FutureProviderElement<void>
with FetchItemSourcesListRef {
_FetchItemSourcesListProviderElement(super.provider);
@override
int? get id => (origin as FetchAnimeSourcesListProvider).id;
int? get id => (origin as FetchItemSourcesListProvider).id;
@override
bool get reFresh => (origin as FetchAnimeSourcesListProvider).reFresh;
bool get reFresh => (origin as FetchItemSourcesListProvider).reFresh;
@override
ItemType get itemType => (origin as FetchItemSourcesListProvider).itemType;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -1,23 +0,0 @@
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'fetch_manga_sources.g.dart';
@Riverpod(keepAlive: true)
Future<void> fetchMangaSourcesList(Ref ref, {int? id, required reFresh}) async {
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
final repos = ref.watch(extensionsRepoStateProvider(ItemType.manga));
for (Repo repo in repos) {
await fetchSourcesList(
repo: repo,
refresh: reFresh,
id: id,
ref: ref,
itemType: ItemType.manga,
);
}
}
}

View file

@ -1,178 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'fetch_manga_sources.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$fetchMangaSourcesListHash() =>
r'176206caf5c51a94b100866d5cdb612d2a5c2fb7';
/// 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 [fetchMangaSourcesList].
@ProviderFor(fetchMangaSourcesList)
const fetchMangaSourcesListProvider = FetchMangaSourcesListFamily();
/// See also [fetchMangaSourcesList].
class FetchMangaSourcesListFamily extends Family<AsyncValue<void>> {
/// See also [fetchMangaSourcesList].
const FetchMangaSourcesListFamily();
/// See also [fetchMangaSourcesList].
FetchMangaSourcesListProvider call({
int? id,
required dynamic reFresh,
}) {
return FetchMangaSourcesListProvider(
id: id,
reFresh: reFresh,
);
}
@override
FetchMangaSourcesListProvider getProviderOverride(
covariant FetchMangaSourcesListProvider provider,
) {
return call(
id: provider.id,
reFresh: provider.reFresh,
);
}
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'fetchMangaSourcesListProvider';
}
/// See also [fetchMangaSourcesList].
class FetchMangaSourcesListProvider extends FutureProvider<void> {
/// See also [fetchMangaSourcesList].
FetchMangaSourcesListProvider({
int? id,
required dynamic reFresh,
}) : this._internal(
(ref) => fetchMangaSourcesList(
ref as FetchMangaSourcesListRef,
id: id,
reFresh: reFresh,
),
from: fetchMangaSourcesListProvider,
name: r'fetchMangaSourcesListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$fetchMangaSourcesListHash,
dependencies: FetchMangaSourcesListFamily._dependencies,
allTransitiveDependencies:
FetchMangaSourcesListFamily._allTransitiveDependencies,
id: id,
reFresh: reFresh,
);
FetchMangaSourcesListProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.id,
required this.reFresh,
}) : super.internal();
final int? id;
final dynamic reFresh;
@override
Override overrideWith(
FutureOr<void> Function(FetchMangaSourcesListRef provider) create,
) {
return ProviderOverride(
origin: this,
override: FetchMangaSourcesListProvider._internal(
(ref) => create(ref as FetchMangaSourcesListRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
id: id,
reFresh: reFresh,
),
);
}
@override
FutureProviderElement<void> createElement() {
return _FetchMangaSourcesListProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is FetchMangaSourcesListProvider &&
other.id == id &&
other.reFresh == reFresh;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, id.hashCode);
hash = _SystemHash.combine(hash, reFresh.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin FetchMangaSourcesListRef on FutureProviderRef<void> {
/// The parameter `id` of this provider.
int? get id;
/// The parameter `reFresh` of this provider.
dynamic get reFresh;
}
class _FetchMangaSourcesListProviderElement extends FutureProviderElement<void>
with FetchMangaSourcesListRef {
_FetchMangaSourcesListProviderElement(super.provider);
@override
int? get id => (origin as FetchMangaSourcesListProvider).id;
@override
dynamic get reFresh => (origin as FetchMangaSourcesListProvider).reFresh;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -1,23 +0,0 @@
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/services/fetch_sources_list.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'fetch_novel_sources.g.dart';
@Riverpod(keepAlive: true)
Future<void> fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async {
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
final repos = ref.watch(extensionsRepoStateProvider(ItemType.novel));
for (Repo repo in repos) {
await fetchSourcesList(
repo: repo,
refresh: reFresh,
id: id,
ref: ref,
itemType: ItemType.novel,
);
}
}
}

View file

@ -1,178 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'fetch_novel_sources.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$fetchNovelSourcesListHash() =>
r'882ee56332290a6fe71d38a8378de847e4386e3a';
/// 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 [fetchNovelSourcesList].
@ProviderFor(fetchNovelSourcesList)
const fetchNovelSourcesListProvider = FetchNovelSourcesListFamily();
/// See also [fetchNovelSourcesList].
class FetchNovelSourcesListFamily extends Family<AsyncValue<void>> {
/// See also [fetchNovelSourcesList].
const FetchNovelSourcesListFamily();
/// See also [fetchNovelSourcesList].
FetchNovelSourcesListProvider call({
int? id,
required dynamic reFresh,
}) {
return FetchNovelSourcesListProvider(
id: id,
reFresh: reFresh,
);
}
@override
FetchNovelSourcesListProvider getProviderOverride(
covariant FetchNovelSourcesListProvider provider,
) {
return call(
id: provider.id,
reFresh: provider.reFresh,
);
}
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'fetchNovelSourcesListProvider';
}
/// See also [fetchNovelSourcesList].
class FetchNovelSourcesListProvider extends FutureProvider<void> {
/// See also [fetchNovelSourcesList].
FetchNovelSourcesListProvider({
int? id,
required dynamic reFresh,
}) : this._internal(
(ref) => fetchNovelSourcesList(
ref as FetchNovelSourcesListRef,
id: id,
reFresh: reFresh,
),
from: fetchNovelSourcesListProvider,
name: r'fetchNovelSourcesListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$fetchNovelSourcesListHash,
dependencies: FetchNovelSourcesListFamily._dependencies,
allTransitiveDependencies:
FetchNovelSourcesListFamily._allTransitiveDependencies,
id: id,
reFresh: reFresh,
);
FetchNovelSourcesListProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.id,
required this.reFresh,
}) : super.internal();
final int? id;
final dynamic reFresh;
@override
Override overrideWith(
FutureOr<void> Function(FetchNovelSourcesListRef provider) create,
) {
return ProviderOverride(
origin: this,
override: FetchNovelSourcesListProvider._internal(
(ref) => create(ref as FetchNovelSourcesListRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
id: id,
reFresh: reFresh,
),
);
}
@override
FutureProviderElement<void> createElement() {
return _FetchNovelSourcesListProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is FetchNovelSourcesListProvider &&
other.id == id &&
other.reFresh == reFresh;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, id.hashCode);
hash = _SystemHash.combine(hash, reFresh.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin FetchNovelSourcesListRef on FutureProviderRef<void> {
/// The parameter `id` of this provider.
int? get id;
/// The parameter `reFresh` of this provider.
dynamic get reFresh;
}
class _FetchNovelSourcesListProviderElement extends FutureProviderElement<void>
with FetchNovelSourcesListRef {
_FetchNovelSourcesListProviderElement(super.provider);
@override
int? get id => (origin as FetchNovelSourcesListProvider).id;
@override
dynamic get reFresh => (origin as FetchNovelSourcesListProvider).reFresh;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -36,35 +36,34 @@ Future<void> fetchSourcesList({
)
.toList();
isar.writeTxnSync(() async {
if (id != null) {
final matchingSource = sourceList.firstWhere(
(source) => source.id == id,
orElse: () => Source(),
);
if (matchingSource.id != null) {
await _updateSource(matchingSource, ref, repo, itemType);
if (id != null) {
final matchingSource = sourceList.firstWhere(
(source) => source.id == id,
orElse: () => Source(),
);
if (matchingSource.id != null && matchingSource.sourceCodeUrl!.isNotEmpty) {
await _updateSource(matchingSource, ref, repo, itemType);
}
} else {
for (var source in sourceList) {
final existingSource = await isar.sources.get(source.id!);
if (existingSource == null) {
await _addNewSource(source, ref, repo, itemType);
continue;
}
} else {
for (var source in sourceList) {
final existingSource = isar.sources.getSync(source.id!);
if (existingSource != null) {
if (existingSource.isAdded! &&
compareVersions(existingSource.version!, source.version!) < 0) {
if (ref.watch(autoUpdateExtensionsStateProvider)) {
await _updateSource(source, ref, repo, itemType);
} else {
isar.sources.putSync(
existingSource..versionLast = source.version,
);
}
}
} else {
_addNewSource(source, ref, repo, itemType);
}
final shouldUpdate =
existingSource.isAdded! &&
compareVersions(existingSource.version!, source.version!) < 0;
if (!shouldUpdate) continue;
if (ref.read(autoUpdateExtensionsStateProvider)) {
await _updateSource(source, ref, repo, itemType);
} else {
await isar.writeTxn(() async {
isar.sources.put(existingSource..versionLast = source.version);
});
}
}
});
}
checkIfSourceIsObsolete(sourceList, repo!, itemType, ref);
}
@ -108,9 +107,7 @@ Future<void> _updateSource(
..notes = source.notes
..repo = repo;
isar.writeTxnSync(() {
isar.sources.putSync(updatedSource);
});
await isar.writeTxn(() async => isar.sources.put(updatedSource));
ref
.read(synchingProvider(syncId: 1).notifier)
.addChangedPart(
@ -121,7 +118,12 @@ Future<void> _updateSource(
);
}
void _addNewSource(Source source, Ref ref, Repo? repo, ItemType itemType) {
Future<void> _addNewSource(
Source source,
Ref ref,
Repo? repo,
ItemType itemType,
) async {
final newSource = Source()
..sourceCodeUrl = source.sourceCodeUrl
..id = source.id
@ -145,27 +147,27 @@ void _addNewSource(Source source, Ref ref, Repo? repo, ItemType itemType) {
..isObsolete = false
..notes = source.notes
..repo = repo;
isar.sources.putSync(newSource);
await isar.writeTxn(() async => isar.sources.put(newSource));
ref
.read(synchingProvider(syncId: 1).notifier)
.addChangedPart(ActionType.addExtension, null, newSource.toJson(), false);
}
void checkIfSourceIsObsolete(
Future<void> checkIfSourceIsObsolete(
List<Source> sourceList,
Repo repo,
ItemType itemType,
Ref ref,
) {
) async {
if (sourceList.isEmpty) return;
final sources = isar.sources
final sources = await isar.sources
.filter()
.idIsNotNull()
.itemTypeEqualTo(itemType)
.and()
.isLocalEqualTo(false)
.findAllSync();
.findAll();
if (sources.isEmpty) return;
@ -176,7 +178,7 @@ void checkIfSourceIsObsolete(
if (sourceIds.isEmpty) return;
isar.writeTxnSync(() {
await isar.writeTxn(() async {
for (var source in sources) {
final isNowObsolete =
!sourceIds.contains(source.id) &&
@ -184,7 +186,7 @@ void checkIfSourceIsObsolete(
if (source.isObsolete != isNowObsolete) {
source.isObsolete = isNowObsolete;
isar.sources.putSync(source);
await isar.sources.put(source);
ref
.read(synchingProvider(syncId: 1).notifier)