diff --git a/lib/eval/bridge/m_provider.dart b/lib/eval/bridge/m_provider.dart index b9a6005..ad769d1 100644 --- a/lib/eval/bridge/m_provider.dart +++ b/lib/eval/bridge/m_provider.dart @@ -32,6 +32,11 @@ class $MProvider extends MProvider with $Bridge { '': BridgeConstructorDef( BridgeFunctionDef(returns: BridgeTypeAnnotation($type))) }, + getters: { + 'supportsLatest': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), + )), + }, methods: { 'getLatestUpdates': BridgeMethodDef(BridgeFunctionDef( returns: BridgeTypeAnnotation( @@ -949,6 +954,9 @@ class $MProvider extends MProvider with $Bridge { throw UnimplementedError(); } + @override + bool get supportsLatest => $_get('supportsLatest'); + @override Future getDetail(MSource source, String url) async => await $_invoke('getDetail', [$MSource.wrap(source), $String(url)]); diff --git a/lib/eval/model/m_provider.dart b/lib/eval/model/m_provider.dart index f51976a..77e64f6 100644 --- a/lib/eval/model/m_provider.dart +++ b/lib/eval/model/m_provider.dart @@ -7,6 +7,8 @@ import 'package:mangayomi/models/video.dart'; abstract class MProvider { MProvider(); + bool get supportsLatest => true; + Future getLatestUpdates(MSource source, int page); Future getPopular(MSource source, int page); diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index e8a1d6e..c02c074 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -6,7 +6,7 @@ part of 'download_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$downloadChapterHash() => r'5d6f104706b7f29989ef52b67eccfb4142584777'; +String _$downloadChapterHash() => r'dcb0ade7f80a1ec593667e7311cdafc2d31222cf'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/home/manga_home_screen.dart b/lib/modules/manga/home/manga_home_screen.dart index 6fe6ece..6217d01 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -12,6 +12,7 @@ import 'package:mangayomi/services/get_filter_list.dart'; import 'package:mangayomi/services/get_latest_updates.dart'; import 'package:mangayomi/services/get_popular.dart'; import 'package:mangayomi/services/search.dart'; +import 'package:mangayomi/services/supports_latest.dart'; import 'package:mangayomi/utils/colors.dart'; import 'package:mangayomi/utils/media_query.dart'; import 'package:mangayomi/modules/library/widgets/search_text_form_field.dart'; @@ -103,6 +104,8 @@ class _MangaHomeScreenState extends ConsumerState { bool _isFiltering = false; @override Widget build(BuildContext context) { + final supportsLatest = + ref.watch(supportsLatestProvider(source: widget.source)); final filterList = getFilterList(source: widget.source); if (_selectedIndex == 2 && (_isSearch && _query.isNotEmpty) || _isFiltering) { @@ -196,6 +199,9 @@ class _MangaHomeScreenState extends ConsumerState { if (filterList.isEmpty && index == 2) { return const SizedBox.shrink(); } + if (!supportsLatest && index == 1) { + return const SizedBox.shrink(); + } return MangasCardSelector( icon: _types(context)[index].icon, selected: _selectedIndex == index, diff --git a/lib/modules/more/about/providers/check_for_update.g.dart b/lib/modules/more/about/providers/check_for_update.g.dart index e24d803..8b2c973 100644 --- a/lib/modules/more/about/providers/check_for_update.g.dart +++ b/lib/modules/more/about/providers/check_for_update.g.dart @@ -6,7 +6,7 @@ part of 'check_for_update.dart'; // RiverpodGenerator // ************************************************************************** -String _$checkForUpdateHash() => r'e32dea3bda782fc470006c1d3758b523629a091d'; +String _$checkForUpdateHash() => r'2c53166482e6584a6004d6788beb7d27d89bc67c'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_video_list.g.dart b/lib/services/get_video_list.g.dart index 95ababa..03c400c 100644 --- a/lib/services/get_video_list.g.dart +++ b/lib/services/get_video_list.g.dart @@ -6,7 +6,7 @@ part of 'get_video_list.dart'; // RiverpodGenerator // ************************************************************************** -String _$getVideoListHash() => r'aafdf726ba8dd830fea1f9a2784012258bf541bb'; +String _$getVideoListHash() => r'924c2961d148f9ebb0952239c0528d5269a4526a'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/supports_latest.dart b/lib/services/supports_latest.dart new file mode 100644 index 0000000..de4629d --- /dev/null +++ b/lib/services/supports_latest.dart @@ -0,0 +1,26 @@ +import 'package:mangayomi/eval/compiler/compiler.dart'; +import 'package:mangayomi/eval/model/m_provider.dart'; +import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/eval/runtime/runtime.dart'; +import 'package:mangayomi/sources/source_test.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'supports_latest.g.dart'; + +@riverpod +bool supportsLatest(SupportsLatestRef ref, {required Source source}) { + bool? supportsLatest; + + try { + final bytecode = + compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!); + + final runtime = runtimeEval(bytecode); + + var res = runtime.executeLib('package:mangayomi/main.dart', 'main'); + supportsLatest = (res as MProvider).supportsLatest; + } catch (e) { + supportsLatest = true; + } + + return supportsLatest; +} diff --git a/lib/services/supports_latest.g.dart b/lib/services/supports_latest.g.dart new file mode 100644 index 0000000..a10cc66 --- /dev/null +++ b/lib/services/supports_latest.g.dart @@ -0,0 +1,158 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'supports_latest.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$supportsLatestHash() => r'14d8db1a09da5467ba96f3d62a80fdd44d303b9c'; + +/// 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 [supportsLatest]. +@ProviderFor(supportsLatest) +const supportsLatestProvider = SupportsLatestFamily(); + +/// See also [supportsLatest]. +class SupportsLatestFamily extends Family { + /// See also [supportsLatest]. + const SupportsLatestFamily(); + + /// See also [supportsLatest]. + SupportsLatestProvider call({ + required Source source, + }) { + return SupportsLatestProvider( + source: source, + ); + } + + @override + SupportsLatestProvider getProviderOverride( + covariant SupportsLatestProvider provider, + ) { + return call( + source: provider.source, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'supportsLatestProvider'; +} + +/// See also [supportsLatest]. +class SupportsLatestProvider extends AutoDisposeProvider { + /// See also [supportsLatest]. + SupportsLatestProvider({ + required Source source, + }) : this._internal( + (ref) => supportsLatest( + ref as SupportsLatestRef, + source: source, + ), + from: supportsLatestProvider, + name: r'supportsLatestProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$supportsLatestHash, + dependencies: SupportsLatestFamily._dependencies, + allTransitiveDependencies: + SupportsLatestFamily._allTransitiveDependencies, + source: source, + ); + + SupportsLatestProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.source, + }) : super.internal(); + + final Source source; + + @override + Override overrideWith( + bool Function(SupportsLatestRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: SupportsLatestProvider._internal( + (ref) => create(ref as SupportsLatestRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + source: source, + ), + ); + } + + @override + AutoDisposeProviderElement createElement() { + return _SupportsLatestProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is SupportsLatestProvider && other.source == source; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, source.hashCode); + + return _SystemHash.finish(hash); + } +} + +mixin SupportsLatestRef on AutoDisposeProviderRef { + /// The parameter `source` of this provider. + Source get source; +} + +class _SupportsLatestProviderElement extends AutoDisposeProviderElement + with SupportsLatestRef { + _SupportsLatestProviderElement(super.provider); + + @override + Source get source => (origin as SupportsLatestProvider).source; +} +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member