diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index 6ba3f7b..8788bb7 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -99,6 +99,13 @@ class $MProvider extends MProvider with $Bridge { BridgeParameter('url', BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), ])), + 'getHtmlContent': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef( + CoreTypes.future, [BridgeTypeRef(CoreTypes.string)])), + params: [ + BridgeParameter('url', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ])), 'getFilterList': BridgeMethodDef(BridgeFunctionDef( returns: BridgeTypeAnnotation(BridgeTypeRef( CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])), @@ -1140,6 +1147,10 @@ class $MProvider extends MProvider with $Bridge { return list.map((e) => (e is $Value ? e.$reified : e) as Video).toList(); } + @override + Future getHtmlContent(String url) async => + await $_invoke('getHtmlContent', [$String(url)]); + @override Map get headers { try { diff --git a/lib/eval/dart/service.dart b/lib/eval/dart/service.dart index 56c3493..ad8f6b6 100644 --- a/lib/eval/dart/service.dart +++ b/lib/eval/dart/service.dart @@ -115,6 +115,11 @@ class DartExtensionService implements ExtensionService { return await _executeLib().getVideoList(url); } + @override + Future getHtmlContent(String url) async { + return await _executeLib().getHtmlContent(url); + } + @override FilterList getFilterList() { List list; diff --git a/lib/eval/interface.dart b/lib/eval/interface.dart index 441487d..f196164 100644 --- a/lib/eval/interface.dart +++ b/lib/eval/interface.dart @@ -29,6 +29,8 @@ abstract interface class ExtensionService { Future> getVideoList(String url); + Future getHtmlContent(String url); + FilterList getFilterList(); List getSourcePreferences(); diff --git a/lib/eval/javascript/service.dart b/lib/eval/javascript/service.dart index 7435d80..9f10b87 100644 --- a/lib/eval/javascript/service.dart +++ b/lib/eval/javascript/service.dart @@ -60,6 +60,9 @@ class MProvider { async getVideoList(url) { throw new Error("getVideoList not implemented"); } + async getHtmlContent(url) { + throw new Error("getHtmlContent not implemented"); + } getFilterList() { throw new Error("getFilterList not implemented"); } @@ -135,6 +138,15 @@ var extention = new DefaultExtension(); .toList(); } + @override + Future getHtmlContent(String url) async { + _init(); + final res = (await runtime.handlePromise(await runtime.evaluateAsync( + 'jsonStringify(() => extention.getHtmlContent(`$url`))'))) + .stringResult; + return res; + } + @override FilterList getFilterList() { List list; diff --git a/lib/eval/model/m_provider.dart b/lib/eval/model/m_provider.dart index 88ead25..b7a0378 100644 --- a/lib/eval/model/m_provider.dart +++ b/lib/eval/model/m_provider.dart @@ -24,6 +24,8 @@ abstract class MProvider { Future> getVideoList(String url); + Future getHtmlContent(String url); + List getFilterList(); List getSourcePreferences(); diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index fdee110..2769cd6 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -223,6 +223,7 @@ "anime_sources": "Anime-Quellen", "anime_extensions": "Anime-Erweiterungen", "manga_extensions": "Manga-Erweiterungen", + "novel": "Novel", "anime": "Anime", "manga": "Manga", "library_no_category_exist": "Du hast noch keine Kategorien", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 17633e0..d2998d0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -215,16 +215,22 @@ "sync_confirm_download": "A full download will completely replace your current data with the remote one!", "dialog_confirm": "Confirm", "description": "Description", + "hide_manga": "Hide some elements related to mangas.", + "hide_anime": "Hide some elements related to animes.", + "hide_novel": "Hide some elements related to (light) novels.", "full_screen_player": "Use Fullscreen", "full_screen_player_info": "Automatically use fullscreen when playing a video.", "episode_progress": "Progress: {n}", "n_episodes": "{n} episodes", "manga_sources": "Manga Sources", "anime_sources": "Anime Sources", + "novel_sources": "Novel Sources", "anime_extensions": "Anime Extensions", "manga_extensions": "Manga Extensions", + "novel_extensions": "Novel Extensions", "anime": "Anime", "manga": "Manga", + "novel": "Novel", "library_no_category_exist": "You don't have any categories yet", "watching": "Watching", "plan_to_watch": "Plan to watch", diff --git a/lib/main.dart b/lib/main.dart index dcb5051..e88e328 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,8 +18,6 @@ import 'package:mangayomi/modules/more/settings/appearance/providers/blend_level import 'package:mangayomi/modules/more/settings/appearance/providers/flex_scheme_color_state_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:mangayomi/src/rust/frb_generated.dart'; import 'package:media_kit/media_kit.dart'; @@ -82,10 +80,6 @@ class _MyAppState extends ConsumerState { @override Widget build(BuildContext context) { - final syncOnAppLaunch = ref.watch(syncOnAppLaunchStateProvider); - if (syncOnAppLaunch) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); - } final isDarkTheme = ref.watch(themeModeStateProvider); final blendLevel = ref.watch(blendLevelStateProvider); final appFontFamily = ref.watch(appFontFamilyProvider); diff --git a/lib/models/category.dart b/lib/models/category.dart index fddee08..4d4d05c 100644 --- a/lib/models/category.dart +++ b/lib/models/category.dart @@ -1,4 +1,5 @@ import 'package:isar/isar.dart'; +import 'package:mangayomi/models/manga.dart'; part 'category.g.dart'; @collection @@ -7,17 +8,30 @@ class Category { Id? id; String? name; bool? forManga; + @enumerated + late ItemType forItemType; Category( {this.id = Isar.autoIncrement, required this.name, - required this.forManga}); + this.forManga = true, + required this.forItemType}); Category.fromJson(Map json) { id = json['id']; name = json['name']; - forManga = json['forManga']; + forItemType = ItemType.values[json['forItemType'] ?? 0]; + } + + Category.fromJsonV1(Map json) { + id = json['id']; + name = json['name']; + forItemType = json['forManga'] is bool + ? json['forManga'] == true + ? ItemType.manga + : ItemType.anime + : ItemType.manga; } Map toJson() => - {'id': id, 'name': name, 'forManga': forManga}; + {'id': id, 'name': name, 'forItemType': forItemType.index}; } diff --git a/lib/models/category.g.dart b/lib/models/category.g.dart index ab1f0ee..c95018a 100644 --- a/lib/models/category.g.dart +++ b/lib/models/category.g.dart @@ -17,13 +17,19 @@ const CategorySchema = CollectionSchema( name: r'Category', id: 5751694338128944171, properties: { - r'forManga': PropertySchema( + r'forItemType': PropertySchema( id: 0, + name: r'forItemType', + type: IsarType.byte, + enumMap: _CategoryforItemTypeEnumValueMap, + ), + r'forManga': PropertySchema( + id: 1, name: r'forManga', type: IsarType.bool, ), r'name': PropertySchema( - id: 1, + id: 2, name: r'name', type: IsarType.string, ) @@ -63,8 +69,9 @@ void _categorySerialize( List offsets, Map> allOffsets, ) { - writer.writeBool(offsets[0], object.forManga); - writer.writeString(offsets[1], object.name); + writer.writeByte(offsets[0], object.forItemType.index); + writer.writeBool(offsets[1], object.forManga); + writer.writeString(offsets[2], object.name); } Category _categoryDeserialize( @@ -74,9 +81,12 @@ Category _categoryDeserialize( Map> allOffsets, ) { final object = Category( - forManga: reader.readBoolOrNull(offsets[0]), + forItemType: + _CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ?? + ItemType.manga, + forManga: reader.readBoolOrNull(offsets[1]), id: id, - name: reader.readStringOrNull(offsets[1]), + name: reader.readStringOrNull(offsets[2]), ); return object; } @@ -89,14 +99,28 @@ P _categoryDeserializeProp

( ) { switch (propertyId) { case 0: - return (reader.readBoolOrNull(offset)) as P; + return (_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 1: + return (reader.readBoolOrNull(offset)) as P; + case 2: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } } +const _CategoryforItemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _CategoryforItemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; + Id _categoryGetId(Category object) { return object.id ?? Isar.autoIncrement; } @@ -186,6 +210,60 @@ extension CategoryQueryWhere on QueryBuilder { extension CategoryQueryFilter on QueryBuilder { + QueryBuilder forItemTypeEqualTo( + ItemType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'forItemType', + value: value, + )); + }); + } + + QueryBuilder + forItemTypeGreaterThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'forItemType', + value: value, + )); + }); + } + + QueryBuilder forItemTypeLessThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'forItemType', + value: value, + )); + }); + } + + QueryBuilder forItemTypeBetween( + ItemType lower, + ItemType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'forItemType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder forMangaIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -434,6 +512,18 @@ extension CategoryQueryLinks on QueryBuilder {} extension CategoryQuerySortBy on QueryBuilder { + QueryBuilder sortByForItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forItemType', Sort.asc); + }); + } + + QueryBuilder sortByForItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forItemType', Sort.desc); + }); + } + QueryBuilder sortByForManga() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'forManga', Sort.asc); @@ -461,6 +551,18 @@ extension CategoryQuerySortBy on QueryBuilder { extension CategoryQuerySortThenBy on QueryBuilder { + QueryBuilder thenByForItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forItemType', Sort.asc); + }); + } + + QueryBuilder thenByForItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forItemType', Sort.desc); + }); + } + QueryBuilder thenByForManga() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'forManga', Sort.asc); @@ -500,6 +602,12 @@ extension CategoryQuerySortThenBy extension CategoryQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByForItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'forItemType'); + }); + } + QueryBuilder distinctByForManga() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'forManga'); @@ -522,6 +630,12 @@ extension CategoryQueryProperty }); } + QueryBuilder forItemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'forItemType'); + }); + } + QueryBuilder forMangaProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'forManga'); diff --git a/lib/models/changed_items.dart b/lib/models/changed_items.dart deleted file mode 100644 index 60555df..0000000 --- a/lib/models/changed_items.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'package:isar/isar.dart'; -part 'changed_items.g.dart'; - -@collection -@Name("Changed Items") -class ChangedItems { - Id? id; - List? deletedMangas; - List? updatedChapters; - List? deletedCategories; - ChangedItems( - {this.id = Isar.autoIncrement, - this.deletedMangas = const [], - this.updatedChapters = const [], - this.deletedCategories = const []}); - - ChangedItems.fromJson(Map json) { - id = json['id']; - deletedMangas = json['deletedMangas']; - updatedChapters = json['updatedChapters']; - deletedCategories = json['deletedCategories']; - } - - Map toJson() => { - 'id': id, - 'deletedMangas': deletedMangas, - 'updatedChapters': updatedChapters, - 'deletedCategories': deletedCategories - }; -} - -@embedded -class DeletedManga { - int? mangaId; - DeletedManga({this.mangaId}); - DeletedManga.fromJson(Map json) { - mangaId = json['mangaId']; - } - - Map toJson() => {'mangaId': mangaId}; -} - -@embedded -class UpdatedChapter { - int? chapterId; - int? mangaId; - bool? isBookmarked; - bool? isRead; - String? lastPageRead; - bool? deleted; - UpdatedChapter( - {this.chapterId, - this.mangaId, - this.isBookmarked, - this.isRead, - this.lastPageRead, - this.deleted}); - UpdatedChapter.fromJson(Map json) { - chapterId = json['chapterId']; - mangaId = json['mangaId']; - isBookmarked = json['isBookmarked']; - isRead = json['isRead']; - lastPageRead = json['lastPageRead']; - deleted = json['deleted']; - } - - Map toJson() => { - 'chapterId': chapterId, - 'mangaId': mangaId, - 'isBookmarked': isBookmarked, - 'isRead': isRead, - 'lastPageRead': lastPageRead, - 'deleted': deleted - }; -} - -@embedded -class DeletedCategory { - int? categoryId; - DeletedCategory({this.categoryId}); - DeletedCategory.fromJson(Map json) { - categoryId = json['categoryId']; - } - - Map toJson() => {'categoryId': categoryId}; -} diff --git a/lib/models/changed_items.g.dart b/lib/models/changed_items.g.dart deleted file mode 100644 index 16a1754..0000000 --- a/lib/models/changed_items.g.dart +++ /dev/null @@ -1,1555 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'changed_items.dart'; - -// ************************************************************************** -// IsarCollectionGenerator -// ************************************************************************** - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -extension GetChangedItemsCollection on Isar { - IsarCollection get changedItems => this.collection(); -} - -const ChangedItemsSchema = CollectionSchema( - name: r'Changed Items', - id: 5738738771983667580, - properties: { - r'deletedCategories': PropertySchema( - id: 0, - name: r'deletedCategories', - type: IsarType.objectList, - target: r'DeletedCategory', - ), - r'deletedMangas': PropertySchema( - id: 1, - name: r'deletedMangas', - type: IsarType.objectList, - target: r'DeletedManga', - ), - r'updatedChapters': PropertySchema( - id: 2, - name: r'updatedChapters', - type: IsarType.objectList, - target: r'UpdatedChapter', - ) - }, - estimateSize: _changedItemsEstimateSize, - serialize: _changedItemsSerialize, - deserialize: _changedItemsDeserialize, - deserializeProp: _changedItemsDeserializeProp, - idName: r'id', - indexes: {}, - links: {}, - embeddedSchemas: { - r'DeletedManga': DeletedMangaSchema, - r'UpdatedChapter': UpdatedChapterSchema, - r'DeletedCategory': DeletedCategorySchema - }, - getId: _changedItemsGetId, - getLinks: _changedItemsGetLinks, - attach: _changedItemsAttach, - version: '3.1.0+1', -); - -int _changedItemsEstimateSize( - ChangedItems object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - { - final list = object.deletedCategories; - if (list != null) { - bytesCount += 3 + list.length * 3; - { - final offsets = allOffsets[DeletedCategory]!; - for (var i = 0; i < list.length; i++) { - final value = list[i]; - bytesCount += - DeletedCategorySchema.estimateSize(value, offsets, allOffsets); - } - } - } - } - { - final list = object.deletedMangas; - if (list != null) { - bytesCount += 3 + list.length * 3; - { - final offsets = allOffsets[DeletedManga]!; - for (var i = 0; i < list.length; i++) { - final value = list[i]; - bytesCount += - DeletedMangaSchema.estimateSize(value, offsets, allOffsets); - } - } - } - } - { - final list = object.updatedChapters; - if (list != null) { - bytesCount += 3 + list.length * 3; - { - final offsets = allOffsets[UpdatedChapter]!; - for (var i = 0; i < list.length; i++) { - final value = list[i]; - bytesCount += - UpdatedChapterSchema.estimateSize(value, offsets, allOffsets); - } - } - } - } - return bytesCount; -} - -void _changedItemsSerialize( - ChangedItems object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeObjectList( - offsets[0], - allOffsets, - DeletedCategorySchema.serialize, - object.deletedCategories, - ); - writer.writeObjectList( - offsets[1], - allOffsets, - DeletedMangaSchema.serialize, - object.deletedMangas, - ); - writer.writeObjectList( - offsets[2], - allOffsets, - UpdatedChapterSchema.serialize, - object.updatedChapters, - ); -} - -ChangedItems _changedItemsDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = ChangedItems( - deletedCategories: reader.readObjectList( - offsets[0], - DeletedCategorySchema.deserialize, - allOffsets, - DeletedCategory(), - ), - deletedMangas: reader.readObjectList( - offsets[1], - DeletedMangaSchema.deserialize, - allOffsets, - DeletedManga(), - ), - id: id, - updatedChapters: reader.readObjectList( - offsets[2], - UpdatedChapterSchema.deserialize, - allOffsets, - UpdatedChapter(), - ), - ); - return object; -} - -P _changedItemsDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readObjectList( - offset, - DeletedCategorySchema.deserialize, - allOffsets, - DeletedCategory(), - )) as P; - case 1: - return (reader.readObjectList( - offset, - DeletedMangaSchema.deserialize, - allOffsets, - DeletedManga(), - )) as P; - case 2: - return (reader.readObjectList( - offset, - UpdatedChapterSchema.deserialize, - allOffsets, - UpdatedChapter(), - )) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -Id _changedItemsGetId(ChangedItems object) { - return object.id ?? Isar.autoIncrement; -} - -List> _changedItemsGetLinks(ChangedItems object) { - return []; -} - -void _changedItemsAttach( - IsarCollection col, Id id, ChangedItems object) { - object.id = id; -} - -extension ChangedItemsQueryWhereSort - on QueryBuilder { - QueryBuilder anyId() { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause(const IdWhereClause.any()); - }); - } -} - -extension ChangedItemsQueryWhere - on QueryBuilder { - QueryBuilder idEqualTo(Id id) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: id, - upper: id, - )); - }); - } - - QueryBuilder idNotEqualTo( - Id id) { - return QueryBuilder.apply(this, (query) { - if (query.whereSort == Sort.asc) { - return query - .addWhereClause( - IdWhereClause.lessThan(upper: id, includeUpper: false), - ) - .addWhereClause( - IdWhereClause.greaterThan(lower: id, includeLower: false), - ); - } else { - return query - .addWhereClause( - IdWhereClause.greaterThan(lower: id, includeLower: false), - ) - .addWhereClause( - IdWhereClause.lessThan(upper: id, includeUpper: false), - ); - } - }); - } - - QueryBuilder idGreaterThan( - Id id, - {bool include = false}) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause( - IdWhereClause.greaterThan(lower: id, includeLower: include), - ); - }); - } - - QueryBuilder idLessThan(Id id, - {bool include = false}) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause( - IdWhereClause.lessThan(upper: id, includeUpper: include), - ); - }); - } - - QueryBuilder idBetween( - Id lowerId, - Id upperId, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: lowerId, - includeLower: includeLower, - upper: upperId, - includeUpper: includeUpper, - )); - }); - } -} - -extension ChangedItemsQueryFilter - on QueryBuilder { - QueryBuilder - deletedCategoriesIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'deletedCategories', - )); - }); - } - - QueryBuilder - deletedCategoriesIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'deletedCategories', - )); - }); - } - - QueryBuilder - deletedCategoriesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - length, - true, - length, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - 0, - true, - 0, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - 0, - false, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesLengthLessThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - 0, - true, - length, - include, - ); - }); - } - - QueryBuilder - deletedCategoriesLengthGreaterThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - length, - include, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - lower, - includeLower, - upper, - includeUpper, - ); - }); - } - - QueryBuilder - deletedMangasIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'deletedMangas', - )); - }); - } - - QueryBuilder - deletedMangasIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'deletedMangas', - )); - }); - } - - QueryBuilder - deletedMangasLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - length, - true, - length, - true, - ); - }); - } - - QueryBuilder - deletedMangasIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - 0, - true, - 0, - true, - ); - }); - } - - QueryBuilder - deletedMangasIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - 0, - false, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedMangasLengthLessThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - 0, - true, - length, - include, - ); - }); - } - - QueryBuilder - deletedMangasLengthGreaterThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - length, - include, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedMangasLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - lower, - includeLower, - upper, - includeUpper, - ); - }); - } - - QueryBuilder idIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'id', - )); - }); - } - - QueryBuilder - idIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'id', - )); - }); - } - - QueryBuilder idEqualTo( - Id? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'id', - value: value, - )); - }); - } - - QueryBuilder idGreaterThan( - Id? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'id', - value: value, - )); - }); - } - - QueryBuilder idLessThan( - Id? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'id', - value: value, - )); - }); - } - - QueryBuilder idBetween( - Id? lower, - Id? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'id', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } - - QueryBuilder - updatedChaptersIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'updatedChapters', - )); - }); - } - - QueryBuilder - updatedChaptersIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'updatedChapters', - )); - }); - } - - QueryBuilder - updatedChaptersLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - length, - true, - length, - true, - ); - }); - } - - QueryBuilder - updatedChaptersIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - 0, - true, - 0, - true, - ); - }); - } - - QueryBuilder - updatedChaptersIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - 0, - false, - 999999, - true, - ); - }); - } - - QueryBuilder - updatedChaptersLengthLessThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - 0, - true, - length, - include, - ); - }); - } - - QueryBuilder - updatedChaptersLengthGreaterThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - length, - include, - 999999, - true, - ); - }); - } - - QueryBuilder - updatedChaptersLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - lower, - includeLower, - upper, - includeUpper, - ); - }); - } -} - -extension ChangedItemsQueryObject - on QueryBuilder { - QueryBuilder - deletedCategoriesElement(FilterQuery q) { - return QueryBuilder.apply(this, (query) { - return query.object(q, r'deletedCategories'); - }); - } - - QueryBuilder - deletedMangasElement(FilterQuery q) { - return QueryBuilder.apply(this, (query) { - return query.object(q, r'deletedMangas'); - }); - } - - QueryBuilder - updatedChaptersElement(FilterQuery q) { - return QueryBuilder.apply(this, (query) { - return query.object(q, r'updatedChapters'); - }); - } -} - -extension ChangedItemsQueryLinks - on QueryBuilder {} - -extension ChangedItemsQuerySortBy - on QueryBuilder {} - -extension ChangedItemsQuerySortThenBy - on QueryBuilder { - QueryBuilder thenById() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'id', Sort.asc); - }); - } - - QueryBuilder thenByIdDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'id', Sort.desc); - }); - } -} - -extension ChangedItemsQueryWhereDistinct - on QueryBuilder {} - -extension ChangedItemsQueryProperty - on QueryBuilder { - QueryBuilder idProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'id'); - }); - } - - QueryBuilder?, QQueryOperations> - deletedCategoriesProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'deletedCategories'); - }); - } - - QueryBuilder?, QQueryOperations> - deletedMangasProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'deletedMangas'); - }); - } - - QueryBuilder?, QQueryOperations> - updatedChaptersProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'updatedChapters'); - }); - } -} - -// ************************************************************************** -// IsarEmbeddedGenerator -// ************************************************************************** - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -const DeletedMangaSchema = Schema( - name: r'DeletedManga', - id: -4943524126252993118, - properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ) - }, - estimateSize: _deletedMangaEstimateSize, - serialize: _deletedMangaSerialize, - deserialize: _deletedMangaDeserialize, - deserializeProp: _deletedMangaDeserializeProp, -); - -int _deletedMangaEstimateSize( - DeletedManga object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - return bytesCount; -} - -void _deletedMangaSerialize( - DeletedManga object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeLong(offsets[0], object.mangaId); -} - -DeletedManga _deletedMangaDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = DeletedManga( - mangaId: reader.readLongOrNull(offsets[0]), - ); - return object; -} - -P _deletedMangaDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readLongOrNull(offset)) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -extension DeletedMangaQueryFilter - on QueryBuilder { - QueryBuilder - mangaIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mangaId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } -} - -extension DeletedMangaQueryObject - on QueryBuilder {} - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -const UpdatedChapterSchema = Schema( - name: r'UpdatedChapter', - id: -1728004238049586930, - properties: { - r'chapterId': PropertySchema( - id: 0, - name: r'chapterId', - type: IsarType.long, - ), - r'deleted': PropertySchema( - id: 1, - name: r'deleted', - type: IsarType.bool, - ), - r'isBookmarked': PropertySchema( - id: 2, - name: r'isBookmarked', - type: IsarType.bool, - ), - r'isRead': PropertySchema( - id: 3, - name: r'isRead', - type: IsarType.bool, - ), - r'lastPageRead': PropertySchema( - id: 4, - name: r'lastPageRead', - type: IsarType.string, - ), - r'mangaId': PropertySchema( - id: 5, - name: r'mangaId', - type: IsarType.long, - ) - }, - estimateSize: _updatedChapterEstimateSize, - serialize: _updatedChapterSerialize, - deserialize: _updatedChapterDeserialize, - deserializeProp: _updatedChapterDeserializeProp, -); - -int _updatedChapterEstimateSize( - UpdatedChapter object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - { - final value = object.lastPageRead; - if (value != null) { - bytesCount += 3 + value.length * 3; - } - } - return bytesCount; -} - -void _updatedChapterSerialize( - UpdatedChapter object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeLong(offsets[0], object.chapterId); - writer.writeBool(offsets[1], object.deleted); - writer.writeBool(offsets[2], object.isBookmarked); - writer.writeBool(offsets[3], object.isRead); - writer.writeString(offsets[4], object.lastPageRead); - writer.writeLong(offsets[5], object.mangaId); -} - -UpdatedChapter _updatedChapterDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = UpdatedChapter( - chapterId: reader.readLongOrNull(offsets[0]), - deleted: reader.readBoolOrNull(offsets[1]), - isBookmarked: reader.readBoolOrNull(offsets[2]), - isRead: reader.readBoolOrNull(offsets[3]), - lastPageRead: reader.readStringOrNull(offsets[4]), - mangaId: reader.readLongOrNull(offsets[5]), - ); - return object; -} - -P _updatedChapterDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readLongOrNull(offset)) as P; - case 1: - return (reader.readBoolOrNull(offset)) as P; - case 2: - return (reader.readBoolOrNull(offset)) as P; - case 3: - return (reader.readBoolOrNull(offset)) as P; - case 4: - return (reader.readStringOrNull(offset)) as P; - case 5: - return (reader.readLongOrNull(offset)) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -extension UpdatedChapterQueryFilter - on QueryBuilder { - QueryBuilder - chapterIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterId', - )); - }); - } - - QueryBuilder - chapterIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterId', - )); - }); - } - - QueryBuilder - chapterIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'chapterId', - value: value, - )); - }); - } - - QueryBuilder - chapterIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'chapterId', - value: value, - )); - }); - } - - QueryBuilder - chapterIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'chapterId', - value: value, - )); - }); - } - - QueryBuilder - chapterIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'chapterId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } - - QueryBuilder - deletedIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'deleted', - )); - }); - } - - QueryBuilder - deletedIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'deleted', - )); - }); - } - - QueryBuilder - deletedEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'deleted', - value: value, - )); - }); - } - - QueryBuilder - isBookmarkedIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isBookmarked', - )); - }); - } - - QueryBuilder - isBookmarkedIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isBookmarked', - )); - }); - } - - QueryBuilder - isBookmarkedEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isBookmarked', - value: value, - )); - }); - } - - QueryBuilder - isReadIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isRead', - )); - }); - } - - QueryBuilder - isReadIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isRead', - )); - }); - } - - QueryBuilder - isReadEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isRead', - value: value, - )); - }); - } - - QueryBuilder - lastPageReadIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastPageRead', - )); - }); - } - - QueryBuilder - lastPageReadIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastPageRead', - )); - }); - } - - QueryBuilder - lastPageReadEqualTo( - String? value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadGreaterThan( - String? value, { - bool include = false, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadLessThan( - String? value, { - bool include = false, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadBetween( - String? lower, - String? upper, { - bool includeLower = true, - bool includeUpper = true, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastPageRead', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'lastPageRead', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastPageRead', - value: '', - )); - }); - } - - QueryBuilder - lastPageReadIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'lastPageRead', - value: '', - )); - }); - } - - QueryBuilder - mangaIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mangaId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } -} - -extension UpdatedChapterQueryObject - on QueryBuilder {} - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -const DeletedCategorySchema = Schema( - name: r'DeletedCategory', - id: -2357965502277606786, - properties: { - r'categoryId': PropertySchema( - id: 0, - name: r'categoryId', - type: IsarType.long, - ) - }, - estimateSize: _deletedCategoryEstimateSize, - serialize: _deletedCategorySerialize, - deserialize: _deletedCategoryDeserialize, - deserializeProp: _deletedCategoryDeserializeProp, -); - -int _deletedCategoryEstimateSize( - DeletedCategory object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - return bytesCount; -} - -void _deletedCategorySerialize( - DeletedCategory object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeLong(offsets[0], object.categoryId); -} - -DeletedCategory _deletedCategoryDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = DeletedCategory( - categoryId: reader.readLongOrNull(offsets[0]), - ); - return object; -} - -P _deletedCategoryDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readLongOrNull(offset)) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -extension DeletedCategoryQueryFilter - on QueryBuilder { - QueryBuilder - categoryIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'categoryId', - )); - }); - } - - QueryBuilder - categoryIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'categoryId', - )); - }); - } - - QueryBuilder - categoryIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'categoryId', - value: value, - )); - }); - } - - QueryBuilder - categoryIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'categoryId', - value: value, - )); - }); - } - - QueryBuilder - categoryIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'categoryId', - value: value, - )); - }); - } - - QueryBuilder - categoryIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'categoryId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } -} - -extension DeletedCategoryQueryObject - on QueryBuilder {} diff --git a/lib/models/history.dart b/lib/models/history.dart index 5bf3dc8..802dcd9 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -1,5 +1,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; part 'history.g.dart'; @collection @@ -13,13 +14,17 @@ class History { bool? isManga; + @enumerated + late ItemType itemType; + final chapter = IsarLink(); String? date; History({ this.id = Isar.autoIncrement, - required this.isManga, + this.isManga = true, + required this.itemType, required this.chapterId, required this.mangaId, required this.date, @@ -29,7 +34,19 @@ class History { chapterId = json['chapterId']; date = json['date']; id = json['id']; - isManga = json['isManga']; + itemType = ItemType.values[json['itemType'] ?? 0]; + mangaId = json['mangaId']; + } + + History.fromJsonV1(Map json) { + chapterId = json['chapterId']; + date = json['date']; + id = json['id']; + itemType = json['isManga'] is bool + ? json['isManga'] == true + ? ItemType.manga + : ItemType.anime + : ItemType.manga; mangaId = json['mangaId']; } @@ -37,7 +54,7 @@ class History { 'chapterId': chapterId, 'date': date, 'id': id, - 'isManga': isManga, + 'itemType': itemType.index, 'mangaId': mangaId }; } diff --git a/lib/models/history.g.dart b/lib/models/history.g.dart index c07edc7..dabe134 100644 --- a/lib/models/history.g.dart +++ b/lib/models/history.g.dart @@ -32,8 +32,14 @@ const HistorySchema = CollectionSchema( name: r'isManga', type: IsarType.bool, ), - r'mangaId': PropertySchema( + r'itemType': PropertySchema( id: 3, + name: r'itemType', + type: IsarType.byte, + enumMap: _HistoryitemTypeEnumValueMap, + ), + r'mangaId': PropertySchema( + id: 4, name: r'mangaId', type: IsarType.long, ) @@ -83,7 +89,8 @@ void _historySerialize( writer.writeLong(offsets[0], object.chapterId); writer.writeString(offsets[1], object.date); writer.writeBool(offsets[2], object.isManga); - writer.writeLong(offsets[3], object.mangaId); + writer.writeByte(offsets[3], object.itemType.index); + writer.writeLong(offsets[4], object.mangaId); } History _historyDeserialize( @@ -97,7 +104,9 @@ History _historyDeserialize( date: reader.readStringOrNull(offsets[1]), id: id, isManga: reader.readBoolOrNull(offsets[2]), - mangaId: reader.readLongOrNull(offsets[3]), + itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[3])] ?? + ItemType.manga, + mangaId: reader.readLongOrNull(offsets[4]), ); return object; } @@ -116,12 +125,26 @@ P _historyDeserializeProp

( case 2: return (reader.readBoolOrNull(offset)) as P; case 3: + return (_HistoryitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; + case 4: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } } +const _HistoryitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _HistoryitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; + Id _historyGetId(History object) { return object.id ?? Isar.autoIncrement; } @@ -521,6 +544,59 @@ extension HistoryQueryFilter }); } + QueryBuilder itemTypeEqualTo( + ItemType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeGreaterThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeLessThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeBetween( + ItemType lower, + ItemType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'itemType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder mangaIdIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -647,6 +723,18 @@ extension HistoryQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder sortByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder sortByMangaId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'mangaId', Sort.asc); @@ -710,6 +798,18 @@ extension HistoryQuerySortThenBy }); } + QueryBuilder thenByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder thenByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder thenByMangaId() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'mangaId', Sort.asc); @@ -744,6 +844,12 @@ extension HistoryQueryWhereDistinct }); } + QueryBuilder distinctByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'itemType'); + }); + } + QueryBuilder distinctByMangaId() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'mangaId'); @@ -777,6 +883,12 @@ extension HistoryQueryProperty }); } + QueryBuilder itemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'itemType'); + }); + } + QueryBuilder mangaIdProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'mangaId'); diff --git a/lib/models/manga.dart b/lib/models/manga.dart index 19b0593..4473cab 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -24,6 +24,9 @@ class Manga { bool? isManga; + @enumerated + late ItemType itemType; + List? genre; bool? favorite; @@ -63,6 +66,7 @@ class Manga { required this.status, required this.description, this.isManga = true, + this.itemType = ItemType.manga, this.dateAdded, this.lastUpdate, this.categories, @@ -83,7 +87,34 @@ class Manga { id = json['id']; imageUrl = json['imageUrl']; isLocalArchive = json['isLocalArchive']; - isManga = json['isManga']; + itemType = ItemType.values[json['itemType'] ?? 0]; + lang = json['lang']; + lastRead = json['lastRead']; + lastUpdate = json['lastUpdate']; + link = json['link']; + name = json['name']; + source = json['source']; + status = Status.values[json['status']]; + customCoverFromTracker = json['customCoverFromTracker']; + } + + Manga.fromJsonV1(Map json) { + author = json['author']; + artist = json['artist']; + categories = json['categories']?.cast(); + customCoverImage = json['customCoverImage']?.cast(); + dateAdded = json['dateAdded']; + description = json['description']; + favorite = json['favorite']!; + genre = json['genre']?.cast(); + id = json['id']; + imageUrl = json['imageUrl']; + isLocalArchive = json['isLocalArchive']; + itemType = json['isManga'] is bool + ? json['isManga'] == true + ? ItemType.manga + : ItemType.anime + : ItemType.manga; lang = json['lang']; lastRead = json['lastRead']; lastUpdate = json['lastUpdate']; @@ -106,7 +137,7 @@ class Manga { 'id': id, 'imageUrl': imageUrl, 'isLocalArchive': isLocalArchive, - 'isManga': isManga, + 'itemType': itemType.index, 'lang': lang, 'lastRead': lastRead, 'lastUpdate': lastUpdate, @@ -126,3 +157,5 @@ enum Status { onHiatus, publishingFinished } + +enum ItemType { manga, anime, novel } diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index 3b11ebd..19d099d 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -77,38 +77,44 @@ const MangaSchema = CollectionSchema( name: r'isManga', type: IsarType.bool, ), - r'lang': PropertySchema( + r'itemType': PropertySchema( id: 12, + name: r'itemType', + type: IsarType.byte, + enumMap: _MangaitemTypeEnumValueMap, + ), + r'lang': PropertySchema( + id: 13, name: r'lang', type: IsarType.string, ), r'lastRead': PropertySchema( - id: 13, + id: 14, name: r'lastRead', type: IsarType.long, ), r'lastUpdate': PropertySchema( - id: 14, + id: 15, name: r'lastUpdate', type: IsarType.long, ), r'link': PropertySchema( - id: 15, + id: 16, name: r'link', type: IsarType.string, ), r'name': PropertySchema( - id: 16, + id: 17, name: r'name', type: IsarType.string, ), r'source': PropertySchema( - id: 17, + id: 18, name: r'source', type: IsarType.string, ), r'status': PropertySchema( - id: 18, + id: 19, name: r'status', type: IsarType.byte, enumMap: _MangastatusEnumValueMap, @@ -241,13 +247,14 @@ void _mangaSerialize( writer.writeString(offsets[9], object.imageUrl); writer.writeBool(offsets[10], object.isLocalArchive); writer.writeBool(offsets[11], object.isManga); - writer.writeString(offsets[12], object.lang); - writer.writeLong(offsets[13], object.lastRead); - writer.writeLong(offsets[14], object.lastUpdate); - writer.writeString(offsets[15], object.link); - writer.writeString(offsets[16], object.name); - writer.writeString(offsets[17], object.source); - writer.writeByte(offsets[18], object.status.index); + writer.writeByte(offsets[12], object.itemType.index); + writer.writeString(offsets[13], object.lang); + writer.writeLong(offsets[14], object.lastRead); + writer.writeLong(offsets[15], object.lastUpdate); + writer.writeString(offsets[16], object.link); + writer.writeString(offsets[17], object.name); + writer.writeString(offsets[18], object.source); + writer.writeByte(offsets[19], object.status.index); } Manga _mangaDeserialize( @@ -270,13 +277,15 @@ Manga _mangaDeserialize( imageUrl: reader.readStringOrNull(offsets[9]), isLocalArchive: reader.readBoolOrNull(offsets[10]), isManga: reader.readBoolOrNull(offsets[11]), - lang: reader.readStringOrNull(offsets[12]), - lastRead: reader.readLongOrNull(offsets[13]), - lastUpdate: reader.readLongOrNull(offsets[14]), - link: reader.readStringOrNull(offsets[15]), - name: reader.readStringOrNull(offsets[16]), - source: reader.readStringOrNull(offsets[17]), - status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[18])] ?? + itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ?? + ItemType.manga, + lang: reader.readStringOrNull(offsets[13]), + lastRead: reader.readLongOrNull(offsets[14]), + lastUpdate: reader.readLongOrNull(offsets[15]), + link: reader.readStringOrNull(offsets[16]), + name: reader.readStringOrNull(offsets[17]), + source: reader.readStringOrNull(offsets[18]), + status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[19])] ?? Status.ongoing, ); return object; @@ -314,18 +323,21 @@ P _mangaDeserializeProp

( case 11: return (reader.readBoolOrNull(offset)) as P; case 12: - return (reader.readStringOrNull(offset)) as P; + return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 13: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 14: return (reader.readLongOrNull(offset)) as P; case 15: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 16: return (reader.readStringOrNull(offset)) as P; case 17: return (reader.readStringOrNull(offset)) as P; case 18: + return (reader.readStringOrNull(offset)) as P; + case 19: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? Status.ongoing) as P; default: @@ -333,6 +345,16 @@ P _mangaDeserializeProp

( } } +const _MangaitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _MangaitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; const _MangastatusEnumValueMap = { 'ongoing': 0, 'completed': 1, @@ -1937,6 +1959,59 @@ extension MangaQueryFilter on QueryBuilder { }); } + QueryBuilder itemTypeEqualTo( + ItemType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeGreaterThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeLessThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeBetween( + ItemType lower, + ItemType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'itemType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder langIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -2875,6 +2950,18 @@ extension MangaQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder sortByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder sortByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3081,6 +3168,18 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder thenByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder thenByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3245,6 +3344,12 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'itemType'); + }); + } + QueryBuilder distinctByLang( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -3372,6 +3477,12 @@ extension MangaQueryProperty on QueryBuilder { }); } + QueryBuilder itemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'itemType'); + }); + } + QueryBuilder langProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lang'); diff --git a/lib/models/settings.dart b/lib/models/settings.dart index bcbde56..4af1ade 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -135,10 +135,6 @@ class Settings { List? backupFrequencyOptions; - bool? syncOnAppLaunch; - - bool? syncAfterReading; - String? autoBackupLocation; bool? usePageTapZones; @@ -187,11 +183,44 @@ class Settings { int? animeGridSize; + int? novelGridSize; + @enumerated late SectionType disableSectionType; bool? useLibass; + int? libraryFilterNovelDownloadType; + + int? libraryFilterNovelUnreadType; + + int? libraryFilterNovelStartedType; + + int? libraryFilterNovelBookMarkedType; + + bool? novelLibraryShowCategoryTabs; + + bool? novelLibraryDownloadedChapters; + + bool? novelLibraryShowLanguage; + + bool? novelLibraryShowNumbersOfItems; + + bool? novelLibraryShowContinueReadingButton; + + bool? novelLibraryLocalSource; + + late SortLibraryManga? sortLibraryNovel; + + @enumerated + late DisplayType novelDisplayType; + + bool? hideManga; + + bool? hideAnime; + + bool? hideNovel; + Settings( {this.id = 227, this.displayType = DisplayType.compactGrid, @@ -249,8 +278,6 @@ class Settings { this.personalPageModeList, this.backupFrequency, this.backupFrequencyOptions, - this.syncOnAppLaunch, - this.syncAfterReading, this.autoBackupLocation, this.startDatebackup, this.usePageTapZones = true, @@ -276,7 +303,22 @@ class Settings { this.mangaGridSize, this.animeGridSize, this.disableSectionType = SectionType.all, - this.useLibass = true}); + this.useLibass = true, + this.libraryFilterNovelDownloadType = 0, + this.libraryFilterNovelUnreadType = 0, + this.libraryFilterNovelStartedType = 0, + this.libraryFilterNovelBookMarkedType = 0, + this.novelLibraryShowCategoryTabs = false, + this.novelLibraryDownloadedChapters = false, + this.novelLibraryShowLanguage = false, + this.novelLibraryShowNumbersOfItems = false, + this.novelLibraryShowContinueReadingButton = false, + this.novelLibraryLocalSource, + this.sortLibraryNovel, + this.novelDisplayType = DisplayType.comfortableGrid, + this.hideManga = false, + this.hideAnime = false, + this.hideNovel = false}); Settings.fromJson(Map json) { animatePageTransitions = json['animatePageTransitions']; @@ -397,8 +439,6 @@ class Settings { userAgent = json['userAgent']; backupFrequency = json['backupFrequency']; backupFrequencyOptions = json['backupFrequencyOptions']?.cast(); - syncOnAppLaunch = json['syncOnAppLaunch']; - syncAfterReading = json['syncAfterReading']; autoBackupLocation = json['autoBackupLocation']; startDatebackup = json['startDatebackup']; usePageTapZones = json['usePageTapZones']; @@ -432,6 +472,25 @@ class Settings { disableSectionType = SectionType.values[json['disableSectionType'] ?? SectionType.all]; useLibass = json['useLibass']; + libraryFilterNovelBookMarkedType = json['libraryFilterNovelBookMarkedType']; + libraryFilterNovelDownloadType = json['libraryFilterNovelDownloadType']; + libraryFilterNovelStartedType = json['libraryFilterNovelStartedType']; + libraryFilterNovelUnreadType = json['libraryFilterNovelUnreadType']; + novelLibraryShowCategoryTabs = json['novelLibraryShowCategoryTabs']; + novelLibraryDownloadedChapters = json['novelLibraryDownloadedChapters']; + novelLibraryShowLanguage = json['novelLibraryShowLanguage']; + novelLibraryShowNumbersOfItems = json['novelLibraryShowNumbersOfItems']; + novelLibraryShowContinueReadingButton = + json['novelLibraryShowContinueReadingButton']; + novelLibraryLocalSource = json['novelLibraryLocalSource']; + sortLibraryNovel = json['sortLibraryNovel'] != null + ? SortLibraryManga.fromJson(json['sortLibraryNovel']) + : null; + novelDisplayType = DisplayType + .values[json['novelDisplayType'] ?? DisplayType.compactGrid.index]; + hideManga = json['hideManga']; + hideAnime = json['hideAnime']; + hideNovel = json['hideNovel']; } Map toJson() => { @@ -504,8 +563,6 @@ class Settings { 'userAgent': userAgent, 'backupFrequency': backupFrequency, 'backupFrequencyOptions': backupFrequencyOptions, - 'syncOnAppLaunch': syncOnAppLaunch, - 'syncAfterReading': syncAfterReading, 'autoBackupLocation': autoBackupLocation, 'startDatebackup': startDatebackup, 'usePageTapZones': usePageTapZones, @@ -532,7 +589,23 @@ class Settings { 'mangaGridSize': mangaGridSize, 'animeGridSize': animeGridSize, 'disableSectionType': disableSectionType.index, - 'useLibass': useLibass + 'useLibass': useLibass, + 'libraryFilterNovelBookMarkedType': libraryFilterNovelBookMarkedType, + 'libraryFilterNovelDownloadType': libraryFilterNovelDownloadType, + 'libraryFilterNovelStartedType': libraryFilterNovelStartedType, + 'libraryFilterNovelUnreadType': libraryFilterNovelUnreadType, + 'novelLibraryShowCategoryTabs': novelLibraryShowCategoryTabs, + 'novelLibraryDownloadedChapters': novelLibraryDownloadedChapters, + 'novelLibraryShowLanguage': novelLibraryShowLanguage, + 'novelLibraryShowNumbersOfItems': novelLibraryShowNumbersOfItems, + 'novelLibraryShowContinueReadingButton': + novelLibraryShowContinueReadingButton, + 'novelLibraryLocalSource': novelLibraryLocalSource, + 'sortLibraryNovel': sortLibraryNovel?.toJson(), + 'novelDisplayType': novelDisplayType.index, + 'hideManga': hideManga, + 'hideAnime': hideAnime, + 'hideNovel': hideNovel }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index f33869b..62a3670 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -267,212 +267,284 @@ const SettingsSchema = CollectionSchema( name: r'fullScreenReader', type: IsarType.bool, ), - r'incognitoMode': PropertySchema( + r'hideAnime': PropertySchema( id: 47, + name: r'hideAnime', + type: IsarType.bool, + ), + r'hideManga': PropertySchema( + id: 48, + name: r'hideManga', + type: IsarType.bool, + ), + r'hideNovel': PropertySchema( + id: 49, + name: r'hideNovel', + type: IsarType.bool, + ), + r'incognitoMode': PropertySchema( + id: 50, name: r'incognitoMode', type: IsarType.bool, ), r'libraryDownloadedChapters': PropertySchema( - id: 48, + id: 51, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 49, + id: 52, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 50, + id: 53, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 51, + id: 54, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 52, + id: 55, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 53, + id: 56, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 54, + id: 57, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 55, + id: 58, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 56, + id: 59, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), + r'libraryFilterNovelBookMarkedType': PropertySchema( + id: 60, + name: r'libraryFilterNovelBookMarkedType', + type: IsarType.long, + ), + r'libraryFilterNovelDownloadType': PropertySchema( + id: 61, + name: r'libraryFilterNovelDownloadType', + type: IsarType.long, + ), + r'libraryFilterNovelStartedType': PropertySchema( + id: 62, + name: r'libraryFilterNovelStartedType', + type: IsarType.long, + ), + r'libraryFilterNovelUnreadType': PropertySchema( + id: 63, + name: r'libraryFilterNovelUnreadType', + type: IsarType.long, + ), r'libraryLocalSource': PropertySchema( - id: 57, + id: 64, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 58, + id: 65, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 59, + id: 66, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 60, + id: 67, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 61, + id: 68, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 62, + id: 69, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaGridSize': PropertySchema( - id: 63, + id: 70, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 64, + id: 71, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 65, + id: 72, name: r'markEpisodeAsSeenType', type: IsarType.long, ), + r'novelDisplayType': PropertySchema( + id: 73, + name: r'novelDisplayType', + type: IsarType.byte, + enumMap: _SettingsnovelDisplayTypeEnumValueMap, + ), + r'novelGridSize': PropertySchema( + id: 74, + name: r'novelGridSize', + type: IsarType.long, + ), + r'novelLibraryDownloadedChapters': PropertySchema( + id: 75, + name: r'novelLibraryDownloadedChapters', + type: IsarType.bool, + ), + r'novelLibraryLocalSource': PropertySchema( + id: 76, + name: r'novelLibraryLocalSource', + type: IsarType.bool, + ), + r'novelLibraryShowCategoryTabs': PropertySchema( + id: 77, + name: r'novelLibraryShowCategoryTabs', + type: IsarType.bool, + ), + r'novelLibraryShowContinueReadingButton': PropertySchema( + id: 78, + name: r'novelLibraryShowContinueReadingButton', + type: IsarType.bool, + ), + r'novelLibraryShowLanguage': PropertySchema( + id: 79, + name: r'novelLibraryShowLanguage', + type: IsarType.bool, + ), + r'novelLibraryShowNumbersOfItems': PropertySchema( + id: 80, + name: r'novelLibraryShowNumbersOfItems', + type: IsarType.bool, + ), r'onlyIncludePinnedSources': PropertySchema( - id: 66, + id: 81, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 67, + id: 82, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 68, + id: 83, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 69, + id: 84, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 70, + id: 85, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 71, + id: 86, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 72, + id: 87, name: r'relativeTimesTamps', type: IsarType.long, ), r'saveAsCBZArchive': PropertySchema( - id: 73, + id: 88, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 74, + id: 89, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 75, + id: 90, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 76, + id: 91, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 77, + id: 92, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 78, + id: 93, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), + r'sortLibraryNovel': PropertySchema( + id: 94, + name: r'sortLibraryNovel', + type: IsarType.object, + target: r'SortLibraryManga', + ), r'startDatebackup': PropertySchema( - id: 79, + id: 95, name: r'startDatebackup', type: IsarType.long, ), - r'syncAfterReading': PropertySchema( - id: 80, - name: r'syncAfterReading', - type: IsarType.bool, - ), - r'syncOnAppLaunch': PropertySchema( - id: 81, - name: r'syncOnAppLaunch', - type: IsarType.bool, - ), r'themeIsDark': PropertySchema( - id: 82, + id: 96, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 83, + id: 97, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 84, + id: 98, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 85, + id: 99, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 86, + id: 100, name: r'userAgent', type: IsarType.string, ) @@ -749,6 +821,14 @@ int _settingsEstimateSize( value, allOffsets[SortLibraryManga]!, allOffsets); } } + { + final value = object.sortLibraryNovel; + if (value != null) { + bytesCount += 3 + + SortLibraryMangaSchema.estimateSize( + value, allOffsets[SortLibraryManga]!, allOffsets); + } + } { final value = object.userAgent; if (value != null) { @@ -856,81 +936,100 @@ void _settingsSerialize( writer.writeLong(offsets[44], object.flexSchemeColorIndex); writer.writeBool(offsets[45], object.fullScreenPlayer); writer.writeBool(offsets[46], object.fullScreenReader); - writer.writeBool(offsets[47], object.incognitoMode); - writer.writeBool(offsets[48], object.libraryDownloadedChapters); - writer.writeLong(offsets[49], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[50], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[51], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[52], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[53], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[54], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[55], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[56], object.libraryFilterMangasUnreadType); - writer.writeBool(offsets[57], object.libraryLocalSource); - writer.writeBool(offsets[58], object.libraryShowCategoryTabs); - writer.writeBool(offsets[59], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[60], object.libraryShowLanguage); - writer.writeBool(offsets[61], object.libraryShowNumbersOfItems); + writer.writeBool(offsets[47], object.hideAnime); + writer.writeBool(offsets[48], object.hideManga); + writer.writeBool(offsets[49], object.hideNovel); + writer.writeBool(offsets[50], object.incognitoMode); + writer.writeBool(offsets[51], object.libraryDownloadedChapters); + writer.writeLong(offsets[52], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[53], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[54], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[55], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[56], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[57], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[58], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[59], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[60], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[61], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[62], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[63], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[64], object.libraryLocalSource); + writer.writeBool(offsets[65], object.libraryShowCategoryTabs); + writer.writeBool(offsets[66], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[67], object.libraryShowLanguage); + writer.writeBool(offsets[68], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[62], + offsets[69], allOffsets, L10nLocaleSchema.serialize, object.locale, ); - writer.writeLong(offsets[63], object.mangaGridSize); - writer.writeByte(offsets[64], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[65], object.markEpisodeAsSeenType); - writer.writeBool(offsets[66], object.onlyIncludePinnedSources); - writer.writeLong(offsets[67], object.pagePreloadAmount); + writer.writeLong(offsets[70], object.mangaGridSize); + writer.writeByte(offsets[71], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[72], object.markEpisodeAsSeenType); + writer.writeByte(offsets[73], object.novelDisplayType.index); + writer.writeLong(offsets[74], object.novelGridSize); + writer.writeBool(offsets[75], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[76], object.novelLibraryLocalSource); + writer.writeBool(offsets[77], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[78], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[79], object.novelLibraryShowLanguage); + writer.writeBool(offsets[80], object.novelLibraryShowNumbersOfItems); + writer.writeBool(offsets[81], object.onlyIncludePinnedSources); + writer.writeLong(offsets[82], object.pagePreloadAmount); writer.writeObjectList( - offsets[68], + offsets[83], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[69], + offsets[84], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[70], + offsets[85], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[71], object.pureBlackDarkMode); - writer.writeLong(offsets[72], object.relativeTimesTamps); - writer.writeBool(offsets[73], object.saveAsCBZArchive); - writer.writeByte(offsets[74], object.scaleType.index); - writer.writeBool(offsets[75], object.showPagesNumber); + writer.writeBool(offsets[86], object.pureBlackDarkMode); + writer.writeLong(offsets[87], object.relativeTimesTamps); + writer.writeBool(offsets[88], object.saveAsCBZArchive); + writer.writeByte(offsets[89], object.scaleType.index); + writer.writeBool(offsets[90], object.showPagesNumber); writer.writeObjectList( - offsets[76], + offsets[91], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[77], + offsets[92], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[78], + offsets[93], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); - writer.writeLong(offsets[79], object.startDatebackup); - writer.writeBool(offsets[80], object.syncAfterReading); - writer.writeBool(offsets[81], object.syncOnAppLaunch); - writer.writeBool(offsets[82], object.themeIsDark); - writer.writeBool(offsets[83], object.updateProgressAfterReading); - writer.writeBool(offsets[84], object.useLibass); - writer.writeBool(offsets[85], object.usePageTapZones); - writer.writeString(offsets[86], object.userAgent); + writer.writeObject( + offsets[94], + allOffsets, + SortLibraryMangaSchema.serialize, + object.sortLibraryNovel, + ); + writer.writeLong(offsets[95], object.startDatebackup); + writer.writeBool(offsets[96], object.themeIsDark); + writer.writeBool(offsets[97], object.updateProgressAfterReading); + writer.writeBool(offsets[98], object.useLibass); + writer.writeBool(offsets[99], object.usePageTapZones); + writer.writeString(offsets[100], object.userAgent); } Settings _settingsDeserialize( @@ -1025,77 +1124,96 @@ Settings _settingsDeserialize( flexSchemeColorIndex: reader.readLongOrNull(offsets[44]), fullScreenPlayer: reader.readBoolOrNull(offsets[45]), fullScreenReader: reader.readBoolOrNull(offsets[46]), + hideAnime: reader.readBoolOrNull(offsets[47]), + hideManga: reader.readBoolOrNull(offsets[48]), + hideNovel: reader.readBoolOrNull(offsets[49]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[47]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[48]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[49]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[50]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[51]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[52]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[53]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[54]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[55]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[56]), - libraryLocalSource: reader.readBoolOrNull(offsets[57]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[58]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[59]), - libraryShowLanguage: reader.readBoolOrNull(offsets[60]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[61]), - mangaGridSize: reader.readLongOrNull(offsets[63]), + incognitoMode: reader.readBoolOrNull(offsets[50]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[51]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[52]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[53]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[54]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[55]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[56]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[57]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[58]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[59]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[60]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[61]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[62]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[63]), + libraryLocalSource: reader.readBoolOrNull(offsets[64]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[65]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[66]), + libraryShowLanguage: reader.readBoolOrNull(offsets[67]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[68]), + mangaGridSize: reader.readLongOrNull(offsets[70]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[64])] ?? + reader.readByteOrNull(offsets[71])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[65]), - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[66]), - pagePreloadAmount: reader.readLongOrNull(offsets[67]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[72]), + novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offsets[73])] ?? + DisplayType.comfortableGrid, + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[75]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[76]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[77]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[78]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[79]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[80]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[81]), + pagePreloadAmount: reader.readLongOrNull(offsets[82]), personalPageModeList: reader.readObjectList( - offsets[68], + offsets[83], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[69], + offsets[84], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[70], + offsets[85], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[71]), - relativeTimesTamps: reader.readLongOrNull(offsets[72]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[73]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[86]), + relativeTimesTamps: reader.readLongOrNull(offsets[87]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[88]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[74])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[89])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[75]), + showPagesNumber: reader.readBoolOrNull(offsets[90]), sortChapterList: reader.readObjectList( - offsets[76], + offsets[91], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[77], + offsets[92], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[78], + offsets[93], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[79]), - syncAfterReading: reader.readBoolOrNull(offsets[80]), - syncOnAppLaunch: reader.readBoolOrNull(offsets[81]), - themeIsDark: reader.readBoolOrNull(offsets[82]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[83]), - useLibass: reader.readBoolOrNull(offsets[84]), - usePageTapZones: reader.readBoolOrNull(offsets[85]), - userAgent: reader.readStringOrNull(offsets[86]), + sortLibraryNovel: reader.readObjectOrNull( + offsets[94], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), + startDatebackup: reader.readLongOrNull(offsets[95]), + themeIsDark: reader.readBoolOrNull(offsets[96]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[97]), + useLibass: reader.readBoolOrNull(offsets[98]), + usePageTapZones: reader.readBoolOrNull(offsets[99]), + userAgent: reader.readStringOrNull(offsets[100]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1117,10 +1235,11 @@ Settings _settingsDeserialize( FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[62], + offsets[69], L10nLocaleSchema.deserialize, allOffsets, ); + object.novelGridSize = reader.readLongOrNull(offsets[74]); return object; } @@ -1285,11 +1404,11 @@ P _settingsDeserializeProp

( case 48: return (reader.readBoolOrNull(offset)) as P; case 49: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 50: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 51: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 52: return (reader.readLongOrNull(offset)) as P; case 53: @@ -1301,98 +1420,132 @@ P _settingsDeserializeProp

( case 56: return (reader.readLongOrNull(offset)) as P; case 57: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 58: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 59: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 60: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 61: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 62: + return (reader.readLongOrNull(offset)) as P; + case 63: + return (reader.readLongOrNull(offset)) as P; + case 64: + return (reader.readBoolOrNull(offset)) as P; + case 65: + return (reader.readBoolOrNull(offset)) as P; + case 66: + return (reader.readBoolOrNull(offset)) as P; + case 67: + return (reader.readBoolOrNull(offset)) as P; + case 68: + return (reader.readBoolOrNull(offset)) as P; + case 69: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 63: + case 70: return (reader.readLongOrNull(offset)) as P; - case 64: + case 71: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 65: + case 72: return (reader.readLongOrNull(offset)) as P; - case 66: + case 73: + return (_SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + DisplayType.comfortableGrid) as P; + case 74: + return (reader.readLongOrNull(offset)) as P; + case 75: return (reader.readBoolOrNull(offset)) as P; - case 67: + case 76: + return (reader.readBoolOrNull(offset)) as P; + case 77: + return (reader.readBoolOrNull(offset)) as P; + case 78: + return (reader.readBoolOrNull(offset)) as P; + case 79: + return (reader.readBoolOrNull(offset)) as P; + case 80: + return (reader.readBoolOrNull(offset)) as P; + case 81: + return (reader.readBoolOrNull(offset)) as P; + case 82: return (reader.readLongOrNull(offset)) as P; - case 68: + case 83: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 69: + case 84: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 70: + case 85: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 71: + case 86: return (reader.readBoolOrNull(offset)) as P; - case 72: + case 87: return (reader.readLongOrNull(offset)) as P; - case 73: + case 88: return (reader.readBoolOrNull(offset)) as P; - case 74: + case 89: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 75: + case 90: return (reader.readBoolOrNull(offset)) as P; - case 76: + case 91: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 77: + case 92: return (reader.readObjectOrNull( offset, SortLibraryMangaSchema.deserialize, allOffsets, )) as P; - case 78: + case 93: return (reader.readObjectOrNull( offset, SortLibraryMangaSchema.deserialize, allOffsets, )) as P; - case 79: + case 94: + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; + case 95: return (reader.readLongOrNull(offset)) as P; - case 80: + case 96: return (reader.readBoolOrNull(offset)) as P; - case 81: + case 97: return (reader.readBoolOrNull(offset)) as P; - case 82: + case 98: return (reader.readBoolOrNull(offset)) as P; - case 83: + case 99: return (reader.readBoolOrNull(offset)) as P; - case 84: - return (reader.readBoolOrNull(offset)) as P; - case 85: - return (reader.readBoolOrNull(offset)) as P; - case 86: + case 100: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -1503,6 +1656,18 @@ const _SettingsmangaHomeDisplayTypeValueEnumMap = { 2: DisplayType.coverOnlyGrid, 3: DisplayType.list, }; +const _SettingsnovelDisplayTypeEnumValueMap = { + 'compactGrid': 0, + 'comfortableGrid': 1, + 'coverOnlyGrid': 2, + 'list': 3, +}; +const _SettingsnovelDisplayTypeValueEnumMap = { + 0: DisplayType.compactGrid, + 1: DisplayType.comfortableGrid, + 2: DisplayType.coverOnlyGrid, + 3: DisplayType.list, +}; const _SettingsscaleTypeEnumValueMap = { 'fitScreen': 0, 'stretch': 1, @@ -4943,6 +5108,84 @@ extension SettingsQueryFilter }); } + QueryBuilder hideAnimeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hideAnime', + )); + }); + } + + QueryBuilder hideAnimeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hideAnime', + )); + }); + } + + QueryBuilder hideAnimeEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hideAnime', + value: value, + )); + }); + } + + QueryBuilder hideMangaIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hideManga', + )); + }); + } + + QueryBuilder hideMangaIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hideManga', + )); + }); + } + + QueryBuilder hideMangaEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hideManga', + value: value, + )); + }); + } + + QueryBuilder hideNovelIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hideNovel', + )); + }); + } + + QueryBuilder hideNovelIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hideNovel', + )); + }); + } + + QueryBuilder hideNovelEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hideNovel', + value: value, + )); + }); + } + QueryBuilder idIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -5659,6 +5902,302 @@ extension SettingsQueryFilter }); } + QueryBuilder + libraryFilterNovelBookMarkedTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelBookMarkedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelBookMarkedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelBookMarkedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelBookMarkedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelBookMarkedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelBookMarkedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelDownloadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelDownloadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelDownloadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelDownloadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelDownloadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelDownloadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelStartedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelStartedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelStartedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelStartedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelStartedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelStartedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelUnreadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelUnreadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelUnreadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelUnreadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelUnreadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelUnreadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder libraryLocalSourceIsNull() { return QueryBuilder.apply(this, (query) { @@ -6017,6 +6556,302 @@ extension SettingsQueryFilter }); } + QueryBuilder + novelDisplayTypeEqualTo(DisplayType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelDisplayType', + value: value, + )); + }); + } + + QueryBuilder + novelDisplayTypeGreaterThan( + DisplayType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'novelDisplayType', + value: value, + )); + }); + } + + QueryBuilder + novelDisplayTypeLessThan( + DisplayType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'novelDisplayType', + value: value, + )); + }); + } + + QueryBuilder + novelDisplayTypeBetween( + DisplayType lower, + DisplayType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'novelDisplayType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + novelGridSizeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelGridSize', + )); + }); + } + + QueryBuilder + novelGridSizeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelGridSize', + )); + }); + } + + QueryBuilder novelGridSizeEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelGridSize', + value: value, + )); + }); + } + + QueryBuilder + novelGridSizeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'novelGridSize', + value: value, + )); + }); + } + + QueryBuilder novelGridSizeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'novelGridSize', + value: value, + )); + }); + } + + QueryBuilder novelGridSizeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'novelGridSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryDownloadedChapters', + )); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryDownloadedChapters', + )); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryDownloadedChapters', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryLocalSourceIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryLocalSource', + )); + }); + } + + QueryBuilder + novelLibraryLocalSourceIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryLocalSource', + )); + }); + } + + QueryBuilder + novelLibraryLocalSourceEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryLocalSource', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowCategoryTabs', + )); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowCategoryTabs', + )); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowCategoryTabs', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowContinueReadingButton', + )); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowContinueReadingButton', + )); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowContinueReadingButton', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowLanguageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowLanguage', + )); + }); + } + + QueryBuilder + novelLibraryShowLanguageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowLanguage', + )); + }); + } + + QueryBuilder + novelLibraryShowLanguageEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowLanguage', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowNumbersOfItems', + )); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowNumbersOfItems', + )); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowNumbersOfItems', + value: value, + )); + }); + } + QueryBuilder onlyIncludePinnedSourcesIsNull() { return QueryBuilder.apply(this, (query) { @@ -6705,6 +7540,24 @@ extension SettingsQueryFilter }); } + QueryBuilder + sortLibraryNovelIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'sortLibraryNovel', + )); + }); + } + + QueryBuilder + sortLibraryNovelIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'sortLibraryNovel', + )); + }); + } + QueryBuilder startDatebackupIsNull() { return QueryBuilder.apply(this, (query) { @@ -6779,62 +7632,6 @@ extension SettingsQueryFilter }); } - QueryBuilder - syncAfterReadingIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncAfterReading', - )); - }); - } - - QueryBuilder - syncAfterReadingIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncAfterReading', - )); - }); - } - - QueryBuilder - syncAfterReadingEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncAfterReading', - value: value, - )); - }); - } - - QueryBuilder - syncOnAppLaunchIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncOnAppLaunch', - )); - }); - } - - QueryBuilder - syncOnAppLaunchIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncOnAppLaunch', - )); - }); - } - - QueryBuilder - syncOnAppLaunchEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncOnAppLaunch', - value: value, - )); - }); - } - QueryBuilder themeIsDarkIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -7207,6 +8004,13 @@ extension SettingsQueryObject return query.object(q, r'sortLibraryManga'); }); } + + QueryBuilder sortLibraryNovel( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'sortLibraryNovel'); + }); + } } extension SettingsQueryLinks @@ -7750,6 +8554,42 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByHideAnime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.asc); + }); + } + + QueryBuilder sortByHideAnimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.desc); + }); + } + + QueryBuilder sortByHideManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.asc); + }); + } + + QueryBuilder sortByHideMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.desc); + }); + } + + QueryBuilder sortByHideNovel() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.asc); + }); + } + + QueryBuilder sortByHideNovelDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.desc); + }); + } + QueryBuilder sortByIncognitoMode() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'incognitoMode', Sort.asc); @@ -7888,6 +8728,62 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByLibraryFilterNovelBookMarkedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelBookMarkedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.desc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelDownloadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelDownloadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.desc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelStartedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelStartedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.desc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelUnreadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelUnreadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.desc); + }); + } + QueryBuilder sortByLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryLocalSource', Sort.asc); @@ -7994,6 +8890,116 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByNovelDisplayType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.asc); + }); + } + + QueryBuilder sortByNovelDisplayTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.desc); + }); + } + + QueryBuilder sortByNovelGridSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.asc); + }); + } + + QueryBuilder sortByNovelGridSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryDownloadedChapters() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryDownloadedChaptersDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryLocalSource() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryLocalSourceDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowCategoryTabs() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowCategoryTabsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowContinueReadingButton() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowContinueReadingButtonDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowLanguage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowLanguageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowNumbersOfItems() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowNumbersOfItemsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.desc); + }); + } + QueryBuilder sortByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -8093,30 +9099,6 @@ extension SettingsQuerySortBy on QueryBuilder { }); } - QueryBuilder sortBySyncAfterReading() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.asc); - }); - } - - QueryBuilder sortBySyncAfterReadingDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.desc); - }); - } - - QueryBuilder sortBySyncOnAppLaunch() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.asc); - }); - } - - QueryBuilder sortBySyncOnAppLaunchDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.desc); - }); - } - QueryBuilder sortByThemeIsDark() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'themeIsDark', Sort.asc); @@ -8662,6 +9644,42 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByHideAnime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.asc); + }); + } + + QueryBuilder thenByHideAnimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.desc); + }); + } + + QueryBuilder thenByHideManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.asc); + }); + } + + QueryBuilder thenByHideMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.desc); + }); + } + + QueryBuilder thenByHideNovel() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.asc); + }); + } + + QueryBuilder thenByHideNovelDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.desc); + }); + } + QueryBuilder thenById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.asc); @@ -8812,6 +9830,62 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByLibraryFilterNovelBookMarkedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelBookMarkedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.desc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelDownloadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelDownloadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.desc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelStartedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelStartedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.desc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelUnreadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelUnreadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.desc); + }); + } + QueryBuilder thenByLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryLocalSource', Sort.asc); @@ -8918,6 +9992,116 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByNovelDisplayType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.asc); + }); + } + + QueryBuilder thenByNovelDisplayTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.desc); + }); + } + + QueryBuilder thenByNovelGridSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.asc); + }); + } + + QueryBuilder thenByNovelGridSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryDownloadedChapters() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryDownloadedChaptersDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryLocalSource() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryLocalSourceDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowCategoryTabs() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowCategoryTabsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowContinueReadingButton() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowContinueReadingButtonDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowLanguage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowLanguageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowNumbersOfItems() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowNumbersOfItemsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.desc); + }); + } + QueryBuilder thenByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -9017,30 +10201,6 @@ extension SettingsQuerySortThenBy }); } - QueryBuilder thenBySyncAfterReading() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.asc); - }); - } - - QueryBuilder thenBySyncAfterReadingDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.desc); - }); - } - - QueryBuilder thenBySyncOnAppLaunch() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.asc); - }); - } - - QueryBuilder thenBySyncOnAppLaunchDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.desc); - }); - } - QueryBuilder thenByThemeIsDark() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'themeIsDark', Sort.asc); @@ -9358,6 +10518,24 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByHideAnime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hideAnime'); + }); + } + + QueryBuilder distinctByHideManga() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hideManga'); + }); + } + + QueryBuilder distinctByHideNovel() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hideNovel'); + }); + } + QueryBuilder distinctByIncognitoMode() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'incognitoMode'); @@ -9427,6 +10605,34 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByLibraryFilterNovelBookMarkedType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelBookMarkedType'); + }); + } + + QueryBuilder + distinctByLibraryFilterNovelDownloadType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelDownloadType'); + }); + } + + QueryBuilder + distinctByLibraryFilterNovelStartedType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelStartedType'); + }); + } + + QueryBuilder + distinctByLibraryFilterNovelUnreadType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelUnreadType'); + }); + } + QueryBuilder distinctByLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryLocalSource'); @@ -9479,6 +10685,60 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByNovelDisplayType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelDisplayType'); + }); + } + + QueryBuilder distinctByNovelGridSize() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelGridSize'); + }); + } + + QueryBuilder + distinctByNovelLibraryDownloadedChapters() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryDownloadedChapters'); + }); + } + + QueryBuilder + distinctByNovelLibraryLocalSource() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryLocalSource'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowCategoryTabs() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowCategoryTabs'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowContinueReadingButton() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowContinueReadingButton'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowLanguage() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowLanguage'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowNumbersOfItems() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowNumbersOfItems'); + }); + } + QueryBuilder distinctByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -9528,18 +10788,6 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctBySyncAfterReading() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'syncAfterReading'); - }); - } - - QueryBuilder distinctBySyncOnAppLaunch() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'syncOnAppLaunch'); - }); - } - QueryBuilder distinctByThemeIsDark() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'themeIsDark'); @@ -9896,6 +11144,24 @@ extension SettingsQueryProperty }); } + QueryBuilder hideAnimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hideAnime'); + }); + } + + QueryBuilder hideMangaProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hideManga'); + }); + } + + QueryBuilder hideNovelProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hideNovel'); + }); + } + QueryBuilder incognitoModeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'incognitoMode'); @@ -9965,6 +11231,34 @@ extension SettingsQueryProperty }); } + QueryBuilder + libraryFilterNovelBookMarkedTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelBookMarkedType'); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelDownloadType'); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelStartedType'); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelUnreadType'); + }); + } + QueryBuilder libraryLocalSourceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryLocalSource'); @@ -10025,6 +11319,61 @@ extension SettingsQueryProperty }); } + QueryBuilder + novelDisplayTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelDisplayType'); + }); + } + + QueryBuilder novelGridSizeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelGridSize'); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryDownloadedChapters'); + }); + } + + QueryBuilder + novelLibraryLocalSourceProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryLocalSource'); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowCategoryTabs'); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowContinueReadingButton'); + }); + } + + QueryBuilder + novelLibraryShowLanguageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowLanguage'); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowNumbersOfItems'); + }); + } + QueryBuilder onlyIncludePinnedSourcesProperty() { return QueryBuilder.apply(this, (query) { @@ -10110,24 +11459,19 @@ extension SettingsQueryProperty }); } + QueryBuilder + sortLibraryNovelProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'sortLibraryNovel'); + }); + } + QueryBuilder startDatebackupProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'startDatebackup'); }); } - QueryBuilder syncAfterReadingProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'syncAfterReading'); - }); - } - - QueryBuilder syncOnAppLaunchProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'syncOnAppLaunch'); - }); - } - QueryBuilder themeIsDarkProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'themeIsDark'); diff --git a/lib/models/source.dart b/lib/models/source.dart index e3cb05a..e6c0f42 100644 --- a/lib/models/source.dart +++ b/lib/models/source.dart @@ -1,5 +1,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/eval/model/m_source.dart'; +import 'package:mangayomi/models/manga.dart'; part 'source.g.dart'; @collection @@ -49,6 +50,9 @@ class Source { bool? isManga; + @enumerated + late ItemType itemType; + String? appMinVerReq; String? additionalParams; @@ -83,6 +87,7 @@ class Source { this.sourceCode = '', this.headers = '', this.isManga = true, + this.itemType = ItemType.manga, this.appMinVerReq = "", this.additionalParams = "", this.isLocal = false, @@ -102,6 +107,39 @@ class Source { isAdded = json['isAdded']; isFullData = json['isFullData']; isManga = json['isManga']; + itemType = ItemType.values[json['itemType'] ?? 0]; + isNsfw = json['isNsfw']; + isPinned = json['isPinned']; + lang = json['lang']; + lastUsed = json['lastUsed']; + name = json['name']; + sourceCode = json['sourceCode']; + sourceCodeUrl = json['sourceCodeUrl']; + typeSource = json['typeSource']; + version = json['version']; + versionLast = json['versionLast']; + additionalParams = json['additionalParams'] ?? ""; + isObsolete = json['isObsolete']; + isLocal = json['isLocal']; + sourceCodeLanguage = + SourceCodeLanguage.values[json['sourceCodeLanguage'] ?? 0]; + } + + Source.fromJsonV1(Map json) { + apiUrl = json['apiUrl']; + appMinVerReq = json['appMinVerReq']; + baseUrl = json['baseUrl']; + dateFormat = json['dateFormat']; + dateFormatLocale = json['dateFormatLocale']; + hasCloudflare = json['hasCloudflare']; + headers = json['headers']; + iconUrl = json['iconUrl']; + id = json['id']; + isActive = json['isActive']; + isAdded = json['isAdded']; + isFullData = json['isFullData']; + isManga = json['isManga']; + itemType = isManga == true ? ItemType.manga : ItemType.anime; isNsfw = json['isNsfw']; isPinned = json['isPinned']; lang = json['lang']; @@ -133,6 +171,7 @@ class Source { 'isAdded': isAdded, 'isFullData': isFullData, 'isManga': isManga, + 'itemType': itemType.index, 'isNsfw': isNsfw, 'isPinned': isPinned, 'lang': lang, diff --git a/lib/models/source.g.dart b/lib/models/source.g.dart index 0494e6b..c18082c 100644 --- a/lib/models/source.g.dart +++ b/lib/models/source.g.dart @@ -107,49 +107,55 @@ const SourceSchema = CollectionSchema( name: r'isTorrent', type: IsarType.bool, ), - r'lang': PropertySchema( + r'itemType': PropertySchema( id: 18, + name: r'itemType', + type: IsarType.byte, + enumMap: _SourceitemTypeEnumValueMap, + ), + r'lang': PropertySchema( + id: 19, name: r'lang', type: IsarType.string, ), r'lastUsed': PropertySchema( - id: 19, + id: 20, name: r'lastUsed', type: IsarType.bool, ), r'name': PropertySchema( - id: 20, + id: 21, name: r'name', type: IsarType.string, ), r'sourceCode': PropertySchema( - id: 21, + id: 22, name: r'sourceCode', type: IsarType.string, ), r'sourceCodeLanguage': PropertySchema( - id: 22, + id: 23, name: r'sourceCodeLanguage', type: IsarType.byte, enumMap: _SourcesourceCodeLanguageEnumValueMap, ), r'sourceCodeUrl': PropertySchema( - id: 23, + id: 24, name: r'sourceCodeUrl', type: IsarType.string, ), r'typeSource': PropertySchema( - id: 24, + id: 25, name: r'typeSource', type: IsarType.string, ), r'version': PropertySchema( - id: 25, + id: 26, name: r'version', type: IsarType.string, ), r'versionLast': PropertySchema( - id: 26, + id: 27, name: r'versionLast', type: IsarType.string, ) @@ -291,15 +297,16 @@ void _sourceSerialize( writer.writeBool(offsets[15], object.isObsolete); writer.writeBool(offsets[16], object.isPinned); writer.writeBool(offsets[17], object.isTorrent); - writer.writeString(offsets[18], object.lang); - writer.writeBool(offsets[19], object.lastUsed); - writer.writeString(offsets[20], object.name); - writer.writeString(offsets[21], object.sourceCode); - writer.writeByte(offsets[22], object.sourceCodeLanguage.index); - writer.writeString(offsets[23], object.sourceCodeUrl); - writer.writeString(offsets[24], object.typeSource); - writer.writeString(offsets[25], object.version); - writer.writeString(offsets[26], object.versionLast); + writer.writeByte(offsets[18], object.itemType.index); + writer.writeString(offsets[19], object.lang); + writer.writeBool(offsets[20], object.lastUsed); + writer.writeString(offsets[21], object.name); + writer.writeString(offsets[22], object.sourceCode); + writer.writeByte(offsets[23], object.sourceCodeLanguage.index); + writer.writeString(offsets[24], object.sourceCodeUrl); + writer.writeString(offsets[25], object.typeSource); + writer.writeString(offsets[26], object.version); + writer.writeString(offsets[27], object.versionLast); } Source _sourceDeserialize( @@ -327,17 +334,19 @@ Source _sourceDeserialize( isNsfw: reader.readBoolOrNull(offsets[14]), isObsolete: reader.readBoolOrNull(offsets[15]), isPinned: reader.readBoolOrNull(offsets[16]), - lang: reader.readStringOrNull(offsets[18]), - lastUsed: reader.readBoolOrNull(offsets[19]), - name: reader.readStringOrNull(offsets[20]), - sourceCode: reader.readStringOrNull(offsets[21]), - sourceCodeUrl: reader.readStringOrNull(offsets[23]), - typeSource: reader.readStringOrNull(offsets[24]), - version: reader.readStringOrNull(offsets[25]), - versionLast: reader.readStringOrNull(offsets[26]), + itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[18])] ?? + ItemType.manga, + lang: reader.readStringOrNull(offsets[19]), + lastUsed: reader.readBoolOrNull(offsets[20]), + name: reader.readStringOrNull(offsets[21]), + sourceCode: reader.readStringOrNull(offsets[22]), + sourceCodeUrl: reader.readStringOrNull(offsets[24]), + typeSource: reader.readStringOrNull(offsets[25]), + version: reader.readStringOrNull(offsets[26]), + versionLast: reader.readStringOrNull(offsets[27]), ); object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[ - reader.readByteOrNull(offsets[22])] ?? + reader.readByteOrNull(offsets[23])] ?? SourceCodeLanguage.dart; return object; } @@ -386,30 +395,43 @@ P _sourceDeserializeProp

( case 17: return (reader.readBool(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; + return (_SourceitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 19: - return (reader.readBoolOrNull(offset)) as P; - case 20: return (reader.readStringOrNull(offset)) as P; + case 20: + return (reader.readBoolOrNull(offset)) as P; case 21: return (reader.readStringOrNull(offset)) as P; case 22: + return (reader.readStringOrNull(offset)) as P; + case 23: return (_SourcesourceCodeLanguageValueEnumMap[ reader.readByteOrNull(offset)] ?? SourceCodeLanguage.dart) as P; - case 23: - return (reader.readStringOrNull(offset)) as P; case 24: return (reader.readStringOrNull(offset)) as P; case 25: return (reader.readStringOrNull(offset)) as P; case 26: return (reader.readStringOrNull(offset)) as P; + case 27: + return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } } +const _SourceitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _SourceitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; const _SourcesourceCodeLanguageEnumValueMap = { 'dart': 0, 'javascript': 1, @@ -1997,6 +2019,59 @@ extension SourceQueryFilter on QueryBuilder { }); } + QueryBuilder itemTypeEqualTo( + ItemType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeGreaterThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeLessThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeBetween( + ItemType lower, + ItemType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'itemType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder langIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -3321,6 +3396,18 @@ extension SourceQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder sortByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder sortByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3659,6 +3746,18 @@ extension SourceQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder thenByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder thenByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3887,6 +3986,12 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'itemType'); + }); + } + QueryBuilder distinctByLang( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4065,6 +4170,12 @@ extension SourceQueryProperty on QueryBuilder { }); } + QueryBuilder itemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'itemType'); + }); + } + QueryBuilder langProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lang'); diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 7eb8199..ca5cb15 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -324,7 +324,6 @@ class _AnimeStreamPageState extends riv.ConsumerState _currentPosition.value, _currentTotalDuration.value, save: save); _streamController.setAnimeHistoryUpdate(); - _streamController.checkAndSyncProgress(); } void _setLandscapeMode(bool state) { diff --git a/lib/modules/anime/providers/anime_player_controller_provider.dart b/lib/modules/anime/providers/anime_player_controller_provider.dart index 5be1355..7b2f7cb 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.dart @@ -7,9 +7,7 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/services/aniskip.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:mangayomi/utils/chapter_recognition.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'anime_player_controller_provider.g.dart'; @@ -133,7 +131,7 @@ class AnimeStreamController extends _$AnimeStreamController { history = History( mangaId: getAnime().id, date: DateTime.now().millisecondsSinceEpoch.toString(), - isManga: getAnime().isManga, + itemType: getAnime().itemType, chapterId: episode.id) ..chapter.value = episode; } else { @@ -151,13 +149,6 @@ class AnimeStreamController extends _$AnimeStreamController { }); } - void checkAndSyncProgress() { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - if (syncAfterReading) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); - } - } - void setCurrentPosition(Duration duration, Duration? totalDuration, {bool save = false}) { if (episode.isRead!) return; @@ -174,9 +165,6 @@ class AnimeStreamController extends _$AnimeStreamController { isar.writeTxnSync(() { ep.isRead = isWatch; ep.lastPageRead = (duration.inMilliseconds).toString(); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(ep, false, false); isar.chapters.putSync(ep); }); if (isWatch) { diff --git a/lib/modules/anime/providers/anime_player_controller_provider.g.dart b/lib/modules/anime/providers/anime_player_controller_provider.g.dart index 37bd8c3..b5baf06 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.g.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'anime_player_controller_provider.dart'; // ************************************************************************** String _$animeStreamControllerHash() => - r'0d97207a4d015d5089766ccbeeba093c55cb1ef9'; + r'57ebd35f033d51fd213763173c26cd887f5c42d7'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index db77540..5ad7d43 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/storage_provider.dart'; @@ -24,7 +25,7 @@ class _BrowseScreenState extends ConsumerState @override void initState() { - _tabBarController = TabController(length: 4, vsync: this); + _tabBarController = TabController(length: 6, vsync: this); _tabBarController.animateTo(0); _tabBarController.addListener(() { _chekPermission(); @@ -47,7 +48,7 @@ class _BrowseScreenState extends ConsumerState final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 4, + length: 6, child: Scaffold( appBar: AppBar( elevation: 0, @@ -75,8 +76,9 @@ class _BrowseScreenState extends ConsumerState ) : Row( children: [ - if (_tabBarController.index == 2 || - _tabBarController.index == 3) + if (_tabBarController.index == 3 || + _tabBarController.index == 4 || + _tabBarController.index == 5) IconButton( onPressed: () { context.push('/createExtension'); @@ -87,8 +89,9 @@ class _BrowseScreenState extends ConsumerState ? IconButton( splashRadius: 20, onPressed: () { - if (_tabBarController.index != 1 && - _tabBarController.index != 0) { + if (_tabBarController.index != 0 && + _tabBarController.index != 1 && + _tabBarController.index != 2) { setState(() { _isSearch = true; }); @@ -101,7 +104,8 @@ class _BrowseScreenState extends ConsumerState }, icon: Icon( _tabBarController.index == 0 || - _tabBarController.index == 1 + _tabBarController.index == 1 || + _tabBarController.index == 2 ? Icons.travel_explore_rounded : Icons.search_rounded, color: Theme.of(context).hintColor)) @@ -116,18 +120,24 @@ class _BrowseScreenState extends ConsumerState } else if (_tabBarController.index == 1) { context.push('/sourceFilter', extra: false); } else if (_tabBarController.index == 2) { - _textEditingController.clear(); - context.push('/ExtensionLang', extra: true); + context.push('/sourceFilter', extra: false); } else if (_tabBarController.index == 3) { _textEditingController.clear(); context.push('/ExtensionLang', extra: false); + } else if (_tabBarController.index == 4) { + _textEditingController.clear(); + context.push('/ExtensionLang', extra: false); + } else if (_tabBarController.index == 5) { + _textEditingController.clear(); + context.push('/ExtensionLang', extra: false); } else {} }, icon: Icon( - _tabBarController.index == 0 || _tabBarController.index == 1 + _tabBarController.index == 0 || _tabBarController.index == 1 || _tabBarController.index == 2 ? Icons.filter_list_sharp - : _tabBarController.index == 2 || - _tabBarController.index == 3 + : _tabBarController.index == 3 || + _tabBarController.index == 4 || + _tabBarController.index == 5 ? Icons.translate_rounded : Icons.help_outline_outlined, color: Theme.of(context).hintColor)), @@ -139,12 +149,13 @@ class _BrowseScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga_sources), Tab(text: l10n.anime_sources), + Tab(text: l10n.novel_sources), Tab( child: Row( children: [ Text(l10n.manga_extensions), const SizedBox(width: 8), - _extensionUpdateNumbers(ref, true) + _extensionUpdateNumbers(ref, ItemType.manga) ], ), ), @@ -153,7 +164,16 @@ class _BrowseScreenState extends ConsumerState children: [ Text(l10n.anime_extensions), const SizedBox(width: 8), - _extensionUpdateNumbers(ref, false) + _extensionUpdateNumbers(ref, ItemType.anime) + ], + ), + ), + Tab( + child: Row( + children: [ + Text(l10n.novel_extensions), + const SizedBox(width: 8), + _extensionUpdateNumbers(ref, ItemType.novel) ], ), ), @@ -163,24 +183,34 @@ class _BrowseScreenState extends ConsumerState ), body: TabBarView(controller: _tabBarController, children: [ SourcesScreen( - isManga: true, + itemType: ItemType.manga, tabIndex: (index) { _tabBarController.animateTo(index); }, ), SourcesScreen( - isManga: false, + itemType: ItemType.anime, + tabIndex: (index) { + _tabBarController.animateTo(index); + }, + ), + SourcesScreen( + itemType: ItemType.novel, tabIndex: (index) { _tabBarController.animateTo(index); }, ), ExtensionScreen( query: _textEditingController.text, - isManga: true, + itemType: ItemType.manga, ), ExtensionScreen( query: _textEditingController.text, - isManga: false, + itemType: ItemType.anime, + ), + ExtensionScreen( + query: _textEditingController.text, + itemType: ItemType.novel, ), // const MigrateScreen() ]), @@ -189,14 +219,14 @@ class _BrowseScreenState extends ConsumerState } } -Widget _extensionUpdateNumbers(WidgetRef ref, bool isManga) { +Widget _extensionUpdateNumbers(WidgetRef ref, ItemType itemType) { return StreamBuilder( stream: isar.sources .filter() .idIsNotNull() .and() .isActiveEqualTo(true) - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data!.isNotEmpty) { diff --git a/lib/modules/browse/extension/edit_code.dart b/lib/modules/browse/extension/edit_code.dart index 211fadd..60ee6f0 100644 --- a/lib/modules/browse/extension/edit_code.dart +++ b/lib/modules/browse/extension/edit_code.dart @@ -50,7 +50,8 @@ class _CodeEditorState extends ConsumerState { ("search", 2), ("getDetail", 3), ("getPageList", 4), - ("getVideoList", 5) + ("getVideoList", 5), + ("getHtmlContent", 6) ]; int _serviceIndex = 0; @@ -219,7 +220,8 @@ class _CodeEditorState extends ConsumerState { }), if (_serviceIndex == 3 || _serviceIndex == 4 || - _serviceIndex == 5) + _serviceIndex == 5 || + _serviceIndex == 6) _textEditing("Url", context, "ex: url of the entry", (v) { _url = v; @@ -286,11 +288,14 @@ class _CodeEditorState extends ConsumerState { .map((e) => e.toJson()) .toList(), }; - } else { + } else if (_serviceIndex == 5) { result = (await service.getVideoList(_url)) .map((e) => e.toJson()) .toList(); + } else { + result = (await service + .getHtmlContent(_url)); } if (mounted) { setState(() { diff --git a/lib/modules/browse/extension/extension_screen.dart b/lib/modules/browse/extension/extension_screen.dart index b80b963..79a47ad 100644 --- a/lib/modules/browse/extension/extension_screen.dart +++ b/lib/modules/browse/extension/extension_screen.dart @@ -1,21 +1,23 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:grouped_list/sliver_grouped_list.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/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'; class ExtensionScreen extends ConsumerStatefulWidget { - final bool isManga; + final ItemType itemType; final String query; const ExtensionScreen( - {required this.query, required this.isManga, super.key}); + {required this.query, required this.itemType, super.key}); @override ConsumerState createState() => _ExtensionScreenState(); @@ -26,19 +28,24 @@ class _ExtensionScreenState extends ConsumerState { @override Widget build(BuildContext context) { final streamExtensions = - ref.watch(getExtensionsStreamProvider(widget.isManga)); - if (widget.isManga) { + ref.watch(getExtensionsStreamProvider(widget.itemType)); + if (widget.itemType == ItemType.manga) { ref.watch(fetchMangaSourcesListProvider(id: null, reFresh: false)); - } else { + } else if (widget.itemType == ItemType.anime) { ref.watch(fetchAnimeSourcesListProvider(id: null, reFresh: false)); + } else { + ref.watch(fetchNovelSourcesListProvider(id: null, reFresh: false)); } final l10n = l10nLocalizations(context)!; return RefreshIndicator( - onRefresh: () => widget.isManga + onRefresh: () => widget.itemType == ItemType.manga ? ref.refresh( fetchMangaSourcesListProvider(id: null, reFresh: true).future) - : ref.refresh( - fetchAnimeSourcesListProvider(id: null, reFresh: true).future), + : widget.itemType == ItemType.anime + ? ref.refresh( + fetchAnimeSourcesListProvider(id: null, reFresh: true).future) : + ref.refresh( + fetchNovelSourcesListProvider(id: null, reFresh: true).future), child: Padding( padding: const EdgeInsets.only(top: 10), child: streamExtensions.when( @@ -87,14 +94,19 @@ class _ExtensionScreenState extends ConsumerState { ElevatedButton( onPressed: () async { for (var source in updateEntries) { - source.isManga! + source.itemType == ItemType.manga ? await ref.watch( fetchMangaSourcesListProvider( id: source.id, reFresh: true) .future) - : await ref.watch( + : source.itemType == ItemType.anime ? + await ref.watch( fetchAnimeSourcesListProvider( id: source.id, reFresh: true) + .future) : + await ref.watch( + fetchNovelSourcesListProvider( + id: source.id, reFresh: true) .future); } }, @@ -167,12 +179,15 @@ class _ExtensionScreenState extends ConsumerState { error: (error, _) => Center( child: ElevatedButton( onPressed: () { - if (widget.isManga) { + if (widget.itemType == ItemType.manga) { ref.invalidate( fetchMangaSourcesListProvider(id: null, reFresh: true)); - } else { + } else if (widget.itemType == ItemType.anime) { ref.invalidate( fetchAnimeSourcesListProvider(id: null, reFresh: true)); + } else { + ref.invalidate( + fetchNovelSourcesListProvider(id: null, reFresh: true)); } }, child: Text(context.l10n.refresh)), diff --git a/lib/modules/browse/extension/providers/extensions_provider.dart b/lib/modules/browse/extension/providers/extensions_provider.dart index 3df2131..c889032 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.dart @@ -1,17 +1,18 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'extensions_provider.g.dart'; @riverpod -Stream> getExtensionsStream(Ref ref, bool? isManga) async* { +Stream> getExtensionsStream(Ref ref, ItemType itemType) async* { yield* isar.sources .filter() .idIsNotNull() .and() .isActiveEqualTo(true) - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true); } diff --git a/lib/modules/browse/extension/providers/extensions_provider.g.dart b/lib/modules/browse/extension/providers/extensions_provider.g.dart index 2defd2b..555d91b 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.g.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.g.dart @@ -7,7 +7,7 @@ part of 'extensions_provider.dart'; // ************************************************************************** String _$getExtensionsStreamHash() => - r'62f2884dd64a2f3d8928f7399c6b2547f0311078'; + r'3c5d6625c40c222f25fc8141df078dd46bcc762f'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetExtensionsStreamFamily extends Family>> { /// See also [getExtensionsStream]. GetExtensionsStreamProvider call( - bool? isManga, + ItemType itemType, ) { return GetExtensionsStreamProvider( - isManga, + itemType, ); } @@ -53,7 +53,7 @@ class GetExtensionsStreamFamily extends Family>> { covariant GetExtensionsStreamProvider provider, ) { return call( - provider.isManga, + provider.itemType, ); } @@ -77,11 +77,11 @@ class GetExtensionsStreamProvider extends AutoDisposeStreamProvider> { /// See also [getExtensionsStream]. GetExtensionsStreamProvider( - bool? isManga, + ItemType itemType, ) : this._internal( (ref) => getExtensionsStream( ref as GetExtensionsStreamRef, - isManga, + itemType, ), from: getExtensionsStreamProvider, name: r'getExtensionsStreamProvider', @@ -92,7 +92,7 @@ class GetExtensionsStreamProvider dependencies: GetExtensionsStreamFamily._dependencies, allTransitiveDependencies: GetExtensionsStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetExtensionsStreamProvider._internal( @@ -102,10 +102,10 @@ class GetExtensionsStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool? isManga; + final ItemType itemType; @override Override overrideWith( @@ -120,7 +120,7 @@ class GetExtensionsStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,13 +132,13 @@ class GetExtensionsStreamProvider @override bool operator ==(Object other) { - return other is GetExtensionsStreamProvider && other.isManga == isManga; + return other is GetExtensionsStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -147,8 +147,8 @@ class GetExtensionsStreamProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin GetExtensionsStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetExtensionsStreamProviderElement @@ -157,7 +157,7 @@ class _GetExtensionsStreamProviderElement _GetExtensionsStreamProviderElement(super.provider); @override - bool? get isManga => (origin as GetExtensionsStreamProvider).isManga; + ItemType get itemType => (origin as GetExtensionsStreamProvider).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 diff --git a/lib/modules/browse/extension/widgets/create_extension.dart b/lib/modules/browse/extension/widgets/create_extension.dart index 6c823d7..05079ea 100644 --- a/lib/modules/browse/extension/widgets/create_extension.dart +++ b/lib/modules/browse/extension/widgets/create_extension.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -13,15 +14,16 @@ class CreateExtension extends StatefulWidget { } class _CreateExtensionState extends State { - bool _isManga = false; String _name = ""; String _lang = ""; String _baseUrl = ""; String _apiUrl = ""; String _iconUrl = ""; int _sourceTypeIndex = 0; + int _itemTypeIndex = 0; int _languageIndex = 0; final List _sourceTypes = ["single", "multi", "torrent"]; + final List _itemTypes = ["Manga", "Anime", "Novel"]; final List _languages = ["Dart", "JavaScript"]; SourceCodeLanguage _sourceCodeLanguage = SourceCodeLanguage.dart; @override @@ -129,12 +131,35 @@ class _CreateExtensionState extends State { ], ), ), - SwitchListTile( - title: const Text("isManga"), - value: _isManga, - onChanged: (value) => setState(() { - _isManga = value; - }), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 17), + child: Row( + children: [ + const Text("Target"), + const SizedBox(width: 20), + Flexible( + child: DropdownButton( + icon: const Icon(Icons.keyboard_arrow_down), + isExpanded: true, + value: _itemTypeIndex, + hint: Text(_itemTypes[_itemTypeIndex], + style: const TextStyle(fontSize: 13)), + items: _itemTypes + .map((e) => DropdownMenuItem( + value: _itemTypes.indexOf(e), + child: Text(e, + style: const TextStyle(fontSize: 13)), + )) + .toList(), + onChanged: (v) { + setState(() { + _itemTypeIndex = v!; + }); + }, + ), + ), + ], + ), ), Padding( padding: const EdgeInsets.all(8.0), @@ -159,7 +184,7 @@ class _CreateExtensionState extends State { apiUrl: _apiUrl, iconUrl: _iconUrl, typeSource: _sourceTypes[_sourceTypeIndex], - isManga: _isManga, + itemType: ItemType.values.elementAt(_itemTypeIndex), isAdded: true, isActive: true, version: "0.0.1", @@ -252,6 +277,12 @@ class TestSource extends MProvider { // TODO: implement } + // For novel html content + @override + Future getHtmlContent(String url) async { + // TODO: implement + } + // For anime episode video list @override Future> getVideoList(String url) async { @@ -313,6 +344,10 @@ class DefaultExtension extends MProvider { async getDetail(url) { throw new Error("getDetail not implemented"); } + // For novel html content + async getHtmlContent(url) { + throw new Error("getHtmlContent not implemented"); + } // For anime episode video list async getVideoList(url) { throw new Error("getVideoList not implemented"); diff --git a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart index a680a10..3de54fb 100644 --- a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart +++ b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart @@ -2,10 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/main.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/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'; @@ -48,13 +50,17 @@ class _ExtensionListTileWidgetState setState(() { _isLoading = true; }); - widget.source.isManga! + widget.source.itemType == ItemType.manga ? await ref.watch(fetchMangaSourcesListProvider( id: widget.source.id, reFresh: true) .future) - : await ref.watch(fetchAnimeSourcesListProvider( - id: widget.source.id, reFresh: true) - .future); + : widget.source.itemType == ItemType.anime + ? await ref.watch(fetchAnimeSourcesListProvider( + id: widget.source.id, reFresh: true) + .future) + : await ref.watch(fetchNovelSourcesListProvider( + id: widget.source.id, reFresh: true) + .future); if (mounted) { setState(() { _isLoading = false; @@ -116,13 +122,17 @@ class _ExtensionListTileWidgetState setState(() { _isLoading = true; }); - widget.source.isManga! + widget.source.itemType == ItemType.manga ? await ref.watch(fetchMangaSourcesListProvider( id: widget.source.id, reFresh: true) .future) - : await ref.watch(fetchAnimeSourcesListProvider( - id: widget.source.id, reFresh: true) - .future); + : widget.source.itemType == ItemType.anime + ? await ref.watch(fetchAnimeSourcesListProvider( + id: widget.source.id, reFresh: true) + .future) + : await ref.watch(fetchNovelSourcesListProvider( + id: widget.source.id, reFresh: true) + .future); if (mounted) { setState(() { _isLoading = false; diff --git a/lib/modules/browse/global_search/global_search_screen.dart b/lib/modules/browse/global_search/global_search_screen.dart index a64c1a0..ee9620d 100644 --- a/lib/modules/browse/global_search/global_search_screen.dart +++ b/lib/modules/browse/global_search/global_search_screen.dart @@ -236,7 +236,7 @@ class _MangaGlobalImageCardState extends ConsumerState context: context, getManga: getMangaDetail, lang: widget.source.lang!, - isManga: widget.source.isManga ?? true, + itemType: widget.source.itemType, useMaterialRoute: true, source: widget.source.name!); }, diff --git a/lib/modules/browse/sources/sources_screen.dart b/lib/modules/browse/sources/sources_screen.dart index 15a8295..0b278a1 100644 --- a/lib/modules/browse/sources/sources_screen.dart +++ b/lib/modules/browse/sources/sources_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:grouped_list/sliver_grouped_list.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/browse/sources/widgets/source_list_tile.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -10,9 +11,9 @@ import 'package:mangayomi/utils/language.dart'; class SourcesScreen extends ConsumerStatefulWidget { final Function(int) tabIndex; - final bool isManga; + final ItemType itemType; const SourcesScreen( - {required this.tabIndex, required this.isManga, super.key}); + {required this.tabIndex, required this.itemType, super.key}); @override ConsumerState createState() => _SourcesScreenState(); @@ -33,7 +34,7 @@ class _SourcesScreenState extends ConsumerState { .and() .isActiveEqualTo(true) .and() - .isMangaEqualTo(widget.isManga) + .itemTypeEqualTo(widget.itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (!snapshot.hasData) { @@ -52,7 +53,7 @@ class _SourcesScreenState extends ConsumerState { padding: const EdgeInsets.all(8.0), child: ElevatedButton.icon( onPressed: () => - widget.tabIndex(widget.isManga ? 2 : 3), + widget.tabIndex(widget.itemType == ItemType.manga ? 3 : widget.itemType == ItemType.anime ? 4 : 5), icon: const Icon(Icons.extension_rounded), label: Text(context.l10n.show_extensions)), ) @@ -91,7 +92,7 @@ class _SourcesScreenState extends ConsumerState { itemBuilder: (context, Source element) { return SourceListTile( source: element, - isManga: widget.isManga, + itemType: widget.itemType, ); }, groupComparator: (group1, group2) => @@ -118,7 +119,7 @@ class _SourcesScreenState extends ConsumerState { itemBuilder: (context, Source element) { return SourceListTile( source: element, - isManga: widget.isManga, + itemType: widget.itemType, ); }, groupComparator: (group1, group2) => @@ -146,7 +147,7 @@ class _SourcesScreenState extends ConsumerState { itemBuilder: (context, Source element) { return SourceListTile( source: element, - isManga: widget.isManga, + itemType: widget.itemType, ); }, groupComparator: (group1, group2) => diff --git a/lib/modules/browse/sources/widgets/source_list_tile.dart b/lib/modules/browse/sources/widgets/source_list_tile.dart index 089de6f..1cd0bb4 100644 --- a/lib/modules/browse/sources/widgets/source_list_tile.dart +++ b/lib/modules/browse/sources/widgets/source_list_tile.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; @@ -10,10 +11,10 @@ import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/language.dart'; class SourceListTile extends StatelessWidget { - final bool isManga; + final ItemType itemType; final Source source; const SourceListTile( - {super.key, required this.source, required this.isManga}); + {super.key, required this.source, required this.itemType}); @override Widget build(BuildContext context) { @@ -23,7 +24,7 @@ class SourceListTile extends StatelessWidget { .filter() .idIsNotNull() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .findAllSync(); isar.writeTxnSync(() { for (var src in sources) { diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 20fc747..5d821ba 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -10,7 +10,7 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/constant.dart'; @@ -31,17 +31,20 @@ class HistoryScreen extends ConsumerStatefulWidget { class _HistoryScreenState extends ConsumerState with TickerProviderStateMixin { late TabController _tabBarController; + int tabs = 3; + + void tabListener() { + setState(() { + _textEditingController.clear(); + _isSearch = false; + }); + } @override void initState() { - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: tabs, vsync: this); _tabBarController.animateTo(0); - _tabBarController.addListener(() { - setState(() { - _textEditingController.clear(); - _isSearch = false; - }); - }); + _tabBarController.addListener(tabListener); super.initState(); } @@ -50,10 +53,27 @@ class _HistoryScreenState extends ConsumerState List entriesData = []; @override Widget build(BuildContext context) { + int newTabs = 0; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + if (!hideManga) newTabs++; + if (!hideAnime) newTabs++; + if (!hideNovel) newTabs++; + if (tabs != newTabs) { + _tabBarController.removeListener(tabListener); + _tabBarController.dispose(); + _tabBarController = TabController(length: newTabs, vsync: this); + _tabBarController.animateTo(0); + _tabBarController.addListener(tabListener); + setState(() { + tabs = newTabs; + }); + } final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: newTabs, child: Scaffold( appBar: AppBar( elevation: 0, @@ -119,10 +139,20 @@ class _HistoryScreenState extends ConsumerState List histories = isar.historys .filter() .idIsNotNull() - .chapter((q) => q.manga((q) => - q.isMangaEqualTo( - _tabBarController.index == - 0))) + .chapter((q) => q.manga((q) => q + .itemTypeEqualTo(_tabBarController + .index == + 0 && + !hideManga + ? ItemType.manga + : _tabBarController.index == + 1 - + (hideManga + ? 1 + : 0) && + !hideAnime + ? ItemType.anime + : ItemType.novel))) .findAllSync() .toList(); isar.writeTxnSync(() { @@ -148,22 +178,30 @@ class _HistoryScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), - Tab(text: l10n.anime), + if (!hideManga) Tab(text: l10n.manga), + if (!hideAnime) Tab(text: l10n.anime), + if (!hideNovel) Tab(text: l10n.novel), ], ), ), body: Padding( padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ - HistoryTab( - isManga: true, - query: _textEditingController.text, - ), - HistoryTab( - isManga: false, - query: _textEditingController.text, - ) + if (!hideManga) + HistoryTab( + itemType: ItemType.manga, + query: _textEditingController.text, + ), + if (!hideAnime) + HistoryTab( + itemType: ItemType.anime, + query: _textEditingController.text, + ), + if (!hideNovel) + HistoryTab( + itemType: ItemType.novel, + query: _textEditingController.text, + ) ]), ), ), @@ -173,8 +211,8 @@ class _HistoryScreenState extends ConsumerState class HistoryTab extends ConsumerStatefulWidget { final String query; - final bool isManga; - const HistoryTab({required this.isManga, required this.query, super.key}); + final ItemType itemType; + const HistoryTab({required this.itemType, required this.query, super.key}); @override ConsumerState createState() => _HistoryTabState(); @@ -185,7 +223,7 @@ class _HistoryTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final history = - ref.watch(getAllHistoryStreamProvider(isManga: widget.isManga)); + ref.watch(getAllHistoryStreamProvider(itemType: widget.itemType)); return Scaffold( body: history.when( data: (data) { @@ -371,29 +409,12 @@ class _HistoryTabState extends ConsumerState { .id!); for (var chapter in chapters) { - await ref - .read(changedItemsManagerProvider( - managerId: - 1) - .notifier) - .addUpdatedChapterAsync( - chapter, - true, - false); await isar .chapters .delete( chapter .id!); } - await ref - .read(changedItemsManagerProvider( - managerId: - 1) - .notifier) - .addDeletedMangaAsync( - manga, - false); await isar.mangas .delete(manga .id!); diff --git a/lib/modules/history/providers/isar_providers.dart b/lib/modules/history/providers/isar_providers.dart index c800f60..b9939f2 100644 --- a/lib/modules/history/providers/isar_providers.dart +++ b/lib/modules/history/providers/isar_providers.dart @@ -10,22 +10,22 @@ part 'isar_providers.g.dart'; @riverpod Stream> getAllHistoryStream(Ref ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.historys .filter() .idIsNotNull() .and() - .chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga))) + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) .watch(fireImmediately: true); } @riverpod Stream> getAllUpdateStream(Ref ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.updates .filter() .idIsNotNull() .and() - .chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga))) + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) .watch(fireImmediately: true); } diff --git a/lib/modules/history/providers/isar_providers.g.dart b/lib/modules/history/providers/isar_providers.g.dart index e309d6b..f7f4e36 100644 --- a/lib/modules/history/providers/isar_providers.g.dart +++ b/lib/modules/history/providers/isar_providers.g.dart @@ -7,7 +7,7 @@ part of 'isar_providers.dart'; // ************************************************************************** String _$getAllHistoryStreamHash() => - r'53b3a7837efab9e7d2808930e5070dbd788c59f8'; + r'42048cb03035be55b52fc501fb2309cdb2acfcb8'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetAllHistoryStreamFamily extends Family>> { /// See also [getAllHistoryStream]. GetAllHistoryStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetAllHistoryStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -53,7 +53,7 @@ class GetAllHistoryStreamFamily extends Family>> { covariant GetAllHistoryStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -77,11 +77,11 @@ class GetAllHistoryStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllHistoryStream]. GetAllHistoryStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllHistoryStream( ref as GetAllHistoryStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllHistoryStreamProvider, name: r'getAllHistoryStreamProvider', @@ -92,7 +92,7 @@ class GetAllHistoryStreamProvider dependencies: GetAllHistoryStreamFamily._dependencies, allTransitiveDependencies: GetAllHistoryStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllHistoryStreamProvider._internal( @@ -102,10 +102,10 @@ class GetAllHistoryStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -120,7 +120,7 @@ class GetAllHistoryStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,13 +132,13 @@ class GetAllHistoryStreamProvider @override bool operator ==(Object other) { - return other is GetAllHistoryStreamProvider && other.isManga == isManga; + return other is GetAllHistoryStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -147,8 +147,8 @@ class GetAllHistoryStreamProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin GetAllHistoryStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllHistoryStreamProviderElement @@ -157,11 +157,11 @@ class _GetAllHistoryStreamProviderElement _GetAllHistoryStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetAllHistoryStreamProvider).isManga; + ItemType get itemType => (origin as GetAllHistoryStreamProvider).itemType; } String _$getAllUpdateStreamHash() => - r'01f77807c8be11f471b6acee6e7bc358ce600a65'; + r'6a20f8feba3010c2ab7a80560f7a7f6cf10c7366'; /// See also [getAllUpdateStream]. @ProviderFor(getAllUpdateStream) @@ -174,10 +174,10 @@ class GetAllUpdateStreamFamily extends Family>> { /// See also [getAllUpdateStream]. GetAllUpdateStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetAllUpdateStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -186,7 +186,7 @@ class GetAllUpdateStreamFamily extends Family>> { covariant GetAllUpdateStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -210,11 +210,11 @@ class GetAllUpdateStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllUpdateStream]. GetAllUpdateStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllUpdateStream( ref as GetAllUpdateStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllUpdateStreamProvider, name: r'getAllUpdateStreamProvider', @@ -225,7 +225,7 @@ class GetAllUpdateStreamProvider dependencies: GetAllUpdateStreamFamily._dependencies, allTransitiveDependencies: GetAllUpdateStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllUpdateStreamProvider._internal( @@ -235,10 +235,10 @@ class GetAllUpdateStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -253,7 +253,7 @@ class GetAllUpdateStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -265,13 +265,13 @@ class GetAllUpdateStreamProvider @override bool operator ==(Object other) { - return other is GetAllUpdateStreamProvider && other.isManga == isManga; + return other is GetAllUpdateStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -280,8 +280,8 @@ class GetAllUpdateStreamProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin GetAllUpdateStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllUpdateStreamProviderElement @@ -290,7 +290,7 @@ class _GetAllUpdateStreamProviderElement _GetAllUpdateStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetAllUpdateStreamProvider).isManga; + ItemType get itemType => (origin as GetAllUpdateStreamProvider).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 diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index ad8b031..6970661 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -21,7 +21,6 @@ import 'package:mangayomi/modules/library/providers/add_torrent.dart'; import 'package:mangayomi/modules/library/providers/local_archive.dart'; import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -40,8 +39,8 @@ import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/utils/global_style.dart'; class LibraryScreen extends ConsumerStatefulWidget { - final bool isManga; - const LibraryScreen({required this.isManga, super.key}); + final ItemType itemType; + const LibraryScreen({required this.itemType, super.key}); @override ConsumerState createState() => _LibraryScreenState(); @@ -83,13 +82,14 @@ class _LibraryScreenState extends ConsumerState final settings = settingsList.first; final categories = - ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga)); + ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType)); final withoutCategories = ref.watch( - getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga)); + getAllMangaWithoutCategoriesStreamProvider( + itemType: widget.itemType)); final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider( - isManga: widget.isManga, settings: settings)); - final mangaAll = ref.watch( - getAllMangaStreamProvider(categoryId: null, isManga: widget.isManga)); + itemType: widget.itemType, settings: settings)); + final mangaAll = ref.watch(getAllMangaStreamProvider( + categoryId: null, itemType: widget.itemType)); final l10n = l10nLocalizations(context)!; return Scaffold( body: mangaAll.when( @@ -113,55 +113,63 @@ class _LibraryScreenState extends ConsumerState return Consumer(builder: (context, ref, child) { bool reverse = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, + settings: settings)) .reverse!; final continueReaderBtn = ref.watch( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, + settings: settings)); final showNumbersOfItems = ref.watch( libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, + settings: settings)); final localSource = ref.watch( libraryLocalSourceStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, + settings: settings)); final downloadedChapter = ref.watch( libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, + settings: settings)); final language = ref.watch( libraryLanguageStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, + settings: settings)); final displayType = ref.watch( libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, + settings: settings)); final isNotFiltering = ref.watch( mangasFilterResultStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final downloadFilterType = ref.watch( mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final unreadFilterType = ref.watch( mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final startedFilterType = ref.watch( mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final bookmarkedFilterType = ref.watch( mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, + settings: settings)) .index as int; final numberOfItemsList = _filterAndSortManga( data: man, @@ -364,53 +372,53 @@ class _LibraryScreenState extends ConsumerState return Consumer(builder: (context, ref, child) { bool reverse = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .reverse!; final continueReaderBtn = ref.watch( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final showNumbersOfItems = ref.watch( libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final localSource = ref.watch( libraryLocalSourceStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final downloadedChapter = ref.watch( libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final language = ref.watch(libraryLanguageStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final displayType = ref.watch( libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final isNotFiltering = ref.watch( mangasFilterResultStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final downloadFilterType = ref.watch( mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final unreadFilterType = ref.watch( mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final startedFilterType = ref.watch( mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final bookmarkedFilterType = ref.watch( mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; final numberOfItemsList = _filterAndSortManga( data: man, @@ -518,9 +526,9 @@ class _LibraryScreenState extends ConsumerState .set(); ref.invalidate( getAllMangaWithoutCategoriesStreamProvider( - isManga: widget.isManga)); + itemType: widget.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); }, child: Icon( Icons.done_all_sharp, @@ -545,9 +553,9 @@ class _LibraryScreenState extends ConsumerState .set(); ref.invalidate( getAllMangaWithoutCategoriesStreamProvider( - isManga: widget.isManga)); + itemType: widget.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); }, child: Icon( Icons.remove_done_sharp, @@ -611,10 +619,10 @@ class _LibraryScreenState extends ConsumerState required int categoryId, required Settings settings}) { final mangas = ref.watch(getAllMangaStreamProvider( - categoryId: categoryId, isManga: widget.isManga)); + categoryId: categoryId, itemType: widget.itemType)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; return mangas.when( data: (data) { @@ -661,10 +669,10 @@ class _LibraryScreenState extends ConsumerState required Settings settings}) { final l10n = l10nLocalizations(context)!; final mangas = ref.watch(getAllMangaStreamProvider( - categoryId: categoryId, isManga: widget.isManga)); + categoryId: categoryId, itemType: widget.itemType)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; final mangaIdsList = ref.watch(mangasListStateProvider); return Scaffold( @@ -702,7 +710,7 @@ class _LibraryScreenState extends ConsumerState language: language, mangaIdsList: mangaIdsList, localSource: localSource, - isManga: widget.isManga, + itemType: widget.itemType, ), ); } @@ -733,13 +741,13 @@ class _LibraryScreenState extends ConsumerState required Settings settings}) { final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; final manga = withouCategories - ? ref.watch( - getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga)) + ? ref.watch(getAllMangaWithoutCategoriesStreamProvider( + itemType: widget.itemType)) : ref.watch(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); final mangaIdsList = ref.watch(mangasListStateProvider); final l10n = l10nLocalizations(context)!; return manga.when( @@ -776,7 +784,7 @@ class _LibraryScreenState extends ConsumerState language: language, mangaIdsList: mangaIdsList, localSource: localSource, - isManga: widget.isManga, + itemType: widget.itemType, ), ); } @@ -954,7 +962,7 @@ class _LibraryScreenState extends ConsumerState .filter() .idIsNotNull() .and() - .forMangaEqualTo(widget.isManga) + .forItemTypeEqualTo(widget.itemType) .watch(fireImmediately: true), builder: (context, snapshot) { return AlertDialog( @@ -1004,10 +1012,8 @@ class _LibraryScreenState extends ConsumerState children: [ TextButton( onPressed: () { - context.push("/categories", extra: ( - true, - widget.isManga ? 0 : 1 - )); + context.push("/categories", + extra: (true, widget.itemType)); Navigator.pop(context); }, child: Text(l10n.edit)), @@ -1057,10 +1063,8 @@ class _LibraryScreenState extends ConsumerState children: [ TextButton( onPressed: () { - context.push("/categories", extra: ( - true, - widget.isManga ? 0 : 1 - )); + context.push("/categories", + extra: (true, widget.itemType)); Navigator.pop(context); }, child: Text( @@ -1115,7 +1119,7 @@ class _LibraryScreenState extends ConsumerState type: fromLibList.isNotEmpty ? 1 : 0, ), ListTileChapterFilter( - label: widget.isManga + label: widget.itemType != ItemType.anime ? l10n.downloaded_chapters : l10n.downloaded_episodes, onTap: () { @@ -1158,12 +1162,6 @@ class _LibraryScreenState extends ConsumerState } for (var chapter in manga.chapters) { - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter( - chapter, true, false); isar.updates .filter() .mangaIdEqualTo(chapter.mangaId) @@ -1171,11 +1169,6 @@ class _LibraryScreenState extends ConsumerState .deleteAllSync(); isar.chapters.deleteSync(chapter.id!); } - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addDeletedManga(manga, false); isar.mangas.deleteSync(manga.id!); } else { manga.favorite = false; @@ -1272,28 +1265,30 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.downloaded, type: ref.watch(mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { ref .read(mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) .update(); }), ListTileChapterFilter( - label: widget.isManga ? l10n.unread : l10n.unwatched, + label: widget.itemType != ItemType.anime + ? l10n.unread + : l10n.unwatched, type: ref.watch(mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { ref .read(mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1302,13 +1297,13 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.started, type: ref.watch(mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { ref .read(mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1317,14 +1312,14 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.bookmarked, type: ref.watch(mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { setState(() { ref .read(mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1337,11 +1332,11 @@ class _LibraryScreenState extends ConsumerState Consumer(builder: (context, ref, chil) { final reverse = ref .read(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings) + itemType: widget.itemType, settings: settings) .notifier) .isReverse(); final reverseChapter = ref.watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); return Column( children: [ for (var i = 0; i < 7; i++) @@ -1351,7 +1346,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings) + itemType: widget.itemType, settings: settings) .notifier) .set(i); }, @@ -1362,25 +1357,25 @@ class _LibraryScreenState extends ConsumerState }), Consumer(builder: (context, ref, chil) { final display = ref.watch(libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final displayV = ref.read(libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings) + itemType: widget.itemType, settings: settings) .notifier); final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final continueReaderBtn = ref.watch( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final showNumbersOfItems = ref.watch( libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final downloadedChapter = ref.watch( libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final language = ref.watch(libraryLanguageStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final localSource = ref.watch(libraryLocalSourceStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); return SingleChildScrollView( physics: const NeverScrollableScrollPhysics(), child: Column( @@ -1453,7 +1448,7 @@ class _LibraryScreenState extends ConsumerState Consumer( builder: (context, ref, child) { final gridSize = ref.watch(libraryGridSizeStateProvider( - isManga: widget.isManga)) ?? + itemType: widget.itemType)) ?? 0; return Padding( padding: const EdgeInsets.only(left: 8, right: 8, top: 10), @@ -1486,14 +1481,14 @@ class _LibraryScreenState extends ConsumerState HapticFeedback.vibrate(); ref .read(libraryGridSizeStateProvider( - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .set(value.toInt()); }, onChangeEnd: (value) { ref .read(libraryGridSizeStateProvider( - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .set(value.toInt(), end: true); }, @@ -1518,14 +1513,14 @@ class _LibraryScreenState extends ConsumerState child: Column( children: [ ListTileChapterFilter( - label: widget.isManga + label: widget.itemType != ItemType.anime ? l10n.downloaded_chapters : l10n.downloaded_episodes, type: downloadedChapter ? 1 : 0, onTap: () { ref .read(libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!downloadedChapter); @@ -1536,7 +1531,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryLanguageStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!language); @@ -1547,13 +1542,13 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryLocalSourceStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!localSource); }), ListTileChapterFilter( - label: widget.isManga + label: widget.itemType != ItemType.anime ? l10n.show_continue_reading_buttons : l10n.show_continue_watching_buttons, type: continueReaderBtn ? 1 : 0, @@ -1561,7 +1556,7 @@ class _LibraryScreenState extends ConsumerState ref .read( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!continueReaderBtn); @@ -1585,7 +1580,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryShowCategoryTabsStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!showCategoryTabs); @@ -1596,7 +1591,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!showNumbersOfItems); @@ -1616,15 +1611,23 @@ class _LibraryScreenState extends ConsumerState if (index == 0) { return l10n.alphabetically; } else if (index == 1) { - return widget.isManga ? l10n.last_read : l10n.last_watched; + return widget.itemType != ItemType.anime + ? l10n.last_read + : l10n.last_watched; } else if (index == 2) { return l10n.last_update_check; } else if (index == 3) { - return widget.isManga ? l10n.unread_count : l10n.unwatched_count; + return widget.itemType != ItemType.anime + ? l10n.unread_count + : l10n.unwatched_count; } else if (index == 4) { - return widget.isManga ? l10n.total_chapters : l10n.total_episodes; + return widget.itemType != ItemType.anime + ? l10n.total_chapters + : l10n.total_episodes; } else if (index == 5) { - return widget.isManga ? l10n.latest_chapter : l10n.latest_episode; + return widget.itemType != ItemType.anime + ? l10n.latest_chapter + : l10n.latest_episode; } return l10n.date_added; } @@ -1641,10 +1644,10 @@ class _LibraryScreenState extends ConsumerState final isLongPressed = ref.watch(isLongPressedMangaStateProvider); final mangaIdsList = ref.watch(mangasListStateProvider); final manga = categoryId == null - ? ref.watch( - getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga)) + ? ref.watch(getAllMangaWithoutCategoriesStreamProvider( + itemType: widget.itemType)) : ref.watch(getAllMangaStreamProvider( - categoryId: categoryId, isManga: widget.isManga)); + categoryId: categoryId, itemType: widget.itemType)); final l10n = l10nLocalizations(context)!; return PreferredSize( preferredSize: Size.fromHeight(AppBar().preferredSize.height), @@ -1714,7 +1717,11 @@ class _LibraryScreenState extends ConsumerState : Row( children: [ Text( - widget.isManga ? l10n.manga : l10n.anime, + widget.itemType == ItemType.manga + ? l10n.manga + : widget.itemType == ItemType.anime + ? l10n.anime + : l10n.novel, style: TextStyle(color: Theme.of(context).hintColor), ), @@ -1790,7 +1797,7 @@ class _LibraryScreenState extends ConsumerState value: 1, child: Text(l10n.open_random_entry)), PopupMenuItem( value: 2, child: Text(l10n.import)), - if (!widget.isManga) + if (widget.itemType == ItemType.anime) PopupMenuItem( value: 3, child: Text(l10n.torrent_stream)), ]; @@ -1813,8 +1820,9 @@ class _LibraryScreenState extends ConsumerState source: randomManga.source!); }); } else if (value == 2) { - _importLocal(context, widget.isManga); - } else if (value == 3 && !widget.isManga) { + _importLocal(context, widget.itemType); + } else if (value == 3 && + widget.itemType == ItemType.anime) { addTorrent(context); } }), @@ -1823,7 +1831,7 @@ class _LibraryScreenState extends ConsumerState } } -void _importLocal(BuildContext context, bool isManga) { +void _importLocal(BuildContext context, ItemType itemType) { final l10n = l10nLocalizations(context)!; bool isLoading = false; showDialog( @@ -1857,7 +1865,7 @@ void _importLocal(BuildContext context, bool isManga) { }); await ref.watch( importArchivesFromFileProvider( - isManga: isManga, + itemType: itemType, null, init: true) .future); @@ -1872,7 +1880,7 @@ void _importLocal(BuildContext context, bool isManga) { children: [ const Icon(Icons.archive_outlined), Text( - "${l10n.import_files} ( ${isManga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )", + "${l10n.import_files} ( ${itemType == ItemType.manga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )", style: TextStyle( color: Theme.of(context) .textTheme diff --git a/lib/modules/library/providers/add_torrent.dart b/lib/modules/library/providers/add_torrent.dart index f49b677..68499e2 100644 --- a/lib/modules/library/providers/add_torrent.dart +++ b/lib/modules/library/providers/add_torrent.dart @@ -32,7 +32,7 @@ Future addTorrentFromUrlOrFromFile(Ref ref, Manga? mManga, favorite: true, source: 'torrent', author: '', - isManga: false, + itemType: ItemType.anime, genre: [], imageUrl: '', lang: '', diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index 3abd477..47af35c 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -7,7 +7,7 @@ part of 'add_torrent.dart'; // ************************************************************************** String _$addTorrentFromUrlOrFromFileHash() => - r'8102259b30765a5c5cc57870f5c583bd5d421eee'; + r'11cc239bb8b517326f9a005b0c89dd5eb1127099'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/providers/isar_providers.dart b/lib/modules/library/providers/isar_providers.dart index d87d127..7679624 100644 --- a/lib/modules/library/providers/isar_providers.dart +++ b/lib/modules/library/providers/isar_providers.dart @@ -8,14 +8,14 @@ part 'isar_providers.g.dart'; @riverpod Stream> getAllMangaStream(Ref ref, - {required int? categoryId, required bool? isManga}) async* { + {required int? categoryId, required ItemType itemType}) async* { yield* categoryId == null ? isar.mangas .filter() .idIsNotNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true) : isar.mangas .filter() @@ -24,26 +24,26 @@ Stream> getAllMangaStream(Ref ref, .categoriesIsNotEmpty() .categoriesElementEqualTo(categoryId) .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true); } @riverpod Stream> getAllMangaWithoutCategoriesStream(Ref ref, - {required bool? isManga}) async* { + {required ItemType itemType}) async* { yield* isar.mangas .filter() .idIsNotNull() .favoriteEqualTo(true) .categoriesIsEmpty() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .or() .idIsNotNull() .categoriesIsNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true); } diff --git a/lib/modules/library/providers/isar_providers.g.dart b/lib/modules/library/providers/isar_providers.g.dart index e161d7a..6f13f7a 100644 --- a/lib/modules/library/providers/isar_providers.g.dart +++ b/lib/modules/library/providers/isar_providers.g.dart @@ -6,7 +6,7 @@ part of 'isar_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$getAllMangaStreamHash() => r'1c0b5442ae86b2fa899d509a555f5d375f0ff79a'; +String _$getAllMangaStreamHash() => r'5e86a22a68ca1a52aefa9c0bc675d284369beac5'; /// Copied from Dart SDK class _SystemHash { @@ -41,11 +41,11 @@ class GetAllMangaStreamFamily extends Family>> { /// See also [getAllMangaStream]. GetAllMangaStreamProvider call({ required int? categoryId, - required bool? isManga, + required ItemType itemType, }) { return GetAllMangaStreamProvider( categoryId: categoryId, - isManga: isManga, + itemType: itemType, ); } @@ -55,7 +55,7 @@ class GetAllMangaStreamFamily extends Family>> { ) { return call( categoryId: provider.categoryId, - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -79,12 +79,12 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllMangaStream]. GetAllMangaStreamProvider({ required int? categoryId, - required bool? isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllMangaStream( ref as GetAllMangaStreamRef, categoryId: categoryId, - isManga: isManga, + itemType: itemType, ), from: getAllMangaStreamProvider, name: r'getAllMangaStreamProvider', @@ -96,7 +96,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { allTransitiveDependencies: GetAllMangaStreamFamily._allTransitiveDependencies, categoryId: categoryId, - isManga: isManga, + itemType: itemType, ); GetAllMangaStreamProvider._internal( @@ -107,11 +107,11 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { required super.debugGetCreateSourceHash, required super.from, required this.categoryId, - required this.isManga, + required this.itemType, }) : super.internal(); final int? categoryId; - final bool? isManga; + final ItemType itemType; @override Override overrideWith( @@ -127,7 +127,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { allTransitiveDependencies: null, debugGetCreateSourceHash: null, categoryId: categoryId, - isManga: isManga, + itemType: itemType, ), ); } @@ -141,14 +141,14 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { bool operator ==(Object other) { return other is GetAllMangaStreamProvider && other.categoryId == categoryId && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, categoryId.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -160,8 +160,8 @@ mixin GetAllMangaStreamRef on AutoDisposeStreamProviderRef> { /// The parameter `categoryId` of this provider. int? get categoryId; - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllMangaStreamProviderElement @@ -172,11 +172,11 @@ class _GetAllMangaStreamProviderElement @override int? get categoryId => (origin as GetAllMangaStreamProvider).categoryId; @override - bool? get isManga => (origin as GetAllMangaStreamProvider).isManga; + ItemType get itemType => (origin as GetAllMangaStreamProvider).itemType; } String _$getAllMangaWithoutCategoriesStreamHash() => - r'78076f291274b7defd9567e55314002d9aeecab1'; + r'61ea54070c7e87a45aeabce5fd21366faaf4ae6d'; /// See also [getAllMangaWithoutCategoriesStream]. @ProviderFor(getAllMangaWithoutCategoriesStream) @@ -191,10 +191,10 @@ class GetAllMangaWithoutCategoriesStreamFamily /// See also [getAllMangaWithoutCategoriesStream]. GetAllMangaWithoutCategoriesStreamProvider call({ - required bool? isManga, + required ItemType itemType, }) { return GetAllMangaWithoutCategoriesStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -203,7 +203,7 @@ class GetAllMangaWithoutCategoriesStreamFamily covariant GetAllMangaWithoutCategoriesStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -227,11 +227,11 @@ class GetAllMangaWithoutCategoriesStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllMangaWithoutCategoriesStream]. GetAllMangaWithoutCategoriesStreamProvider({ - required bool? isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllMangaWithoutCategoriesStream( ref as GetAllMangaWithoutCategoriesStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllMangaWithoutCategoriesStreamProvider, name: r'getAllMangaWithoutCategoriesStreamProvider', @@ -242,7 +242,7 @@ class GetAllMangaWithoutCategoriesStreamProvider dependencies: GetAllMangaWithoutCategoriesStreamFamily._dependencies, allTransitiveDependencies: GetAllMangaWithoutCategoriesStreamFamily ._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllMangaWithoutCategoriesStreamProvider._internal( @@ -252,10 +252,10 @@ class GetAllMangaWithoutCategoriesStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool? isManga; + final ItemType itemType; @override Override overrideWith( @@ -271,7 +271,7 @@ class GetAllMangaWithoutCategoriesStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -284,13 +284,13 @@ class GetAllMangaWithoutCategoriesStreamProvider @override bool operator ==(Object other) { return other is GetAllMangaWithoutCategoriesStreamProvider && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -300,8 +300,8 @@ class GetAllMangaWithoutCategoriesStreamProvider // ignore: unused_element mixin GetAllMangaWithoutCategoriesStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllMangaWithoutCategoriesStreamProviderElement @@ -310,8 +310,8 @@ class _GetAllMangaWithoutCategoriesStreamProviderElement _GetAllMangaWithoutCategoriesStreamProviderElement(super.provider); @override - bool? get isManga => - (origin as GetAllMangaWithoutCategoriesStreamProvider).isManga; + ItemType get itemType => + (origin as GetAllMangaWithoutCategoriesStreamProvider).itemType; } String _$getSettingsStreamHash() => r'c5a51e0e3473b25d2365025832a27ed2cc029b27'; diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index 5e22641..3965762 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -4,7 +4,6 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'library_state_provider.g.dart'; @@ -12,8 +11,15 @@ part 'library_state_provider.g.dart'; @riverpod class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { @override - DisplayType build({required bool isManga, required Settings settings}) { - return isManga ? settings.displayType : settings.animeDisplayType; + DisplayType build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.displayType; + case ItemType.anime: + return settings.animeDisplayType; + default: + return settings.novelDisplayType; + } } String getLibraryDisplayTypeName( @@ -31,10 +37,16 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { Settings appSettings = Settings(); state = displayType; - if (isManga) { - appSettings = settings..displayType = displayType; - } else { - appSettings = settings..animeDisplayType = displayType; + + switch (itemType) { + case ItemType.manga: + appSettings = settings..displayType = displayType; + break; + case ItemType.anime: + appSettings = settings..animeDisplayType = displayType; + break; + default: + appSettings = settings..novelDisplayType = displayType; } isar.writeTxnSync(() { @@ -46,8 +58,15 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { @riverpod class LibraryGridSizeState extends _$LibraryGridSizeState { @override - int? build({required bool isManga}) { - return isManga ? settings.mangaGridSize : settings.animeGridSize; + int? build({required ItemType itemType}) { + switch (itemType) { + case ItemType.manga: + return settings.mangaGridSize; + case ItemType.anime: + return settings.animeGridSize; + default: + return settings.novelGridSize; + } } Settings get settings { @@ -59,10 +78,15 @@ class LibraryGridSizeState extends _$LibraryGridSizeState { state = value; if (end) { - if (isManga) { - appSettings = settings..mangaGridSize = value; - } else { - appSettings = settings..animeGridSize = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..mangaGridSize = value; + break; + case ItemType.anime: + appSettings = settings..animeGridSize = value; + break; + default: + appSettings = settings..novelGridSize = value; } isar.writeTxnSync(() { @@ -77,24 +101,34 @@ class MangaFilterDownloadedState extends _$MangaFilterDownloadedState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasDownloadType! - : settings.libraryFilterAnimeDownloadType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasDownloadType!; + case ItemType.anime: + return settings.libraryFilterAnimeDownloadType!; + default: + return settings.libraryFilterNovelDownloadType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasDownloadType = type; - } else { - appSettings = settings..libraryFilterAnimeDownloadType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasDownloadType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeDownloadType = type; + break; + default: + appSettings = settings..libraryFilterNovelDownloadType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -118,24 +152,34 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasUnreadType! - : settings.libraryFilterAnimeUnreadType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasUnreadType!; + case ItemType.anime: + return settings.libraryFilterAnimeUnreadType!; + default: + return settings.libraryFilterNovelUnreadType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasUnreadType = type; - } else { - appSettings = settings..libraryFilterAnimeUnreadType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasUnreadType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeUnreadType = type; + break; + default: + appSettings = settings..libraryFilterNovelUnreadType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -208,24 +252,34 @@ class MangaFilterStartedState extends _$MangaFilterStartedState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasStartedType! - : settings.libraryFilterAnimeStartedType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasStartedType!; + case ItemType.anime: + return settings.libraryFilterAnimeStartedType!; + default: + return settings.libraryFilterNovelStartedType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasStartedType = type; - } else { - appSettings = settings..libraryFilterAnimeStartedType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasStartedType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeStartedType = type; + break; + default: + appSettings = settings..libraryFilterNovelStartedType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -298,24 +352,34 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasBookMarkedType! - : settings.libraryFilterAnimeBookMarkedType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasBookMarkedType!; + case ItemType.anime: + return settings.libraryFilterAnimeBookMarkedType!; + default: + return settings.libraryFilterNovelBookMarkedType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasBookMarkedType = type; - } else { - appSettings = settings..libraryFilterAnimeBookMarkedType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasBookMarkedType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeBookMarkedType = type; + break; + default: + appSettings = settings..libraryFilterNovelBookMarkedType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -388,16 +452,16 @@ class MangasFilterResultState extends _$MangasFilterResultState { @override bool build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { final downloadFilterType = ref.watch(mangaFilterDownloadedStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); final unreadFilterType = ref.watch(mangaFilterUnreadStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); final startedFilterType = ref.watch(mangaFilterStartedStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); final bookmarkedFilterType = ref.watch(mangaFilterBookmarkedStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); return downloadFilterType == 0 && unreadFilterType == 0 && startedFilterType == 0 && @@ -408,18 +472,28 @@ class MangasFilterResultState extends _$MangasFilterResultState { @riverpod class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowCategoryTabs! - : settings.animeLibraryShowCategoryTabs ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowCategoryTabs!; + case ItemType.anime: + return settings.animeLibraryShowCategoryTabs!; + default: + return settings.novelLibraryShowCategoryTabs ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowCategoryTabs = value; - } else { - appSettings = settings..animeLibraryShowCategoryTabs = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowCategoryTabs = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowCategoryTabs = value; + break; + default: + appSettings = settings..novelLibraryShowCategoryTabs = value; } state = value; isar.writeTxnSync(() { @@ -431,18 +505,28 @@ class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState { @riverpod class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryDownloadedChapters! - : settings.animeLibraryDownloadedChapters ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryDownloadedChapters!; + case ItemType.anime: + return settings.animeLibraryDownloadedChapters!; + default: + return settings.novelLibraryDownloadedChapters ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryDownloadedChapters = value; - } else { - appSettings = settings..animeLibraryDownloadedChapters = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryDownloadedChapters = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryDownloadedChapters = value; + break; + default: + appSettings = settings..novelLibraryDownloadedChapters = value; } state = value; isar.writeTxnSync(() { @@ -454,18 +538,28 @@ class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState { @riverpod class LibraryLanguageState extends _$LibraryLanguageState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowLanguage! - : settings.animeLibraryShowLanguage ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowLanguage!; + case ItemType.anime: + return settings.animeLibraryShowLanguage!; + default: + return settings.novelLibraryShowLanguage ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowLanguage = value; - } else { - appSettings = settings..animeLibraryShowLanguage = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowLanguage = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowLanguage = value; + break; + default: + appSettings = settings..novelLibraryShowLanguage = value; } state = value; isar.writeTxnSync(() { @@ -477,18 +571,28 @@ class LibraryLanguageState extends _$LibraryLanguageState { @riverpod class LibraryLocalSourceState extends _$LibraryLocalSourceState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryLocalSource ?? false - : settings.animeLibraryLocalSource ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryLocalSource ?? false; + case ItemType.anime: + return settings.animeLibraryLocalSource ?? false; + default: + return settings.novelLibraryLocalSource ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryLocalSource = value; - } else { - appSettings = settings..animeLibraryLocalSource = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryLocalSource = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryLocalSource = value; + break; + default: + appSettings = settings..novelLibraryLocalSource = value; } state = value; isar.writeTxnSync(() { @@ -500,18 +604,28 @@ class LibraryLocalSourceState extends _$LibraryLocalSourceState { @riverpod class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowNumbersOfItems! - : settings.animeLibraryShowNumbersOfItems ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowNumbersOfItems!; + case ItemType.anime: + return settings.animeLibraryShowNumbersOfItems!; + default: + return settings.novelLibraryShowNumbersOfItems ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowNumbersOfItems = value; - } else { - appSettings = settings..animeLibraryShowNumbersOfItems = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowNumbersOfItems = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowNumbersOfItems = value; + break; + default: + appSettings = settings..novelLibraryShowNumbersOfItems = value; } state = value; isar.writeTxnSync(() { @@ -524,18 +638,28 @@ class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState { class LibraryShowContinueReadingButtonState extends _$LibraryShowContinueReadingButtonState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowContinueReadingButton! - : settings.animeLibraryShowContinueReadingButton ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowContinueReadingButton!; + case ItemType.anime: + return settings.animeLibraryShowContinueReadingButton!; + default: + return settings.novelLibraryShowContinueReadingButton ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowContinueReadingButton = value; - } else { - appSettings = settings..animeLibraryShowContinueReadingButton = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowContinueReadingButton = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowContinueReadingButton = value; + break; + default: + appSettings = settings..novelLibraryShowContinueReadingButton = value; } state = value; isar.writeTxnSync(() { @@ -547,10 +671,15 @@ class LibraryShowContinueReadingButtonState @riverpod class SortLibraryMangaState extends _$SortLibraryMangaState { @override - SortLibraryManga build({required bool isManga, required Settings settings}) { - return isManga - ? settings.sortLibraryManga ?? SortLibraryManga() - : settings.sortLibraryAnime ?? SortLibraryManga(); + SortLibraryManga build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.sortLibraryManga ?? SortLibraryManga(); + case ItemType.anime: + return settings.sortLibraryAnime ?? SortLibraryManga(); + default: + return settings.sortLibraryNovel ?? SortLibraryManga(); + } } void update(bool reverse, int index) { @@ -559,10 +688,15 @@ class SortLibraryMangaState extends _$SortLibraryMangaState { ..index = index ..reverse = state.index == index ? !reverse : reverse; - if (isManga) { - appSettings = settings..sortLibraryManga = value; - } else { - appSettings = settings..sortLibraryAnime = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..sortLibraryManga = value; + break; + case ItemType.anime: + appSettings = settings..sortLibraryAnime = value; + break; + default: + appSettings = settings..sortLibraryNovel = value; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -651,9 +785,6 @@ class MangasSetIsReadState extends _$MangasSetIsReadState { for (var chapter in chapters) { chapter.isRead = true; chapter.lastPageRead = "1"; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } @@ -678,9 +809,6 @@ class MangasSetUnReadState extends _$MangasSetUnReadState { isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isRead = false; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index 5241058..44ade02 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -7,7 +7,7 @@ part of 'library_state_provider.dart'; // ************************************************************************** String _$libraryDisplayTypeStateHash() => - r'9756e17b70fcb76aa6bac2a50e0927c2ad28717f'; + r'bcc3757a2aec544a3282776536a14e50cfafd03d'; /// Copied from Dart SDK class _SystemHash { @@ -32,11 +32,11 @@ class _SystemHash { abstract class _$LibraryDisplayTypeState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; DisplayType build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -52,11 +52,11 @@ class LibraryDisplayTypeStateFamily extends Family { /// See also [LibraryDisplayTypeState]. LibraryDisplayTypeStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryDisplayTypeStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -66,7 +66,7 @@ class LibraryDisplayTypeStateFamily extends Family { covariant LibraryDisplayTypeStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -91,11 +91,11 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< LibraryDisplayTypeState, DisplayType> { /// See also [LibraryDisplayTypeState]. LibraryDisplayTypeStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryDisplayTypeState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryDisplayTypeStateProvider, name: r'libraryDisplayTypeStateProvider', @@ -106,7 +106,7 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< dependencies: LibraryDisplayTypeStateFamily._dependencies, allTransitiveDependencies: LibraryDisplayTypeStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -117,11 +117,11 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -129,7 +129,7 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< covariant LibraryDisplayTypeState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -140,14 +140,14 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< origin: this, override: LibraryDisplayTypeStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -162,14 +162,14 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< @override bool operator ==(Object other) { return other is LibraryDisplayTypeStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -180,8 +180,8 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< // ignore: unused_element mixin LibraryDisplayTypeStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -193,20 +193,20 @@ class _LibraryDisplayTypeStateProviderElement _LibraryDisplayTypeStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryDisplayTypeStateProvider).isManga; + ItemType get itemType => (origin as LibraryDisplayTypeStateProvider).itemType; @override Settings get settings => (origin as LibraryDisplayTypeStateProvider).settings; } String _$libraryGridSizeStateHash() => - r'a4e55ef92f9387c2588679c5e2f23ef689e5d593'; + r'2b41e0dfd5fbc1b01ffc9ee4b5d3a99bce12df18'; abstract class _$LibraryGridSizeState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; int? build({ - required bool isManga, + required ItemType itemType, }); } @@ -221,10 +221,10 @@ class LibraryGridSizeStateFamily extends Family { /// See also [LibraryGridSizeState]. LibraryGridSizeStateProvider call({ - required bool isManga, + required ItemType itemType, }) { return LibraryGridSizeStateProvider( - isManga: isManga, + itemType: itemType, ); } @@ -233,7 +233,7 @@ class LibraryGridSizeStateFamily extends Family { covariant LibraryGridSizeStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -257,9 +257,9 @@ class LibraryGridSizeStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryGridSizeState]. LibraryGridSizeStateProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( - () => LibraryGridSizeState()..isManga = isManga, + () => LibraryGridSizeState()..itemType = itemType, from: libraryGridSizeStateProvider, name: r'libraryGridSizeStateProvider', debugGetCreateSourceHash: @@ -269,7 +269,7 @@ class LibraryGridSizeStateProvider dependencies: LibraryGridSizeStateFamily._dependencies, allTransitiveDependencies: LibraryGridSizeStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); LibraryGridSizeStateProvider._internal( @@ -279,17 +279,17 @@ class LibraryGridSizeStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override int? runNotifierBuild( covariant LibraryGridSizeState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, ); } @@ -298,13 +298,13 @@ class LibraryGridSizeStateProvider return ProviderOverride( origin: this, override: LibraryGridSizeStateProvider._internal( - () => create()..isManga = isManga, + () => create()..itemType = itemType, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -317,13 +317,13 @@ class LibraryGridSizeStateProvider @override bool operator ==(Object other) { - return other is LibraryGridSizeStateProvider && other.isManga == isManga; + return other is LibraryGridSizeStateProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -332,8 +332,8 @@ class LibraryGridSizeStateProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin LibraryGridSizeStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _LibraryGridSizeStateProviderElement @@ -342,21 +342,21 @@ class _LibraryGridSizeStateProviderElement _LibraryGridSizeStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryGridSizeStateProvider).isManga; + ItemType get itemType => (origin as LibraryGridSizeStateProvider).itemType; } String _$mangaFilterDownloadedStateHash() => - r'9c07e64580061bf2cbf892ef679274913aaa3b20'; + r'455eb734a87b1d3be3e5684902734a9c8c98a330'; abstract class _$MangaFilterDownloadedState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -373,12 +373,12 @@ class MangaFilterDownloadedStateFamily extends Family { /// See also [MangaFilterDownloadedState]. MangaFilterDownloadedStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterDownloadedStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -389,7 +389,7 @@ class MangaFilterDownloadedStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -415,12 +415,12 @@ class MangaFilterDownloadedStateProvider /// See also [MangaFilterDownloadedState]. MangaFilterDownloadedStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterDownloadedState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterDownloadedStateProvider, name: r'mangaFilterDownloadedStateProvider', @@ -432,7 +432,7 @@ class MangaFilterDownloadedStateProvider allTransitiveDependencies: MangaFilterDownloadedStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -444,12 +444,12 @@ class MangaFilterDownloadedStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -458,7 +458,7 @@ class MangaFilterDownloadedStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -470,7 +470,7 @@ class MangaFilterDownloadedStateProvider override: MangaFilterDownloadedStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -478,7 +478,7 @@ class MangaFilterDownloadedStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -494,7 +494,7 @@ class MangaFilterDownloadedStateProvider bool operator ==(Object other) { return other is MangaFilterDownloadedStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -502,7 +502,7 @@ class MangaFilterDownloadedStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -515,8 +515,8 @@ mixin MangaFilterDownloadedStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -531,24 +531,25 @@ class _MangaFilterDownloadedStateProviderElement List get mangaList => (origin as MangaFilterDownloadedStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterDownloadedStateProvider).isManga; + ItemType get itemType => + (origin as MangaFilterDownloadedStateProvider).itemType; @override Settings get settings => (origin as MangaFilterDownloadedStateProvider).settings; } String _$mangaFilterUnreadStateHash() => - r'ede01032c9a0a4e97028eb23c7bd91fa91b24a59'; + r'd48b9b0a5752befdab56601a1c8e2b36d797aeee'; abstract class _$MangaFilterUnreadState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -565,12 +566,12 @@ class MangaFilterUnreadStateFamily extends Family { /// See also [MangaFilterUnreadState]. MangaFilterUnreadStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterUnreadStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -581,7 +582,7 @@ class MangaFilterUnreadStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -607,12 +608,12 @@ class MangaFilterUnreadStateProvider /// See also [MangaFilterUnreadState]. MangaFilterUnreadStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterUnreadState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterUnreadStateProvider, name: r'mangaFilterUnreadStateProvider', @@ -624,7 +625,7 @@ class MangaFilterUnreadStateProvider allTransitiveDependencies: MangaFilterUnreadStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -636,12 +637,12 @@ class MangaFilterUnreadStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -650,7 +651,7 @@ class MangaFilterUnreadStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -662,7 +663,7 @@ class MangaFilterUnreadStateProvider override: MangaFilterUnreadStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -670,7 +671,7 @@ class MangaFilterUnreadStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -686,7 +687,7 @@ class MangaFilterUnreadStateProvider bool operator ==(Object other) { return other is MangaFilterUnreadStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -694,7 +695,7 @@ class MangaFilterUnreadStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -707,8 +708,8 @@ mixin MangaFilterUnreadStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -723,23 +724,23 @@ class _MangaFilterUnreadStateProviderElement List get mangaList => (origin as MangaFilterUnreadStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterUnreadStateProvider).isManga; + ItemType get itemType => (origin as MangaFilterUnreadStateProvider).itemType; @override Settings get settings => (origin as MangaFilterUnreadStateProvider).settings; } String _$mangaFilterStartedStateHash() => - r'455594ef7515307787a136872090218f67102fbd'; + r'fc6c919aa27bf338825cd8c252927ae78b8da36c'; abstract class _$MangaFilterStartedState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -756,12 +757,12 @@ class MangaFilterStartedStateFamily extends Family { /// See also [MangaFilterStartedState]. MangaFilterStartedStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterStartedStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -772,7 +773,7 @@ class MangaFilterStartedStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -798,12 +799,12 @@ class MangaFilterStartedStateProvider /// See also [MangaFilterStartedState]. MangaFilterStartedStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterStartedState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterStartedStateProvider, name: r'mangaFilterStartedStateProvider', @@ -815,7 +816,7 @@ class MangaFilterStartedStateProvider allTransitiveDependencies: MangaFilterStartedStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -827,12 +828,12 @@ class MangaFilterStartedStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -841,7 +842,7 @@ class MangaFilterStartedStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -853,7 +854,7 @@ class MangaFilterStartedStateProvider override: MangaFilterStartedStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -861,7 +862,7 @@ class MangaFilterStartedStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -877,7 +878,7 @@ class MangaFilterStartedStateProvider bool operator ==(Object other) { return other is MangaFilterStartedStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -885,7 +886,7 @@ class MangaFilterStartedStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -898,8 +899,8 @@ mixin MangaFilterStartedStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -914,23 +915,23 @@ class _MangaFilterStartedStateProviderElement List get mangaList => (origin as MangaFilterStartedStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterStartedStateProvider).isManga; + ItemType get itemType => (origin as MangaFilterStartedStateProvider).itemType; @override Settings get settings => (origin as MangaFilterStartedStateProvider).settings; } String _$mangaFilterBookmarkedStateHash() => - r'7761c3ab84367f165ed378992c904e13b590efed'; + r'b013800ec4e42ede752c7cbcb00575678444e8b5'; abstract class _$MangaFilterBookmarkedState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -947,12 +948,12 @@ class MangaFilterBookmarkedStateFamily extends Family { /// See also [MangaFilterBookmarkedState]. MangaFilterBookmarkedStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterBookmarkedStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -963,7 +964,7 @@ class MangaFilterBookmarkedStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -989,12 +990,12 @@ class MangaFilterBookmarkedStateProvider /// See also [MangaFilterBookmarkedState]. MangaFilterBookmarkedStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterBookmarkedState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterBookmarkedStateProvider, name: r'mangaFilterBookmarkedStateProvider', @@ -1006,7 +1007,7 @@ class MangaFilterBookmarkedStateProvider allTransitiveDependencies: MangaFilterBookmarkedStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1018,12 +1019,12 @@ class MangaFilterBookmarkedStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1032,7 +1033,7 @@ class MangaFilterBookmarkedStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1044,7 +1045,7 @@ class MangaFilterBookmarkedStateProvider override: MangaFilterBookmarkedStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -1052,7 +1053,7 @@ class MangaFilterBookmarkedStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1068,7 +1069,7 @@ class MangaFilterBookmarkedStateProvider bool operator ==(Object other) { return other is MangaFilterBookmarkedStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -1076,7 +1077,7 @@ class MangaFilterBookmarkedStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1089,8 +1090,8 @@ mixin MangaFilterBookmarkedStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1105,24 +1106,25 @@ class _MangaFilterBookmarkedStateProviderElement List get mangaList => (origin as MangaFilterBookmarkedStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterBookmarkedStateProvider).isManga; + ItemType get itemType => + (origin as MangaFilterBookmarkedStateProvider).itemType; @override Settings get settings => (origin as MangaFilterBookmarkedStateProvider).settings; } String _$mangasFilterResultStateHash() => - r'059fbe356805144bb533d4827d2c91b82aa3be10'; + r'c6f916c35e9b7125ba073d09aa6838605b933b20'; abstract class _$MangasFilterResultState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1139,12 +1141,12 @@ class MangasFilterResultStateFamily extends Family { /// See also [MangasFilterResultState]. MangasFilterResultStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangasFilterResultStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1155,7 +1157,7 @@ class MangasFilterResultStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1181,12 +1183,12 @@ class MangasFilterResultStateProvider /// See also [MangasFilterResultState]. MangasFilterResultStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangasFilterResultState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangasFilterResultStateProvider, name: r'mangasFilterResultStateProvider', @@ -1198,7 +1200,7 @@ class MangasFilterResultStateProvider allTransitiveDependencies: MangasFilterResultStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1210,12 +1212,12 @@ class MangasFilterResultStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1224,7 +1226,7 @@ class MangasFilterResultStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1236,7 +1238,7 @@ class MangasFilterResultStateProvider override: MangasFilterResultStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -1244,7 +1246,7 @@ class MangasFilterResultStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1260,7 +1262,7 @@ class MangasFilterResultStateProvider bool operator ==(Object other) { return other is MangasFilterResultStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -1268,7 +1270,7 @@ class MangasFilterResultStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1281,8 +1283,8 @@ mixin MangasFilterResultStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1297,21 +1299,21 @@ class _MangasFilterResultStateProviderElement List get mangaList => (origin as MangasFilterResultStateProvider).mangaList; @override - bool get isManga => (origin as MangasFilterResultStateProvider).isManga; + ItemType get itemType => (origin as MangasFilterResultStateProvider).itemType; @override Settings get settings => (origin as MangasFilterResultStateProvider).settings; } String _$libraryShowCategoryTabsStateHash() => - r'd141fb5f427f1054aff3a33a34d89b7aec354935'; + r'f8136c8e7b343e50a4fd4884bc9874d888d08901'; abstract class _$LibraryShowCategoryTabsState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1328,11 +1330,11 @@ class LibraryShowCategoryTabsStateFamily extends Family { /// See also [LibraryShowCategoryTabsState]. LibraryShowCategoryTabsStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryShowCategoryTabsStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1342,7 +1344,7 @@ class LibraryShowCategoryTabsStateFamily extends Family { covariant LibraryShowCategoryTabsStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1368,11 +1370,11 @@ class LibraryShowCategoryTabsStateProvider bool> { /// See also [LibraryShowCategoryTabsState]. LibraryShowCategoryTabsStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryShowCategoryTabsState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryShowCategoryTabsStateProvider, name: r'libraryShowCategoryTabsStateProvider', @@ -1383,7 +1385,7 @@ class LibraryShowCategoryTabsStateProvider dependencies: LibraryShowCategoryTabsStateFamily._dependencies, allTransitiveDependencies: LibraryShowCategoryTabsStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1394,11 +1396,11 @@ class LibraryShowCategoryTabsStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1406,7 +1408,7 @@ class LibraryShowCategoryTabsStateProvider covariant LibraryShowCategoryTabsState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1417,14 +1419,14 @@ class LibraryShowCategoryTabsStateProvider origin: this, override: LibraryShowCategoryTabsStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1439,14 +1441,14 @@ class LibraryShowCategoryTabsStateProvider @override bool operator ==(Object other) { return other is LibraryShowCategoryTabsStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1456,8 +1458,8 @@ class LibraryShowCategoryTabsStateProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin LibraryShowCategoryTabsStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1469,22 +1471,23 @@ class _LibraryShowCategoryTabsStateProviderElement _LibraryShowCategoryTabsStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryShowCategoryTabsStateProvider).isManga; + ItemType get itemType => + (origin as LibraryShowCategoryTabsStateProvider).itemType; @override Settings get settings => (origin as LibraryShowCategoryTabsStateProvider).settings; } String _$libraryDownloadedChaptersStateHash() => - r'00930ece1c84079525a2d73b03cd87f290184d36'; + r'1c93c624dfaa46ccd56de1841233d04fc63e18af'; abstract class _$LibraryDownloadedChaptersState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1501,11 +1504,11 @@ class LibraryDownloadedChaptersStateFamily extends Family { /// See also [LibraryDownloadedChaptersState]. LibraryDownloadedChaptersStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryDownloadedChaptersStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1515,7 +1518,7 @@ class LibraryDownloadedChaptersStateFamily extends Family { covariant LibraryDownloadedChaptersStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1541,11 +1544,11 @@ class LibraryDownloadedChaptersStateProvider bool> { /// See also [LibraryDownloadedChaptersState]. LibraryDownloadedChaptersStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryDownloadedChaptersState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryDownloadedChaptersStateProvider, name: r'libraryDownloadedChaptersStateProvider', @@ -1556,7 +1559,7 @@ class LibraryDownloadedChaptersStateProvider dependencies: LibraryDownloadedChaptersStateFamily._dependencies, allTransitiveDependencies: LibraryDownloadedChaptersStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1567,11 +1570,11 @@ class LibraryDownloadedChaptersStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1579,7 +1582,7 @@ class LibraryDownloadedChaptersStateProvider covariant LibraryDownloadedChaptersState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1590,14 +1593,14 @@ class LibraryDownloadedChaptersStateProvider origin: this, override: LibraryDownloadedChaptersStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1612,14 +1615,14 @@ class LibraryDownloadedChaptersStateProvider @override bool operator ==(Object other) { return other is LibraryDownloadedChaptersStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1630,8 +1633,8 @@ class LibraryDownloadedChaptersStateProvider // ignore: unused_element mixin LibraryDownloadedChaptersStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1643,23 +1646,23 @@ class _LibraryDownloadedChaptersStateProviderElement _LibraryDownloadedChaptersStateProviderElement(super.provider); @override - bool get isManga => - (origin as LibraryDownloadedChaptersStateProvider).isManga; + ItemType get itemType => + (origin as LibraryDownloadedChaptersStateProvider).itemType; @override Settings get settings => (origin as LibraryDownloadedChaptersStateProvider).settings; } String _$libraryLanguageStateHash() => - r'fea084aa32fa415c32aa2b93a9a1ba7c50d0fd41'; + r'83045a8db5fbad972fc1b956bbc8225f97fc03b4'; abstract class _$LibraryLanguageState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1675,11 +1678,11 @@ class LibraryLanguageStateFamily extends Family { /// See also [LibraryLanguageState]. LibraryLanguageStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryLanguageStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1689,7 +1692,7 @@ class LibraryLanguageStateFamily extends Family { covariant LibraryLanguageStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1714,11 +1717,11 @@ class LibraryLanguageStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryLanguageState]. LibraryLanguageStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryLanguageState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryLanguageStateProvider, name: r'libraryLanguageStateProvider', @@ -1729,7 +1732,7 @@ class LibraryLanguageStateProvider dependencies: LibraryLanguageStateFamily._dependencies, allTransitiveDependencies: LibraryLanguageStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1740,11 +1743,11 @@ class LibraryLanguageStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1752,7 +1755,7 @@ class LibraryLanguageStateProvider covariant LibraryLanguageState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1763,14 +1766,14 @@ class LibraryLanguageStateProvider origin: this, override: LibraryLanguageStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1785,14 +1788,14 @@ class LibraryLanguageStateProvider @override bool operator ==(Object other) { return other is LibraryLanguageStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1802,8 +1805,8 @@ class LibraryLanguageStateProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin LibraryLanguageStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1815,21 +1818,21 @@ class _LibraryLanguageStateProviderElement _LibraryLanguageStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryLanguageStateProvider).isManga; + ItemType get itemType => (origin as LibraryLanguageStateProvider).itemType; @override Settings get settings => (origin as LibraryLanguageStateProvider).settings; } String _$libraryLocalSourceStateHash() => - r'9c180d682d0b653bbfc5788e189ee8f4bebd77ec'; + r'f3a442394bd9ecbe9be574f6843b9aca4310bdf3'; abstract class _$LibraryLocalSourceState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1845,11 +1848,11 @@ class LibraryLocalSourceStateFamily extends Family { /// See also [LibraryLocalSourceState]. LibraryLocalSourceStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryLocalSourceStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1859,7 +1862,7 @@ class LibraryLocalSourceStateFamily extends Family { covariant LibraryLocalSourceStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1884,11 +1887,11 @@ class LibraryLocalSourceStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryLocalSourceState]. LibraryLocalSourceStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryLocalSourceState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryLocalSourceStateProvider, name: r'libraryLocalSourceStateProvider', @@ -1899,7 +1902,7 @@ class LibraryLocalSourceStateProvider dependencies: LibraryLocalSourceStateFamily._dependencies, allTransitiveDependencies: LibraryLocalSourceStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1910,11 +1913,11 @@ class LibraryLocalSourceStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1922,7 +1925,7 @@ class LibraryLocalSourceStateProvider covariant LibraryLocalSourceState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1933,14 +1936,14 @@ class LibraryLocalSourceStateProvider origin: this, override: LibraryLocalSourceStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1955,14 +1958,14 @@ class LibraryLocalSourceStateProvider @override bool operator ==(Object other) { return other is LibraryLocalSourceStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1972,8 +1975,8 @@ class LibraryLocalSourceStateProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin LibraryLocalSourceStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1985,21 +1988,21 @@ class _LibraryLocalSourceStateProviderElement _LibraryLocalSourceStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryLocalSourceStateProvider).isManga; + ItemType get itemType => (origin as LibraryLocalSourceStateProvider).itemType; @override Settings get settings => (origin as LibraryLocalSourceStateProvider).settings; } String _$libraryShowNumbersOfItemsStateHash() => - r'fdef7a85fe68594e548f5affa40c72bf25fba2cf'; + r'8261b0ee660d36d284c53c45debfca7ceb7cbfd3'; abstract class _$LibraryShowNumbersOfItemsState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -2016,11 +2019,11 @@ class LibraryShowNumbersOfItemsStateFamily extends Family { /// See also [LibraryShowNumbersOfItemsState]. LibraryShowNumbersOfItemsStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryShowNumbersOfItemsStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2030,7 +2033,7 @@ class LibraryShowNumbersOfItemsStateFamily extends Family { covariant LibraryShowNumbersOfItemsStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -2056,11 +2059,11 @@ class LibraryShowNumbersOfItemsStateProvider bool> { /// See also [LibraryShowNumbersOfItemsState]. LibraryShowNumbersOfItemsStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryShowNumbersOfItemsState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryShowNumbersOfItemsStateProvider, name: r'libraryShowNumbersOfItemsStateProvider', @@ -2071,7 +2074,7 @@ class LibraryShowNumbersOfItemsStateProvider dependencies: LibraryShowNumbersOfItemsStateFamily._dependencies, allTransitiveDependencies: LibraryShowNumbersOfItemsStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -2082,11 +2085,11 @@ class LibraryShowNumbersOfItemsStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -2094,7 +2097,7 @@ class LibraryShowNumbersOfItemsStateProvider covariant LibraryShowNumbersOfItemsState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2105,14 +2108,14 @@ class LibraryShowNumbersOfItemsStateProvider origin: this, override: LibraryShowNumbersOfItemsStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -2127,14 +2130,14 @@ class LibraryShowNumbersOfItemsStateProvider @override bool operator ==(Object other) { return other is LibraryShowNumbersOfItemsStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -2145,8 +2148,8 @@ class LibraryShowNumbersOfItemsStateProvider // ignore: unused_element mixin LibraryShowNumbersOfItemsStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -2158,23 +2161,23 @@ class _LibraryShowNumbersOfItemsStateProviderElement _LibraryShowNumbersOfItemsStateProviderElement(super.provider); @override - bool get isManga => - (origin as LibraryShowNumbersOfItemsStateProvider).isManga; + ItemType get itemType => + (origin as LibraryShowNumbersOfItemsStateProvider).itemType; @override Settings get settings => (origin as LibraryShowNumbersOfItemsStateProvider).settings; } String _$libraryShowContinueReadingButtonStateHash() => - r'28b1d4c45a55f5325903161b8fc4282cb6f4290e'; + r'a346c04b41c448c145107f862bbfa86f119edba1'; abstract class _$LibraryShowContinueReadingButtonState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -2191,11 +2194,11 @@ class LibraryShowContinueReadingButtonStateFamily extends Family { /// See also [LibraryShowContinueReadingButtonState]. LibraryShowContinueReadingButtonStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryShowContinueReadingButtonStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2205,7 +2208,7 @@ class LibraryShowContinueReadingButtonStateFamily extends Family { covariant LibraryShowContinueReadingButtonStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -2231,11 +2234,11 @@ class LibraryShowContinueReadingButtonStateProvider LibraryShowContinueReadingButtonState, bool> { /// See also [LibraryShowContinueReadingButtonState]. LibraryShowContinueReadingButtonStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryShowContinueReadingButtonState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryShowContinueReadingButtonStateProvider, name: r'libraryShowContinueReadingButtonStateProvider', @@ -2247,7 +2250,7 @@ class LibraryShowContinueReadingButtonStateProvider LibraryShowContinueReadingButtonStateFamily._dependencies, allTransitiveDependencies: LibraryShowContinueReadingButtonStateFamily ._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -2258,11 +2261,11 @@ class LibraryShowContinueReadingButtonStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -2270,7 +2273,7 @@ class LibraryShowContinueReadingButtonStateProvider covariant LibraryShowContinueReadingButtonState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2282,14 +2285,14 @@ class LibraryShowContinueReadingButtonStateProvider origin: this, override: LibraryShowContinueReadingButtonStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -2304,14 +2307,14 @@ class LibraryShowContinueReadingButtonStateProvider @override bool operator ==(Object other) { return other is LibraryShowContinueReadingButtonStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -2322,8 +2325,8 @@ class LibraryShowContinueReadingButtonStateProvider // ignore: unused_element mixin LibraryShowContinueReadingButtonStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -2336,23 +2339,23 @@ class _LibraryShowContinueReadingButtonStateProviderElement _LibraryShowContinueReadingButtonStateProviderElement(super.provider); @override - bool get isManga => - (origin as LibraryShowContinueReadingButtonStateProvider).isManga; + ItemType get itemType => + (origin as LibraryShowContinueReadingButtonStateProvider).itemType; @override Settings get settings => (origin as LibraryShowContinueReadingButtonStateProvider).settings; } String _$sortLibraryMangaStateHash() => - r'0e18c577b3b88a6dede7533393c9b8f744b32a33'; + r'5454965fd1c6c027e5a2dfc93c2570e800bf18c0'; abstract class _$SortLibraryMangaState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; SortLibraryManga build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -2368,11 +2371,11 @@ class SortLibraryMangaStateFamily extends Family { /// See also [SortLibraryMangaState]. SortLibraryMangaStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return SortLibraryMangaStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2382,7 +2385,7 @@ class SortLibraryMangaStateFamily extends Family { covariant SortLibraryMangaStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -2407,11 +2410,11 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< SortLibraryMangaState, SortLibraryManga> { /// See also [SortLibraryMangaState]. SortLibraryMangaStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => SortLibraryMangaState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: sortLibraryMangaStateProvider, name: r'sortLibraryMangaStateProvider', @@ -2422,7 +2425,7 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< dependencies: SortLibraryMangaStateFamily._dependencies, allTransitiveDependencies: SortLibraryMangaStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -2433,11 +2436,11 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -2445,7 +2448,7 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< covariant SortLibraryMangaState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2456,14 +2459,14 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< origin: this, override: SortLibraryMangaStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -2478,14 +2481,14 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< @override bool operator ==(Object other) { return other is SortLibraryMangaStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -2496,8 +2499,8 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< // ignore: unused_element mixin SortLibraryMangaStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -2509,7 +2512,7 @@ class _SortLibraryMangaStateProviderElement _SortLibraryMangaStateProviderElement(super.provider); @override - bool get isManga => (origin as SortLibraryMangaStateProvider).isManga; + ItemType get itemType => (origin as SortLibraryMangaStateProvider).itemType; @override Settings get settings => (origin as SortLibraryMangaStateProvider).settings; } @@ -2548,7 +2551,7 @@ final isLongPressedMangaStateProvider = typedef _$IsLongPressedMangaState = AutoDisposeNotifier; String _$mangasSetIsReadStateHash() => - r'cb88914fe1c47c1e3a29d43c23a6652b0e8f2ac1'; + r'8f86296f588a48747de625e0471048978ee9bdeb'; abstract class _$MangasSetIsReadState extends BuildlessAutoDisposeNotifier { @@ -2695,7 +2698,7 @@ class _MangasSetIsReadStateProviderElement } String _$mangasSetUnReadStateHash() => - r'7b2f4c579f9cb392830ed4d70aff9ccc3e7952a0'; + r'3413e731b2fd8476a4032d3e47b943ca12f25090'; abstract class _$MangasSetUnReadState extends BuildlessAutoDisposeNotifier { diff --git a/lib/modules/library/providers/local_archive.dart b/lib/modules/library/providers/local_archive.dart index 98b57e6..2125b45 100644 --- a/lib/modules/library/providers/local_archive.dart +++ b/lib/modules/library/providers/local_archive.dart @@ -11,11 +11,11 @@ part 'local_archive.g.dart'; @riverpod Future importArchivesFromFile(Ref ref, Manga? mManga, - {required bool isManga, required bool init}) async { + {required ItemType itemType, required bool init}) async { FilePickerResult? result = await FilePicker.platform.pickFiles( allowMultiple: true, type: FileType.custom, - allowedExtensions: isManga + allowedExtensions: itemType == ItemType.manga ? ['cbz', 'zip'] : ['mp4', 'mov', 'avi', 'flv', 'wmv', 'mpeg', 'mkv']); if (result != null) { @@ -25,7 +25,7 @@ Future importArchivesFromFile(Ref ref, Manga? mManga, favorite: true, source: 'archive', author: '', - isManga: isManga, + itemType: itemType, genre: [], imageUrl: '', lang: '', @@ -39,20 +39,20 @@ Future importArchivesFromFile(Ref ref, Manga? mManga, artist: '', ); for (var file in result.files.reversed.toList()) { - (String, LocalExtensionType, Uint8List, String)? data = isManga + (String, LocalExtensionType, Uint8List, String)? data = itemType == ItemType.manga ? await ref.watch(getArchivesDataFromFileProvider(file.path!).future) : null; String name = _getName(file.path!); if (init) { - manga.customCoverImage = isManga ? data!.$3 : null; + manga.customCoverImage = itemType == ItemType.manga ? data!.$3 : null; } isar.writeTxnSync(() { isar.mangas.putSync(manga); final chapters = Chapter( - name: isManga ? data!.$1 : name, - archivePath: isManga ? data!.$4 : file.path, + name: itemType == ItemType.manga ? data!.$1 : name, + archivePath: itemType == ItemType.manga ? data!.$4 : file.path, mangaId: manga.id) ..manga.value = manga; isar.chapters.putSync(chapters); diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index 41d4e9d..842e199 100644 --- a/lib/modules/library/providers/local_archive.g.dart +++ b/lib/modules/library/providers/local_archive.g.dart @@ -7,7 +7,7 @@ part of 'local_archive.dart'; // ************************************************************************** String _$importArchivesFromFileHash() => - r'8be95f0947ab5247e3305a355a6f17f0aaecad00'; + r'8e6e592c927ad080e93d54dac1144ef8637a7e52'; /// Copied from Dart SDK class _SystemHash { @@ -42,12 +42,12 @@ class ImportArchivesFromFileFamily extends Family { /// See also [importArchivesFromFile]. ImportArchivesFromFileProvider call( Manga? mManga, { - required bool isManga, + required ItemType itemType, required bool init, }) { return ImportArchivesFromFileProvider( mManga, - isManga: isManga, + itemType: itemType, init: init, ); } @@ -58,7 +58,7 @@ class ImportArchivesFromFileFamily extends Family { ) { return call( provider.mManga, - isManga: provider.isManga, + itemType: provider.itemType, init: provider.init, ); } @@ -84,13 +84,13 @@ class ImportArchivesFromFileProvider /// See also [importArchivesFromFile]. ImportArchivesFromFileProvider( Manga? mManga, { - required bool isManga, + required ItemType itemType, required bool init, }) : this._internal( (ref) => importArchivesFromFile( ref as ImportArchivesFromFileRef, mManga, - isManga: isManga, + itemType: itemType, init: init, ), from: importArchivesFromFileProvider, @@ -103,7 +103,7 @@ class ImportArchivesFromFileProvider allTransitiveDependencies: ImportArchivesFromFileFamily._allTransitiveDependencies, mManga: mManga, - isManga: isManga, + itemType: itemType, init: init, ); @@ -115,12 +115,12 @@ class ImportArchivesFromFileProvider required super.debugGetCreateSourceHash, required super.from, required this.mManga, - required this.isManga, + required this.itemType, required this.init, }) : super.internal(); final Manga? mManga; - final bool isManga; + final ItemType itemType; final bool init; @override @@ -137,7 +137,7 @@ class ImportArchivesFromFileProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mManga: mManga, - isManga: isManga, + itemType: itemType, init: init, ), ); @@ -152,7 +152,7 @@ class ImportArchivesFromFileProvider bool operator ==(Object other) { return other is ImportArchivesFromFileProvider && other.mManga == mManga && - other.isManga == isManga && + other.itemType == itemType && other.init == init; } @@ -160,7 +160,7 @@ class ImportArchivesFromFileProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mManga.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, init.hashCode); return _SystemHash.finish(hash); @@ -173,8 +173,8 @@ mixin ImportArchivesFromFileRef on AutoDisposeFutureProviderRef { /// The parameter `mManga` of this provider. Manga? get mManga; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `init` of this provider. bool get init; @@ -188,7 +188,7 @@ class _ImportArchivesFromFileProviderElement @override Manga? get mManga => (origin as ImportArchivesFromFileProvider).mManga; @override - bool get isManga => (origin as ImportArchivesFromFileProvider).isManga; + ItemType get itemType => (origin as ImportArchivesFromFileProvider).itemType; @override bool get init => (origin as ImportArchivesFromFileProvider).init; } diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 13854d8..c7bac6a 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -29,7 +29,7 @@ class LibraryGridViewWidget extends StatefulWidget { final bool downloadedChapter; final bool continueReaderBtn; final bool localSource; - final bool isManga; + final ItemType itemType; const LibraryGridViewWidget( {super.key, required this.entriesManga, @@ -40,7 +40,7 @@ class LibraryGridViewWidget extends StatefulWidget { required this.continueReaderBtn, required this.mangaIdsList, required this.localSource, - required this.isManga}); + required this.itemType}); @override State createState() => _LibraryGridViewWidgetState(); @@ -51,10 +51,10 @@ class _LibraryGridViewWidgetState extends State { Widget build(BuildContext context) { return Consumer(builder: (context, ref, child) { final isLongPressed = ref.watch(isLongPressedMangaStateProvider); - final isManga = widget.isManga; + final itemType = widget.itemType; final gridSize = - ref.watch(libraryGridSizeStateProvider(isManga: isManga)); + ref.watch(libraryGridSizeStateProvider(itemType: itemType)); return GridViewWidget( gridSize: gridSize, childAspectRatio: widget.isComfortableGrid ? 0.642 : 0.69, @@ -97,9 +97,9 @@ class _LibraryGridViewWidgetState extends State { mangaM: entry, source: entry.source!); ref.invalidate(getAllMangaWithoutCategoriesStreamProvider( - isManga: widget.isManga)); + itemType: widget.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); } }, onLongPress: () { @@ -279,7 +279,7 @@ class _LibraryGridViewWidgetState extends State { .idIsNotNull() .and() .chapter((q) => q.manga((q) => - q.isMangaEqualTo(entry.isManga!))) + q.itemTypeEqualTo(entry.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && diff --git a/lib/modules/library/widgets/library_listview_widget.dart b/lib/modules/library/widgets/library_listview_widget.dart index 0b816ed..4c12893 100644 --- a/lib/modules/library/widgets/library_listview_widget.dart +++ b/lib/modules/library/widgets/library_listview_widget.dart @@ -59,9 +59,9 @@ class LibraryListViewWidget extends StatelessWidget { mangaM: entry, source: entry.source!); ref.invalidate(getAllMangaWithoutCategoriesStreamProvider( - isManga: entry.isManga)); + itemType: entry.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: entry.isManga)); + categoryId: null, itemType: entry.itemType)); } }, onLongPress: () { @@ -264,7 +264,7 @@ class LibraryListViewWidget extends StatelessWidget { .idIsNotNull() .and() .chapter((q) => q.manga((q) => - q.isMangaEqualTo(entry.isManga!))) + q.itemTypeEqualTo(entry.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index 923a685..6efe6e8 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -7,6 +7,7 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.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'; @@ -54,16 +55,34 @@ class MainScreen extends ConsumerWidget { final location = ref.watch( routerCurrentLocationStateProvider(context), ); - bool isReadingScreen = - location == '/mangareaderview' || location == '/animePlayerView'; - int currentIndex = switch (location) { - null || '/MangaLibrary' => 0, - '/AnimeLibrary' => 1, - '/updates' => 2, - '/history' => 3, - '/browse' => 4, - _ => 5, - }; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + bool isReadingScreen = location == '/mangaReaderView' || + location == '/animePlayerView' || + location == '/novelReaderView'; + final dest = [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; + if (hideManga) { + dest.removeWhere((d) => d == "/MangaLibrary"); + } + if (hideAnime) { + dest.removeWhere((d) => d == "/AnimeLibrary"); + } + if (hideNovel) { + dest.removeWhere((d) => d == "/NovelLibrary"); + } + int currentIndex = dest.indexOf(location ?? "/more"); + if (currentIndex == -1) { + currentIndex = dest.length - 1; + } final incognitoMode = ref.watch(incognitoModeStateProvider); final isLongPressed = ref.watch(isLongPressedMangaStateProvider); @@ -111,6 +130,7 @@ class MainScreen extends ConsumerWidget { null => 100, != '/MangaLibrary' && != '/AnimeLibrary' && + != '/NovelLibrary' && != '/history' && != '/updates' && != '/browse' && @@ -132,29 +152,50 @@ class MainScreen extends ConsumerWidget { labelType: NavigationRailLabelType.all, useIndicator: true, destinations: [ + if (!hideManga) + NavigationRailDestination( + selectedIcon: const Icon( + Icons.collections_bookmark), + icon: const Icon(Icons + .collections_bookmark_outlined), + label: Padding( + padding: + const EdgeInsets.only( + top: 5), + child: Text(l10n.manga))), + if (!hideAnime) + NavigationRailDestination( + selectedIcon: const Icon( + Icons.video_collection), + icon: const Icon(Icons + .video_collection_outlined), + label: Padding( + padding: + const EdgeInsets.only( + top: 5), + child: Text(l10n.anime))), + if (!hideNovel) + NavigationRailDestination( + selectedIcon: const Icon( + Icons.local_library), + icon: const Icon( + Icons.local_library_outlined), + label: Padding( + padding: + const EdgeInsets.only( + top: 5), + child: Text(l10n.novel))), NavigationRailDestination( - selectedIcon: const Icon( - Icons.collections_bookmark), - icon: const Icon(Icons - .collections_bookmark_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.manga))), - NavigationRailDestination( - selectedIcon: const Icon( - Icons.video_collection), - icon: const Icon(Icons - .video_collection_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.anime))), - NavigationRailDestination( - selectedIcon: - const Icon(Icons.new_releases), - icon: const Icon( - Icons.new_releases_outlined), + selectedIcon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon( + Icons.new_releases), + ), + icon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon( + Icons.new_releases_outlined), + ), label: Padding( padding: const EdgeInsets.only( top: 5), @@ -183,10 +224,19 @@ class MainScreen extends ConsumerWidget { top: 5), child: Text(l10n.history))), NavigationRailDestination( - selectedIcon: - const Icon(Icons.explore), - icon: const Icon( - Icons.explore_outlined), + selectedIcon: Badge( + label: + _extensionUpdateTotalNumbers( + ref), + child: const Icon(Icons.explore), + ), + icon: Badge( + label: + _extensionUpdateTotalNumbers( + ref), + child: const Icon( + Icons.explore_outlined), + ), label: Padding( padding: const EdgeInsets.only( top: 5), @@ -203,27 +253,34 @@ class MainScreen extends ConsumerWidget { ], selectedIndex: currentIndex, onDestinationSelected: (newIndex) { - final fn = switch (newIndex) { - 0 => route.go('/MangaLibrary'), - 1 => route.go('/AnimeLibrary'), - 2 => route.go('/updates'), - 3 => route.go('/history'), - 4 => route.go('/browse'), - _ => route.go('/more'), - }; - fn; + final dest = [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; + if (hideManga) { + dest.removeWhere( + (d) => d == "/MangaLibrary"); + } + if (hideAnime) { + dest.removeWhere( + (d) => d == "/AnimeLibrary"); + } + if (hideNovel) { + dest.removeWhere( + (d) => d == "/NovelLibrary"); + } + route.go(dest[newIndex >= dest.length + ? dest.length - 1 + : newIndex]); }, ); }), ), - Positioned( - right: 18, - top: 140, - child: _updatesTotalNumbers(ref)), - Positioned( - right: 18, - top: 275, - child: _extensionUpdateTotalNumbers(ref)), ], ), ), @@ -242,6 +299,7 @@ class MainScreen extends ConsumerWidget { null => null, != '/MangaLibrary' && != '/AnimeLibrary' && + != '/NovelLibrary' && != '/history' && != '/updates' && != '/browse' && @@ -260,63 +318,76 @@ class MainScreen extends ConsumerWidget { const Duration(milliseconds: 500), selectedIndex: currentIndex, destinations: [ + if (!hideManga) + NavigationDestination( + selectedIcon: + const Icon(Icons.collections_bookmark), + icon: const Icon( + Icons.collections_bookmark_outlined), + label: l10n.manga), + if (!hideAnime) + NavigationDestination( + selectedIcon: + const Icon(Icons.video_collection), + icon: const Icon( + Icons.video_collection_outlined), + label: l10n.anime), + if (!hideNovel) + NavigationDestination( + selectedIcon: + const Icon(Icons.local_library), + icon: const Icon( + Icons.local_library_outlined), + label: l10n.novel), NavigationDestination( - selectedIcon: - const Icon(Icons.collections_bookmark), - icon: const Icon( - Icons.collections_bookmark_outlined), - label: l10n.manga), - NavigationDestination( - selectedIcon: - const Icon(Icons.video_collection), - icon: const Icon( - Icons.video_collection_outlined), - label: l10n.anime), - Stack( - children: [ - NavigationDestination( - selectedIcon: - const Icon(Icons.new_releases), - icon: const Icon( - Icons.new_releases_outlined), - label: l10n.updates), - Positioned( - right: 14, - top: 3, - child: _updatesTotalNumbers(ref)), - ], - ), + selectedIcon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon(Icons.new_releases), + ), + icon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon(Icons.new_releases), + ), + label: l10n.updates), NavigationDestination( selectedIcon: const Icon(Icons.history), icon: const Icon(Icons.history_outlined), label: l10n.history), - Stack( - children: [ - NavigationDestination( - selectedIcon: const Icon(Icons.explore), - icon: const Icon(Icons.explore_outlined), - label: l10n.browse), - Positioned( - right: 14, - top: 3, - child: _extensionUpdateTotalNumbers(ref)), - ], - ), + NavigationDestination( + selectedIcon: Badge( + label: _extensionUpdateTotalNumbers(ref), + child: const Icon(Icons.explore)), + icon: Badge( + label: _extensionUpdateTotalNumbers(ref), + child: const Icon(Icons.explore)), + label: l10n.browse), NavigationDestination( selectedIcon: const Icon(Icons.more_horiz), icon: const Icon(Icons.more_horiz_outlined), label: l10n.more), ], onDestinationSelected: (newIndex) { - final fn = switch (newIndex) { - 0 => route.go('/MangaLibrary'), - 1 => route.go('/AnimeLibrary'), - 2 => route.go('/updates'), - 3 => route.go('/history'), - 4 => route.go('/browse'), - _ => route.go('/more'), - }; - fn; + final dest = [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; + if (hideManga) { + dest.removeWhere((d) => d == "/MangaLibrary"); + } + if (hideAnime) { + dest.removeWhere((d) => d == "/AnimeLibrary"); + } + if (hideNovel) { + dest.removeWhere((d) => d == "/NovelLibrary"); + } + route.go(dest[newIndex >= dest.length + ? dest.length - 1 + : newIndex]); }, ), ), @@ -348,25 +419,9 @@ Widget _extensionUpdateTotalNumbers(WidgetRef ref) { .where((element) => compareVersions(element.version!, element.versionLast!) < 0) .toList(); - return entries.isEmpty - ? Container() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: const Color.fromARGB(255, 176, 46, 37)), - child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 5, vertical: 3), - child: Text( - entries.length.toString(), - style: TextStyle( - fontSize: 10, - color: Theme.of(context).textTheme.bodySmall!.color), - ), - ), - ); + return entries.isEmpty ? Text("0") : Text("${entries.length}"); } - return Container(); + return Text("0"); }); } @@ -381,24 +436,8 @@ Widget _updatesTotalNumbers(WidgetRef ref) { } return !(element.chapter.value?.isRead ?? false); }).toList(); - return entries.isEmpty - ? Container() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: const Color.fromARGB(255, 176, 46, 37)), - child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 5, vertical: 3), - child: Text( - entries.length.toString(), - style: TextStyle( - fontSize: 10, - color: Theme.of(context).textTheme.bodySmall!.color), - ), - ), - ); + return entries.isEmpty ? Text("0") : Text("${entries.length}"); } - return Container(); + return Text("0"); }); } diff --git a/lib/modules/main_view/providers/migration.dart b/lib/modules/main_view/providers/migration.dart index ced3bdc..e4d2172 100644 --- a/lib/modules/main_view/providers/migration.dart +++ b/lib/modules/main_view/providers/migration.dart @@ -21,10 +21,8 @@ Future migration(Ref ref) async { .chapterIdIsNull() .or() .idIsNotNull() - .isMangaIsNull() .findAllSync(); - final tracks = - isar.tracks.filter().idIsNotNull().isMangaIsNull().findAllSync(); + final tracks = isar.tracks.filter().idIsNotNull().findAllSync(); isar.writeTxnSync(() { //mangaId in chapter @@ -40,14 +38,17 @@ Future migration(Ref ref) async { //chapterId and isManga in History for (var history in histories) { final chapterId = history.chapter.value?.id; - final isManga = history.chapter.value?.manga.value?.isManga; + final itemType = + history.chapter.value?.manga.value?.itemType ?? ItemType.manga; isar.historys.putSync(history ..chapterId = chapterId - ..isManga = isManga); + ..itemType = itemType); } // isManga in Track for (var track in tracks) { - final isManga = isar.mangas.getSync(track.mangaId!)?.isManga; + final isManga = + (isar.mangas.getSync(track.mangaId!)?.itemType ?? ItemType.manga) == + ItemType.manga; isar.tracks.putSync(track..isManga = isManga); } }); diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index f67f692..5b40519 100644 --- a/lib/modules/main_view/providers/migration.g.dart +++ b/lib/modules/main_view/providers/migration.g.dart @@ -6,7 +6,7 @@ part of 'migration.dart'; // RiverpodGenerator // ************************************************************************** -String _$migrationHash() => r'a302c6da3c1545c952a28e76a6d0b7af3fde1e7a'; +String _$migrationHash() => r'403da626b6a797854dde7ae77b4ea452300c40e6'; /// See also [migration]. @ProviderFor(migration) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index dd39529..11652e9 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -22,7 +22,6 @@ import 'package:mangayomi/modules/manga/detail/widgets/tracker_search_widget.dar import 'package:mangayomi/modules/manga/detail/widgets/tracker_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; @@ -59,7 +58,7 @@ class MangaDetailView extends ConsumerStatefulWidget { final Manga? manga; final bool sourceExist; final Function(bool) checkForUpdate; - final bool isManga; + final ItemType itemType; const MangaDetailView( {super.key, @@ -70,7 +69,7 @@ class MangaDetailView extends ConsumerStatefulWidget { required this.sourceExist, required this.manga, required this.checkForUpdate, - required this.isManga}); + required this.itemType}); @override ConsumerState createState() => _MangaDetailViewState(); @@ -382,30 +381,35 @@ class _MangaDetailViewState extends ConsumerState return [ PopupMenuItem( value: 0, - child: Text(widget.isManga + child: Text(widget.itemType != + ItemType.anime ? context.l10n.next_chapter : context.l10n.next_episode)), PopupMenuItem( value: 1, - child: Text(widget.isManga + child: Text(widget.itemType != + ItemType.anime ? context.l10n.next_5_chapters : context .l10n.next_5_episodes)), PopupMenuItem( value: 2, - child: Text(widget.isManga + child: Text(widget.itemType != + ItemType.anime ? context.l10n.next_10_chapters : context .l10n.next_10_episodes)), PopupMenuItem( value: 3, - child: Text(widget.isManga + child: Text(widget.itemType != + ItemType.anime ? context.l10n.next_25_chapters : context .l10n.next_25_episodes)), PopupMenuItem( value: 4, - child: Text(widget.isManga + child: Text(widget.itemType != + ItemType.anime ? context.l10n.unread : context.l10n.unwatched)), ]; @@ -521,7 +525,12 @@ class _MangaDetailViewState extends ConsumerState if (value == 0) { context.push("/categories", extra: ( true, - widget.manga!.isManga! ? 0 : 1 + widget.manga!.itemType == ItemType.manga + ? 0 + : widget.manga!.itemType == + ItemType.anime + ? 1 + : 2 )); } else if (value == 1) { } else if (value == 2) { @@ -593,7 +602,9 @@ class _MangaDetailViewState extends ConsumerState 8), child: Text( widget.manga! - .isManga! + .itemType != + ItemType + .anime ? l10n.n_chapters( chapters .length) @@ -622,7 +633,10 @@ class _MangaDetailViewState extends ConsumerState color: context .secondaryColor), label: Text( - widget.manga!.isManga! + widget.manga! + .itemType != + ItemType + .anime ? l10n .add_chapters : l10n @@ -644,8 +658,9 @@ class _MangaDetailViewState extends ConsumerState manga: manga); } else { await ref.watch(importArchivesFromFileProvider( - isManga: manga - .isManga!, + itemType: + manga + .itemType, manga, init: false) @@ -717,11 +732,6 @@ class _MangaDetailViewState extends ConsumerState isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isBookmarked = !chapter.isBookmarked!; - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync( chapter..manga.value = widget.manga); chapter.manga.saveSync(); @@ -762,11 +772,6 @@ class _MangaDetailViewState extends ConsumerState if (!chapter.isRead!) { chapter.lastPageRead = "1"; } - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync( chapter..manga.value = widget.manga); chapter.manga.saveSync(); @@ -812,12 +817,6 @@ class _MangaDetailViewState extends ConsumerState if (!chapters[i].isRead!) { chapters[i].isRead = true; chapters[i].lastPageRead = "1"; - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter( - chapters[i], false, false); isar.chapters.putSync(chapters[i] ..manga.value = widget.manga); chapters[i].manga.saveSync(); @@ -996,7 +995,9 @@ class _MangaDetailViewState extends ConsumerState .update(); }), ListTileChapterFilter( - label: widget.isManga ? l10n.unread : l10n.unwatched, + label: widget.itemType != ItemType.anime + ? l10n.unread + : l10n.unwatched, type: ref.watch(chapterFilterUnreadStateProvider( mangaId: widget.manga!.id!)), onTap: () { @@ -1193,8 +1194,9 @@ class _MangaDetailViewState extends ConsumerState ), RadioListTile( dense: true, - title: Text( - widget.isManga ? l10n.chapter_number : l10n.episode_number), + title: Text(widget.itemType != ItemType.anime + ? l10n.chapter_number + : l10n.episode_number), value: "ej", groupValue: "e", selected: false, @@ -1211,7 +1213,9 @@ class _MangaDetailViewState extends ConsumerState if (index == 0) { return l10n.by_scanlator; } else if (index == 1) { - return widget.isManga ? l10n.by_chapter_number : l10n.by_episode_number; + return widget.itemType != ItemType.anime + ? l10n.by_chapter_number + : l10n.by_episode_number; } else if (index == 2) { return l10n.by_upload_date; } @@ -1373,7 +1377,7 @@ class _MangaDetailViewState extends ConsumerState padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - widget.manga!.isManga! + widget.manga!.itemType != ItemType.anime ? l10n.n_chapters(chapterLength) : l10n.n_episodes(chapterLength), style: const TextStyle( @@ -1390,7 +1394,7 @@ class _MangaDetailViewState extends ConsumerState icon: Icon(Icons.add, color: context.secondaryColor), label: Text( - widget.manga!.isManga! + widget.manga!.itemType != ItemType.anime ? l10n.add_chapters : l10n.add_episodes, style: TextStyle( @@ -1404,7 +1408,7 @@ class _MangaDetailViewState extends ConsumerState } else { await ref.watch( importArchivesFromFileProvider( - isManga: manga.isManga!, + itemType: manga.itemType, manga, init: false) .future); @@ -1652,7 +1656,8 @@ class _MangaDetailViewState extends ConsumerState final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.isManga!, + isManga: widget.manga!.itemType != + ItemType.anime, track: Track( status: TrackStatus.planToRead, @@ -1975,14 +1980,16 @@ class _MangaDetailViewState extends ConsumerState mangaId: widget.manga!.id!, syncId: entries[index].syncId!, trackRes: trackRes.first, - isManga: widget.manga!.isManga!) + isManga: + widget.manga!.itemType == ItemType.manga) : TrackListile( text: l10nLocalizations(context)!.add_tracker, onTap: () async { final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.isManga!, + isManga: widget.manga!.itemType != + ItemType.anime, track: Track( status: TrackStatus.planToRead, syncId: entries[index].syncId!, @@ -1992,7 +1999,9 @@ class _MangaDetailViewState extends ConsumerState await ref .read(trackStateProvider( track: null, - isManga: widget.manga!.isManga!) + isManga: + widget.manga!.itemType != + ItemType.anime) .notifier) .setTrackSearch( trackSearch, diff --git a/lib/modules/manga/detail/manga_details_view.dart b/lib/modules/manga/detail/manga_details_view.dart index 8302967..43cc87c 100644 --- a/lib/modules/manga/detail/manga_details_view.dart +++ b/lib/modules/manga/detail/manga_details_view.dart @@ -69,11 +69,13 @@ class _MangaDetailsViewState extends ConsumerState { .idIsNotNull() .and() .chapter((q) => q.manga( - (q) => q.isMangaEqualTo(widget.manga.isManga!))) + (q) => q.itemTypeEqualTo(widget.manga.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { String buttonLabel = - widget.manga.isManga! ? l10n.read : l10n.watch; + widget.manga.itemType != ItemType.anime + ? l10n.read + : l10n.watch; if (snapshot.hasData && snapshot.data!.isNotEmpty) { final incognitoMode = ref.watch(incognitoModeStateProvider); @@ -224,7 +226,7 @@ class _MangaDetailsViewState extends ConsumerState { .filter() .idIsNotNull() .and() - .forMangaEqualTo(widget.manga.isManga) + .forItemTypeEqualTo(widget.manga.itemType) .isNotEmptySync(); if (checkCategoryList) { _openCategory(widget.manga); @@ -262,7 +264,7 @@ class _MangaDetailsViewState extends ConsumerState { }, sourceExist: widget.sourceExist, checkForUpdate: widget.checkForUpdate, - isManga: widget.manga.isManga!, + itemType: widget.manga.itemType, ), ); } @@ -286,7 +288,7 @@ class _MangaDetailsViewState extends ConsumerState { .filter() .idIsNotNull() .and() - .forMangaEqualTo(widget.manga.isManga) + .forItemTypeEqualTo(widget.manga.itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data!.isNotEmpty) { @@ -323,8 +325,14 @@ class _MangaDetailsViewState extends ConsumerState { children: [ TextButton( onPressed: () { - context.push("/categories", - extra: (true, widget.manga.isManga! ? 0 : 1)); + context.push("/categories", extra: ( + true, + widget.manga.itemType == ItemType.manga + ? 0 + : widget.manga.itemType == ItemType.anime + ? 1 + : 2 + )); Navigator.pop(context); }, child: Text(l10n.edit)), diff --git a/lib/modules/manga/detail/providers/state_providers.dart b/lib/modules/manga/detail/providers/state_providers.dart index 017ccb7..7f07165 100644 --- a/lib/modules/manga/detail/providers/state_providers.dart +++ b/lib/modules/manga/detail/providers/state_providers.dart @@ -5,7 +5,6 @@ import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/download/providers/download_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'state_providers.g.dart'; @@ -310,9 +309,6 @@ class ChapterSetIsBookmarkState extends _$ChapterSetIsBookmarkState { isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isBookmarked = !chapter.isBookmarked!; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } @@ -332,9 +328,6 @@ class ChapterSetIsReadState extends _$ChapterSetIsReadState { isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isRead = !chapter.isRead!; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } diff --git a/lib/modules/manga/detail/providers/state_providers.g.dart b/lib/modules/manga/detail/providers/state_providers.g.dart index 86e3dbd..289dce7 100644 --- a/lib/modules/manga/detail/providers/state_providers.g.dart +++ b/lib/modules/manga/detail/providers/state_providers.g.dart @@ -816,7 +816,7 @@ class _ChapterFilterResultStateProviderElement } String _$chapterSetIsBookmarkStateHash() => - r'48d4f203ba51616e9d1142e0dd482d3ae065a4f4'; + r'113131bb13e50566390ee3e34aa2f08820a8870c'; abstract class _$ChapterSetIsBookmarkState extends BuildlessAutoDisposeNotifier { @@ -963,7 +963,7 @@ class _ChapterSetIsBookmarkStateProviderElement } String _$chapterSetIsReadStateHash() => - r'1e219dd68898fc30b6cb64d294377776516775d4'; + r'c319f81ec30565ad81a28cb0a8ce7fddcb47cd77'; abstract class _$ChapterSetIsReadState extends BuildlessAutoDisposeNotifier { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index fbbdfb6..80d630d 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -4,7 +4,6 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/services/get_detail.dart'; import 'package:mangayomi/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -49,7 +48,7 @@ Future updateMangaDetail(Ref ref, ..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link ..source = manga.source ..lang = manga.lang - ..isManga = source.isManga + ..itemType = source.itemType ..lastUpdate = DateTime.now().millisecondsSinceEpoch; final checkManga = isar.mangas.getSync(mangaId); if (checkManga!.chapters.isNotEmpty && isInit) { @@ -80,9 +79,6 @@ Future updateMangaDetail(Ref ref, } if (chapters.isNotEmpty) { for (var chap in chapters.reversed.toList()) { - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); chap.manga.saveSync(); if (manga.chapters.isNotEmpty) { @@ -105,9 +101,6 @@ Future updateMangaDetail(Ref ref, oldChap.name = newChap.name; oldChap.url = newChap.url; oldChap.scanlator = newChap.scanlator; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(oldChap, false, false); isar.chapters.putSync(oldChap); oldChap.manga.saveSync(); } diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index bf391d7..2ffd011 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'82c52aa8760fb455e6558be925d05f5f0703af98'; +String _$updateMangaDetailHash() => r'a86fe8fea46e411203182287c970cd80cc9a1a0c'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart index 8a45aac..2316bcd 100644 --- a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -90,13 +91,16 @@ class ChapterListTileWidget extends ConsumerWidget { children: [ const Text(' • '), Text( - !chapter.manga.value!.isManga! + chapter.manga.value!.itemType == ItemType.anime ? l10n.episode_progress(Duration( milliseconds: int.parse(chapter.lastPageRead!)) .toString() .substringBefore(".")) - : l10n.page(chapter.lastPageRead!), + : l10n.page(chapter.manga.value!.itemType == + ItemType.manga + ? chapter.lastPageRead! + : "${((double.tryParse(chapter.lastPageRead!) ?? 0) * 100).toStringAsFixed(0)} %"), style: TextStyle( fontSize: 11, color: context.isLight diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index 347d6e5..dfeecec 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/services/background_downloader/background_downloader.dart'; import 'package:isar/isar.dart'; @@ -46,10 +47,16 @@ Future> downloadChapter( : ""; final chapterName = chapter.name!.replaceForbiddenCharacters(' '); - final isManga = manga.isManga!; + final itemType = chapter.manga.value!.itemType; + final isManga = itemType == ItemType.manga; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final pathSegments = [ "downloads", - isManga ? "Manga" : "Anime", + itemTypePath, "${manga.source} (${manga.lang!.toUpperCase()})", manga.name!.replaceForbiddenCharacters('_'), ]; diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index 40f945a..4ae49a4 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'19e094ae3e51346012c43320b59ae99107fedf57'; +String _$downloadChapterHash() => r'de8e2d5b952071bc0d014fc3aa5c9b0714fbcee0'; /// 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 49362ff..ed6fb9e 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/eval/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_pages.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; @@ -520,14 +521,14 @@ class _MangaHomeScreenState extends ConsumerState { return buildProgressIndicator(); } return MangaHomeImageCardListTile( - isManga: source.isManga ?? true, + itemType: source.itemType, manga: _mangaList[index], source: source); }) : Consumer(builder: (context, ref, child) { final gridSize = ref.watch( libraryGridSizeStateProvider( - isManga: source.isManga!)); + itemType: source.itemType)); return GridViewWidget( gridSize: gridSize, @@ -540,7 +541,7 @@ class _MangaHomeScreenState extends ConsumerState { return buildProgressIndicator(); } return MangaHomeImageCard( - isManga: source.isManga ?? true, + itemType: source.itemType, manga: _mangaList[index], source: source, isComfortableGrid: isComfortableGrid, @@ -639,14 +640,14 @@ class _MangaHomeScreenState extends ConsumerState { class MangaHomeImageCard extends ConsumerStatefulWidget { final MManga manga; - final bool isManga; + final ItemType itemType; final Source source; final bool isComfortableGrid; const MangaHomeImageCard( {super.key, required this.manga, required this.source, - required this.isManga, + required this.itemType, required this.isComfortableGrid}); @override @@ -662,7 +663,7 @@ class _MangaHomeImageCardState extends ConsumerState return MangaImageCardWidget( getMangaDetail: widget.manga, source: widget.source, - isManga: widget.isManga, + itemType: widget.itemType, isComfortableGrid: widget.isComfortableGrid); } @@ -672,13 +673,13 @@ class _MangaHomeImageCardState extends ConsumerState class MangaHomeImageCardListTile extends ConsumerStatefulWidget { final MManga manga; - final bool isManga; + final ItemType itemType; final Source source; const MangaHomeImageCardListTile( {super.key, required this.manga, required this.source, - required this.isManga}); + required this.itemType}); @override ConsumerState createState() => @@ -695,7 +696,7 @@ class _MangaHomeImageCardListTileState return MangaImageCardListTileWidget( getMangaDetail: widget.manga, source: widget.source, - isManga: widget.isManga); + itemType: widget.itemType); } @override diff --git a/lib/modules/manga/reader/providers/push_router.dart b/lib/modules/manga/reader/providers/push_router.dart index abde10c..c55f54d 100644 --- a/lib/modules/manga/reader/providers/push_router.dart +++ b/lib/modules/manga/reader/providers/push_router.dart @@ -3,6 +3,7 @@ import 'package:go_router/go_router.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; Future pushMangaReaderView({ @@ -23,19 +24,31 @@ Future pushMangaReaderView({ .findAllSync() .isNotEmpty; if (sourceExist || chapter.manga.value!.isLocalArchive!) { - if (chapter.manga.value!.isManga!) { - await context.push('/mangareaderview', extra: chapter); - } else { - await context.push('/animePlayerView', extra: chapter); + switch (chapter.manga.value!.itemType) { + case ItemType.manga: + await context.push('/mangaReaderView', extra: chapter); + break; + case ItemType.anime: + await context.push('/animePlayerView', extra: chapter); + break; + case ItemType.novel: + await context.push('/novelReaderView', extra: chapter); + break; } } } void pushReplacementMangaReaderView( {required BuildContext context, required Chapter chapter}) { - if (chapter.manga.value!.isManga!) { - context.pushReplacement('/mangareaderview', extra: chapter); - } else { - context.pushReplacement('/animePlayerView', extra: chapter); - } + switch (chapter.manga.value!.itemType) { + case ItemType.manga: + context.pushReplacement('/mangaReaderView', extra: chapter); + break; + case ItemType.anime: + context.pushReplacement('/animePlayerView', extra: chapter); + break; + case ItemType.novel: + context.pushReplacement('/novelReaderView', extra: chapter); + break; + } } diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.dart b/lib/modules/manga/reader/providers/reader_controller_provider.dart index db7fd59..b1b4fdc 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.dart @@ -11,9 +11,7 @@ import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:mangayomi/utils/chapter_recognition.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'reader_controller_provider.g.dart'; @@ -171,7 +169,7 @@ class ReaderController extends _$ReaderController { history = History( mangaId: getManga().id, date: DateTime.now().millisecondsSinceEpoch.toString(), - isManga: getManga().isManga, + itemType: getManga().itemType, chapterId: chapter.id) ..chapter.value = chapter; } else { @@ -189,22 +187,12 @@ class ReaderController extends _$ReaderController { }); } - void checkAndSyncProgress() { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - if (syncAfterReading) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); - } - } - void setChapterBookmarked() { if (incognitoMode) return; final isBookmarked = getChapterBookmarked(); final chap = chapter; isar.writeTxnSync(() { chap.isBookmarked = !isBookmarked; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); }); } @@ -342,9 +330,6 @@ class ReaderController extends _$ReaderController { getIsarSetting()..chapterPageIndexList = chapterPageIndexs); chap.isRead = isRead; chap.lastPageRead = isRead ? '1' : (newIndex + 1).toString(); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); }); if (isRead) { @@ -379,7 +364,7 @@ extension ChapterExtensions on Chapter { final tracks = isar.tracks .filter() .idIsNotNull() - .isMangaEqualTo(manga.isManga) + .isMangaEqualTo(manga.itemType == ItemType.manga) .mangaIdEqualTo(manga.id!) .findAllSync(); @@ -398,15 +383,17 @@ extension ChapterExtensions on Chapter { track.status = TrackStatus.completed; track.finishedReadingDate = DateTime.now().millisecondsSinceEpoch; } else { - track.status = - manga.isManga! ? TrackStatus.reading : TrackStatus.watching; + track.status = manga.itemType == ItemType.manga + ? TrackStatus.reading + : TrackStatus.watching; if (track.lastChapterRead == 1) { track.startedReadingDate = DateTime.now().millisecondsSinceEpoch; } } } ref - .read(trackStateProvider(track: track, isManga: manga.isManga) + .read(trackStateProvider( + track: track, isManga: manga.itemType == ItemType.manga) .notifier) .updateManga(); } diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart index 5280200..18900f9 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart @@ -171,7 +171,7 @@ class _CurrentIndexProviderElement Chapter get chapter => (origin as CurrentIndexProvider).chapter; } -String _$readerControllerHash() => r'cc4f5fbe4192def4d19d9150340d305ba0ecf463'; +String _$readerControllerHash() => r'471617bf6fa730d837c8e0d9504bde17cfb635a8'; abstract class _$ReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index b7f5e71..b37dcce 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -143,7 +143,6 @@ class _MangaChapterPageGalleryState @override void dispose() { _readerController.setMangaHistoryUpdate(); - _readerController.checkAndSyncProgress(); _readerController.setPageIndex( _geCurrentIndex(_uChapDataPreload[_currentIndex!].index!), true); _rebuildDetail.close(); diff --git a/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart b/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart index d1dd431..6d7c50a 100644 --- a/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart +++ b/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart @@ -4,7 +4,6 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; @@ -138,7 +137,7 @@ class _ChapterListTileState extends State { if (!chapter.isRead!) if (chapter.lastPageRead!.isNotEmpty && chapter.lastPageRead != "1") - if (chapter.scanlator!.isNotEmpty) + if (chapter.scanlator != null && chapter.scanlator!.isNotEmpty) Row( children: [ const Text(' • '), @@ -160,8 +159,6 @@ class _ChapterListTileState extends State { isBookmarked = !isBookmarked; }); isar.writeTxnSync(() => { - addUpdatedChapterIndependentProvider.call( - chapter, false, false), isar.chapters.putSync(chapter..isBookmarked = isBookmarked), }); }, diff --git a/lib/modules/more/backup_and_restore/backup_and_restore.dart b/lib/modules/more/backup_and_restore/backup_and_restore.dart index 71aef1c..26b809f 100644 --- a/lib/modules/more/backup_and_restore/backup_and_restore.dart +++ b/lib/modules/more/backup_and_restore/backup_and_restore.dart @@ -385,7 +385,8 @@ List _getList(BuildContext context) { l10n.tracking, l10n.history, l10n.settings, - l10n.extensions + l10n.extensions, + l10n.updates ]; } diff --git a/lib/modules/more/backup_and_restore/providers/backup.dart b/lib/modules/more/backup_and_restore/providers/backup.dart index a973f0b..3e4e2d2 100644 --- a/lib/modules/more/backup_and_restore/providers/backup.dart +++ b/lib/modules/more/backup_and_restore/providers/backup.dart @@ -15,6 +15,7 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; +import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -28,7 +29,7 @@ void doBackUp(Ref ref, required String path, required BuildContext? context}) { Map datas = {}; - datas.addAll({"version": "1"}); + datas.addAll({"version": "2"}); if (list.contains(0)) { final res = isar.mangas .filter() @@ -116,6 +117,15 @@ void doBackUp(Ref ref, .toList(); datas.addAll({"extensions_preferences": resSourePref}); } + if (list.contains(7)) { + final res = isar.updates + .filter() + .idIsNotNull() + .findAllSync() + .map((e) => e.toJson()) + .toList(); + datas.addAll({"updates": res}); + } final regExp = RegExp(r'[^a-zA-Z0-9 .()\-\s]'); final name = 'mangayomi_${DateTime.now().toString().replaceAll(regExp, '_').replaceAll(' ', '_')}'; diff --git a/lib/modules/more/backup_and_restore/providers/backup.g.dart b/lib/modules/more/backup_and_restore/providers/backup.g.dart index a0d4695..6279730 100644 --- a/lib/modules/more/backup_and_restore/providers/backup.g.dart +++ b/lib/modules/more/backup_and_restore/providers/backup.g.dart @@ -6,7 +6,7 @@ part of 'backup.dart'; // RiverpodGenerator // ************************************************************************** -String _$doBackUpHash() => r'1082dfee2a9c9e5655a04d027fde40c29d634a6d'; +String _$doBackUpHash() => r'98c1eb56bd4937033c82accf71beb84c85a2acc6'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/backup_and_restore/providers/restore.dart b/lib/modules/more/backup_and_restore/providers/restore.dart index cd6c9b9..7926865 100644 --- a/lib/modules/more/backup_and_restore/providers/restore.dart +++ b/lib/modules/more/backup_and_restore/providers/restore.dart @@ -32,143 +32,274 @@ void doRestore(Ref ref, {required String path, required BuildContext context}) { final backup = jsonDecode(utf8.decode(archive.files.first.content)) as Map; if (backup['version'] == "1") { - try { - final manga = - (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); - final chapters = (backup["chapters"] as List?) - ?.map((e) => Chapter.fromJson(e)) - .toList(); - final categories = (backup["categories"] as List?) - ?.map((e) => Category.fromJson(e)) - .toList(); - final track = - (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); - final trackPreferences = (backup["trackPreferences"] as List?) - ?.map((e) => TrackPreference.fromJson(e)) - .toList(); - final history = (backup["history"] as List?) - ?.map((e) => History.fromJson(e)) - .toList(); - final downloads = (backup["downloads"] as List?) - ?.map((e) => Download.fromJson(e)) - .toList(); - final settings = (backup["settings"] as List?) - ?.map((e) => Settings.fromJson(e)) - .toList(); - final extensions = (backup["extensions"] as List?) - ?.map((e) => Source.fromJson(e)) - .toList(); - final extensionsPref = (backup["extensions_preferences"] as List?) - ?.map((e) => SourcePreference.fromJson(e)) - .toList(); - final updates = - (backup["updates"] as List?)?.map((e) => Update.fromJson(e)).toList(); + restoreV1(ref, backup); + } else if (backup['version'] == "2") { + restoreV2(ref, backup); + } + BotToast.showNotification( + animationDuration: const Duration(milliseconds: 200), + animationReverseDuration: const Duration(milliseconds: 200), + duration: const Duration(seconds: 5), + backButtonBehavior: BackButtonBehavior.none, + leading: (_) => Image.asset('assets/app_icons/icon-red.png', height: 40), + title: (_) => const Text( + "Backup restored!", + style: TextStyle(fontWeight: FontWeight.bold), + ), + enableSlideOff: true, + onlyOne: true, + crossPage: true); +} - isar.writeTxnSync(() { - isar.mangas.clearSync(); - if (manga != null) { - isar.mangas.putAllSync(manga); - if (chapters != null) { - isar.chapters.clearSync(); - for (var chapter in chapters) { - final manga = isar.mangas.getSync(chapter.mangaId!); - if (manga != null) { - isar.chapters.putSync(chapter..manga.value = manga); - chapter.manga.saveSync(); - } +@riverpod +void restoreV1(Ref ref, Map backup) { + try { + final manga = + (backup["manga"] as List?)?.map((e) => Manga.fromJsonV1(e)).toList(); + final chapters = + (backup["chapters"] as List?)?.map((e) => Chapter.fromJson(e)).toList(); + final categories = (backup["categories"] as List?) + ?.map((e) => Category.fromJsonV1(e)) + .toList(); + final track = + (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); + final trackPreferences = (backup["trackPreferences"] as List?) + ?.map((e) => TrackPreference.fromJson(e)) + .toList(); + final history = (backup["history"] as List?) + ?.map((e) => History.fromJsonV1(e)) + .toList(); + final downloads = (backup["downloads"] as List?) + ?.map((e) => Download.fromJson(e)) + .toList(); + final settings = (backup["settings"] as List?) + ?.map((e) => Settings.fromJson(e)) + .toList(); + final extensions = (backup["extensions"] as List?) + ?.map((e) => Source.fromJsonV1(e)) + .toList(); + final extensionsPref = (backup["extensions_preferences"] as List?) + ?.map((e) => SourcePreference.fromJson(e)) + .toList(); + final updates = + (backup["updates"] as List?)?.map((e) => Update.fromJson(e)).toList(); + + isar.writeTxnSync(() { + isar.mangas.clearSync(); + if (manga != null) { + isar.mangas.putAllSync(manga); + if (chapters != null) { + isar.chapters.clearSync(); + for (var chapter in chapters) { + final manga = isar.mangas.getSync(chapter.mangaId!); + if (manga != null) { + isar.chapters.putSync(chapter..manga.value = manga); + chapter.manga.saveSync(); } + } - isar.downloads.clearSync(); - if (downloads != null) { - for (var download in downloads) { - final chapter = isar.chapters.getSync(download.chapterId!); - if (chapter != null) { - isar.downloads.putSync(download..chapter.value = chapter); - download.chapter.saveSync(); - } - } - } - - isar.historys.clearSync(); - if (history != null) { - for (var element in history) { - final chapter = isar.chapters.getSync(element.chapterId!); - if (chapter != null) { - isar.historys.putSync(element..chapter.value = chapter); - element.chapter.saveSync(); - } - } - } - - isar.updates.clearSync(); - if (updates != null) { - final tempChapters = - isar.chapters.filter().idIsNotNull().findAllSync().toList(); - for (var update in updates) { - final matchingChapter = tempChapters - .where((chapter) => - chapter.mangaId == update.mangaId && - chapter.name == update.chapterName) - .firstOrNull; - if (matchingChapter != null) { - isar.updates.putSync(update..chapter.value = matchingChapter); - update.chapter.saveSync(); - } + isar.downloads.clearSync(); + if (downloads != null) { + for (var download in downloads) { + final chapter = isar.chapters.getSync(download.chapterId!); + if (chapter != null) { + isar.downloads.putSync(download..chapter.value = chapter); + download.chapter.saveSync(); } } } - isar.categorys.clearSync(); - if (categories != null) { - isar.categorys.putAllSync(categories); + isar.historys.clearSync(); + if (history != null) { + for (var element in history) { + final chapter = isar.chapters.getSync(element.chapterId!); + if (chapter != null) { + isar.historys.putSync(element..chapter.value = chapter); + element.chapter.saveSync(); + } + } + } + + isar.updates.clearSync(); + if (updates != null) { + final tempChapters = + isar.chapters.filter().idIsNotNull().findAllSync().toList(); + for (var update in updates) { + final matchingChapter = tempChapters + .where((chapter) => + chapter.mangaId == update.mangaId && + chapter.name == update.chapterName) + .firstOrNull; + if (matchingChapter != null) { + isar.updates.putSync(update..chapter.value = matchingChapter); + update.chapter.saveSync(); + } + } } } - isar.tracks.clearSync(); - if (track != null) { - isar.tracks.putAllSync(track); + isar.categorys.clearSync(); + if (categories != null) { + isar.categorys.putAllSync(categories); } + } - isar.trackPreferences.clearSync(); - if (trackPreferences != null) { - isar.trackPreferences.putAllSync(trackPreferences); - } + isar.tracks.clearSync(); + if (track != null) { + isar.tracks.putAllSync(track); + } - isar.sources.clearSync(); - if (extensions != null) { - isar.sources.putAllSync(extensions); - } + isar.trackPreferences.clearSync(); + if (trackPreferences != null) { + isar.trackPreferences.putAllSync(trackPreferences); + } - isar.sourcePreferences.clearSync(); - if (extensionsPref != null) { - isar.sourcePreferences.putAllSync(extensionsPref); - } - isar.settings.clearSync(); - if (settings != null) { - isar.settings.putAllSync(settings); - } - ref.invalidate(themeModeStateProvider); - ref.invalidate(blendLevelStateProvider); - ref.invalidate(flexSchemeColorStateProvider); - ref.invalidate(pureBlackDarkModeStateProvider); - ref.invalidate(l10nLocaleStateProvider); - }); - } catch (e) { - botToast(e.toString()); - } - BotToast.showNotification( - animationDuration: const Duration(milliseconds: 200), - animationReverseDuration: const Duration(milliseconds: 200), - duration: const Duration(seconds: 5), - backButtonBehavior: BackButtonBehavior.none, - leading: (_) => - Image.asset('assets/app_icons/icon-red.png', height: 40), - title: (_) => const Text( - "Backup restored!", - style: TextStyle(fontWeight: FontWeight.bold), - ), - enableSlideOff: true, - onlyOne: true, - crossPage: true); + isar.sources.clearSync(); + if (extensions != null) { + isar.sources.putAllSync(extensions); + } + + isar.sourcePreferences.clearSync(); + if (extensionsPref != null) { + isar.sourcePreferences.putAllSync(extensionsPref); + } + isar.settings.clearSync(); + if (settings != null) { + isar.settings.putAllSync(settings); + } + ref.invalidate(themeModeStateProvider); + ref.invalidate(blendLevelStateProvider); + ref.invalidate(flexSchemeColorStateProvider); + ref.invalidate(pureBlackDarkModeStateProvider); + ref.invalidate(l10nLocaleStateProvider); + }); + } catch (e) { + botToast(e.toString()); + } +} + +@riverpod +void restoreV2(Ref ref, Map backup) { + try { + final manga = + (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); + final chapters = + (backup["chapters"] as List?)?.map((e) => Chapter.fromJson(e)).toList(); + final categories = (backup["categories"] as List?) + ?.map((e) => Category.fromJson(e)) + .toList(); + final track = + (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); + final trackPreferences = (backup["trackPreferences"] as List?) + ?.map((e) => TrackPreference.fromJson(e)) + .toList(); + final history = + (backup["history"] as List?)?.map((e) => History.fromJson(e)).toList(); + final downloads = (backup["downloads"] as List?) + ?.map((e) => Download.fromJson(e)) + .toList(); + final settings = (backup["settings"] as List?) + ?.map((e) => Settings.fromJson(e)) + .toList(); + final extensions = (backup["extensions"] as List?) + ?.map((e) => Source.fromJson(e)) + .toList(); + final extensionsPref = (backup["extensions_preferences"] as List?) + ?.map((e) => SourcePreference.fromJson(e)) + .toList(); + final updates = + (backup["updates"] as List?)?.map((e) => Update.fromJson(e)).toList(); + + isar.writeTxnSync(() { + isar.mangas.clearSync(); + if (manga != null) { + isar.mangas.putAllSync(manga); + if (chapters != null) { + isar.chapters.clearSync(); + for (var chapter in chapters) { + final manga = isar.mangas.getSync(chapter.mangaId!); + if (manga != null) { + isar.chapters.putSync(chapter..manga.value = manga); + chapter.manga.saveSync(); + } + } + + isar.downloads.clearSync(); + if (downloads != null) { + for (var download in downloads) { + final chapter = isar.chapters.getSync(download.chapterId!); + if (chapter != null) { + isar.downloads.putSync(download..chapter.value = chapter); + download.chapter.saveSync(); + } + } + } + + isar.historys.clearSync(); + if (history != null) { + for (var element in history) { + final chapter = isar.chapters.getSync(element.chapterId!); + if (chapter != null) { + isar.historys.putSync(element..chapter.value = chapter); + element.chapter.saveSync(); + } + } + } + + isar.updates.clearSync(); + if (updates != null) { + final tempChapters = + isar.chapters.filter().idIsNotNull().findAllSync().toList(); + for (var update in updates) { + final matchingChapter = tempChapters + .where((chapter) => + chapter.mangaId == update.mangaId && + chapter.name == update.chapterName) + .firstOrNull; + if (matchingChapter != null) { + isar.updates.putSync(update..chapter.value = matchingChapter); + update.chapter.saveSync(); + } + } + } + } + + isar.categorys.clearSync(); + if (categories != null) { + isar.categorys.putAllSync(categories); + } + } + + isar.tracks.clearSync(); + if (track != null) { + isar.tracks.putAllSync(track); + } + + isar.trackPreferences.clearSync(); + if (trackPreferences != null) { + isar.trackPreferences.putAllSync(trackPreferences); + } + + isar.sources.clearSync(); + if (extensions != null) { + isar.sources.putAllSync(extensions); + } + + isar.sourcePreferences.clearSync(); + if (extensionsPref != null) { + isar.sourcePreferences.putAllSync(extensionsPref); + } + isar.settings.clearSync(); + if (settings != null) { + isar.settings.putAllSync(settings); + } + ref.invalidate(themeModeStateProvider); + ref.invalidate(blendLevelStateProvider); + ref.invalidate(flexSchemeColorStateProvider); + ref.invalidate(pureBlackDarkModeStateProvider); + ref.invalidate(l10nLocaleStateProvider); + }); + } catch (e) { + botToast(e.toString()); } } diff --git a/lib/modules/more/backup_and_restore/providers/restore.g.dart b/lib/modules/more/backup_and_restore/providers/restore.g.dart index a490e46..f55b607 100644 --- a/lib/modules/more/backup_and_restore/providers/restore.g.dart +++ b/lib/modules/more/backup_and_restore/providers/restore.g.dart @@ -6,7 +6,7 @@ part of 'restore.dart'; // RiverpodGenerator // ************************************************************************** -String _$doRestoreHash() => r'15a02b8de4cc4c7f5185a9f645b734a75f5950ca'; +String _$doRestoreHash() => r'508725e75a03ac5f561c2cf8bf4943052d605d5b'; /// Copied from Dart SDK class _SystemHash { @@ -172,5 +172,263 @@ class _DoRestoreProviderElement extends AutoDisposeProviderElement @override BuildContext get context => (origin as DoRestoreProvider).context; } + +String _$restoreV1Hash() => r'4dca1ac4cec79fdc78bec4d71367e77caf696f17'; + +/// See also [restoreV1]. +@ProviderFor(restoreV1) +const restoreV1Provider = RestoreV1Family(); + +/// See also [restoreV1]. +class RestoreV1Family extends Family { + /// See also [restoreV1]. + const RestoreV1Family(); + + /// See also [restoreV1]. + RestoreV1Provider call( + Map backup, + ) { + return RestoreV1Provider( + backup, + ); + } + + @override + RestoreV1Provider getProviderOverride( + covariant RestoreV1Provider provider, + ) { + return call( + provider.backup, + ); + } + + 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'restoreV1Provider'; +} + +/// See also [restoreV1]. +class RestoreV1Provider extends AutoDisposeProvider { + /// See also [restoreV1]. + RestoreV1Provider( + Map backup, + ) : this._internal( + (ref) => restoreV1( + ref as RestoreV1Ref, + backup, + ), + from: restoreV1Provider, + name: r'restoreV1Provider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreV1Hash, + dependencies: RestoreV1Family._dependencies, + allTransitiveDependencies: RestoreV1Family._allTransitiveDependencies, + backup: backup, + ); + + RestoreV1Provider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.backup, + }) : super.internal(); + + final Map backup; + + @override + Override overrideWith( + void Function(RestoreV1Ref provider) create, + ) { + return ProviderOverride( + origin: this, + override: RestoreV1Provider._internal( + (ref) => create(ref as RestoreV1Ref), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + backup: backup, + ), + ); + } + + @override + AutoDisposeProviderElement createElement() { + return _RestoreV1ProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is RestoreV1Provider && other.backup == backup; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, backup.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin RestoreV1Ref on AutoDisposeProviderRef { + /// The parameter `backup` of this provider. + Map get backup; +} + +class _RestoreV1ProviderElement extends AutoDisposeProviderElement + with RestoreV1Ref { + _RestoreV1ProviderElement(super.provider); + + @override + Map get backup => (origin as RestoreV1Provider).backup; +} + +String _$restoreV2Hash() => r'fbdd1978f8be7512277620e351b9a0eee1827bfc'; + +/// See also [restoreV2]. +@ProviderFor(restoreV2) +const restoreV2Provider = RestoreV2Family(); + +/// See also [restoreV2]. +class RestoreV2Family extends Family { + /// See also [restoreV2]. + const RestoreV2Family(); + + /// See also [restoreV2]. + RestoreV2Provider call( + Map backup, + ) { + return RestoreV2Provider( + backup, + ); + } + + @override + RestoreV2Provider getProviderOverride( + covariant RestoreV2Provider provider, + ) { + return call( + provider.backup, + ); + } + + 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'restoreV2Provider'; +} + +/// See also [restoreV2]. +class RestoreV2Provider extends AutoDisposeProvider { + /// See also [restoreV2]. + RestoreV2Provider( + Map backup, + ) : this._internal( + (ref) => restoreV2( + ref as RestoreV2Ref, + backup, + ), + from: restoreV2Provider, + name: r'restoreV2Provider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreV2Hash, + dependencies: RestoreV2Family._dependencies, + allTransitiveDependencies: RestoreV2Family._allTransitiveDependencies, + backup: backup, + ); + + RestoreV2Provider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.backup, + }) : super.internal(); + + final Map backup; + + @override + Override overrideWith( + void Function(RestoreV2Ref provider) create, + ) { + return ProviderOverride( + origin: this, + override: RestoreV2Provider._internal( + (ref) => create(ref as RestoreV2Ref), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + backup: backup, + ), + ); + } + + @override + AutoDisposeProviderElement createElement() { + return _RestoreV2ProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is RestoreV2Provider && other.backup == backup; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, backup.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin RestoreV2Ref on AutoDisposeProviderRef { + /// The parameter `backup` of this provider. + Map get backup; +} + +class _RestoreV2ProviderElement extends AutoDisposeProviderElement + with RestoreV2Ref { + _RestoreV2ProviderElement(super.provider); + + @override + Map get backup => (origin as RestoreV2Provider).backup; +} // 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 diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index 372f759..d354f52 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -2,9 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart'; import 'package:mangayomi/modules/more/categories/widgets/custom_textfield.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -19,9 +20,10 @@ class CategoriesScreen extends ConsumerStatefulWidget { class _CategoriesScreenState extends ConsumerState with TickerProviderStateMixin { late TabController _tabBarController; + int tabs = 3; @override void initState() { - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: tabs, vsync: this); _tabBarController.animateTo(widget.data.$2); super.initState(); @@ -29,10 +31,25 @@ class _CategoriesScreenState extends ConsumerState @override Widget build(BuildContext context) { + int newTabs = 0; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + if (!hideManga) newTabs++; + if (!hideAnime) newTabs++; + if (!hideNovel) newTabs++; + if (tabs != newTabs) { + _tabBarController.dispose(); + _tabBarController = TabController(length: newTabs, vsync: this); + _tabBarController.animateTo(0); + setState(() { + tabs = newTabs; + }); + } final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: newTabs, child: Scaffold( appBar: AppBar( elevation: 0, @@ -45,18 +62,25 @@ class _CategoriesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), - Tab(text: l10n.anime), + if (!hideManga) Tab(text: l10n.manga), + if (!hideAnime) Tab(text: l10n.anime), + if (!hideNovel) Tab(text: l10n.novel), ], ), ), - body: TabBarView(controller: _tabBarController, children: const [ - CategoriesTab( - isManga: true, - ), - CategoriesTab( - isManga: false, - ) + body: TabBarView(controller: _tabBarController, children: [ + if (!hideManga) + CategoriesTab( + itemType: ItemType.manga, + ), + if (!hideAnime) + CategoriesTab( + itemType: ItemType.anime, + ), + if (!hideNovel) + CategoriesTab( + itemType: ItemType.novel, + ) ]), ), ); @@ -64,8 +88,8 @@ class _CategoriesScreenState extends ConsumerState } class CategoriesTab extends ConsumerStatefulWidget { - final bool isManga; - const CategoriesTab({required this.isManga, super.key}); + final ItemType itemType; + const CategoriesTab({required this.itemType, super.key}); @override ConsumerState createState() => _CategoriesTabState(); @@ -77,7 +101,7 @@ class _CategoriesTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final categories = - ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga)); + ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType)); return Scaffold( body: categories.when( data: (data) { @@ -178,15 +202,6 @@ class _CategoriesTabState extends ConsumerState { onPressed: () async { await isar.writeTxn( () async { - await ref - .read(changedItemsManagerProvider( - managerId: - 1) - .notifier) - .addDeletedCategoryAsync( - _entries[ - index], - false); await isar .categorys .delete(_entries[ @@ -280,7 +295,7 @@ class _CategoriesTabState extends ConsumerState { : () async { await isar.writeTxn(() async { await isar.categorys.put(Category( - forManga: widget.isManga, + forItemType: widget.itemType, name: controller.text, )); }); diff --git a/lib/modules/more/categories/providers/isar_providers.dart b/lib/modules/more/categories/providers/isar_providers.dart index 1b4c714..ad2bc6c 100644 --- a/lib/modules/more/categories/providers/isar_providers.dart +++ b/lib/modules/more/categories/providers/isar_providers.dart @@ -1,17 +1,18 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'isar_providers.g.dart'; @riverpod Stream> getMangaCategorieStream(Ref ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.categorys .filter() .idIsNotNull() .and() - .forMangaEqualTo(isManga) + .forItemTypeEqualTo(itemType) .watch(fireImmediately: true); } diff --git a/lib/modules/more/categories/providers/isar_providers.g.dart b/lib/modules/more/categories/providers/isar_providers.g.dart index 99ce5bd..8306984 100644 --- a/lib/modules/more/categories/providers/isar_providers.g.dart +++ b/lib/modules/more/categories/providers/isar_providers.g.dart @@ -7,7 +7,7 @@ part of 'isar_providers.dart'; // ************************************************************************** String _$getMangaCategorieStreamHash() => - r'97e90977f4696eedcf597c655a40dd6ccd47ed37'; + r'1dcf15018a6467eef7a26c1728b9e531ebd984d0'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetMangaCategorieStreamFamily extends Family>> { /// See also [getMangaCategorieStream]. GetMangaCategorieStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetMangaCategorieStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -53,7 +53,7 @@ class GetMangaCategorieStreamFamily extends Family>> { covariant GetMangaCategorieStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -77,11 +77,11 @@ class GetMangaCategorieStreamProvider extends AutoDisposeStreamProvider> { /// See also [getMangaCategorieStream]. GetMangaCategorieStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getMangaCategorieStream( ref as GetMangaCategorieStreamRef, - isManga: isManga, + itemType: itemType, ), from: getMangaCategorieStreamProvider, name: r'getMangaCategorieStreamProvider', @@ -92,7 +92,7 @@ class GetMangaCategorieStreamProvider dependencies: GetMangaCategorieStreamFamily._dependencies, allTransitiveDependencies: GetMangaCategorieStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetMangaCategorieStreamProvider._internal( @@ -102,10 +102,10 @@ class GetMangaCategorieStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -120,7 +120,7 @@ class GetMangaCategorieStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,13 +132,14 @@ class GetMangaCategorieStreamProvider @override bool operator ==(Object other) { - return other is GetMangaCategorieStreamProvider && other.isManga == isManga; + return other is GetMangaCategorieStreamProvider && + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -148,8 +149,8 @@ class GetMangaCategorieStreamProvider // ignore: unused_element mixin GetMangaCategorieStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetMangaCategorieStreamProviderElement @@ -158,7 +159,7 @@ class _GetMangaCategorieStreamProviderElement _GetMangaCategorieStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetMangaCategorieStreamProvider).isManga; + ItemType get itemType => (origin as GetMangaCategorieStreamProvider).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 diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 625eb6b..2da1666 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:numberpicker/numberpicker.dart'; @@ -20,6 +21,7 @@ class PlayerScreen extends ConsumerWidget { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); return Scaffold( appBar: AppBar( @@ -28,6 +30,12 @@ class PlayerScreen extends ConsumerWidget { body: SingleChildScrollView( child: Column( children: [ + SwitchListTile( + value: hideAnime, + title: Text(context.l10n.hide_anime), + onChanged: (value) { + ref.read(hideAnimeStateProvider.notifier).set(value); + }), ListTile( onTap: () { final values = [100, 95, 90, 85, 80, 75, 70]; diff --git a/lib/modules/more/settings/reader/providers/reader_state_provider.dart b/lib/modules/more/settings/reader/providers/reader_state_provider.dart index 8f3dbcd..b89ac61 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.dart @@ -137,3 +137,48 @@ class FullScreenReaderState extends _$FullScreenReaderState { () => isar.settings.putSync(settings!..fullScreenReader = value)); } } + +@riverpod +class HideMangaState extends _$HideMangaState { + @override + bool build() { + return isar.settings.getSync(227)!.hideManga ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..hideManga = value)); + } +} + +@riverpod +class HideAnimeState extends _$HideAnimeState { + @override + bool build() { + return isar.settings.getSync(227)!.hideAnime ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..hideAnime = value)); + } +} + +@riverpod +class HideNovelState extends _$HideNovelState { + @override + bool build() { + return isar.settings.getSync(227)!.hideNovel ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..hideNovel = value)); + } +} diff --git a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart index f105f38..c4a0d23 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart @@ -157,5 +157,53 @@ final fullScreenReaderStateProvider = ); typedef _$FullScreenReaderState = AutoDisposeNotifier; +String _$hideMangaStateHash() => r'fd24207581798fd1634ff6df2c85b8895053d14c'; + +/// See also [HideMangaState]. +@ProviderFor(HideMangaState) +final hideMangaStateProvider = + AutoDisposeNotifierProvider.internal( + HideMangaState.new, + name: r'hideMangaStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideMangaStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$HideMangaState = AutoDisposeNotifier; +String _$hideAnimeStateHash() => r'3e8748d9312b9ea84364959b7de17fed2204d303'; + +/// See also [HideAnimeState]. +@ProviderFor(HideAnimeState) +final hideAnimeStateProvider = + AutoDisposeNotifierProvider.internal( + HideAnimeState.new, + name: r'hideAnimeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideAnimeStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$HideAnimeState = AutoDisposeNotifier; +String _$hideNovelStateHash() => r'697efab85819783a7c1982797927feb397770191'; + +/// See also [HideNovelState]. +@ProviderFor(HideNovelState) +final hideNovelStateProvider = + AutoDisposeNotifierProvider.internal( + HideNovelState.new, + name: r'hideNovelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideNovelStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$HideNovelState = AutoDisposeNotifier; // 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 diff --git a/lib/modules/more/settings/reader/reader_screen.dart b/lib/modules/more/settings/reader/reader_screen.dart index f7a1a6d..b96a196 100644 --- a/lib/modules/more/settings/reader/reader_screen.dart +++ b/lib/modules/more/settings/reader/reader_screen.dart @@ -20,6 +20,8 @@ class ReaderScreen extends ConsumerWidget { final backgroundColor = ref.watch(backgroundColorStateProvider); final usePageTapZones = ref.watch(usePageTapZonesStateProvider); final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + final hideManga = ref.watch(hideMangaStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); final cropBorders = ref.watch(cropBordersStateProvider); return Scaffold( appBar: AppBar( @@ -328,6 +330,18 @@ class ReaderScreen extends ConsumerWidget { style: TextStyle(fontSize: 11, color: context.secondaryColor), ), ), + SwitchListTile( + value: hideManga, + title: Text(context.l10n.hide_manga), + onChanged: (value) { + ref.read(hideMangaStateProvider.notifier).set(value); + }), + SwitchListTile( + value: hideNovel, + title: Text(context.l10n.hide_novel), + onChanged: (value) { + ref.read(hideNovelStateProvider.notifier).set(value); + }), SwitchListTile( value: fullScreenReader, title: Text(context.l10n.fullscreen), diff --git a/lib/modules/more/settings/sync/providers/sync_providers.dart b/lib/modules/more/settings/sync/providers/sync_providers.dart index 67dc75c..07de85b 100644 --- a/lib/modules/more/settings/sync/providers/sync_providers.dart +++ b/lib/modules/more/settings/sync/providers/sync_providers.dart @@ -1,210 +1,8 @@ -import 'dart:convert'; -import 'dart:developer'; - import 'package:mangayomi/main.dart'; -import 'package:mangayomi/models/category.dart'; -import 'package:mangayomi/models/changed_items.dart'; -import 'package:mangayomi/models/chapter.dart'; -import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/sync_preference.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'sync_providers.g.dart'; -@riverpod -void addUpdatedChapterIndependent( - Ref ref, Chapter chapter, bool deleted, bool txn) { - final changedItems = isar.changedItems.getSync(1) ?? ChangedItems(); - bool updated = false; - changedItems.updatedChapters = changedItems.updatedChapters?.map((e) { - if (e.chapterId == chapter.id) { - e.isBookmarked = chapter.isBookmarked; - e.isRead = chapter.isRead; - e.lastPageRead = chapter.lastPageRead; - e.deleted = deleted; - updated = true; - } - return e; - }).toList(); - if (!updated) { - final updatedChapter = UpdatedChapter( - chapterId: chapter.id, - isBookmarked: chapter.isBookmarked, - isRead: chapter.isRead, - lastPageRead: chapter.lastPageRead, - deleted: deleted); - changedItems.updatedChapters = changedItems.updatedChapters?.toList() - ?..add(updatedChapter); - } - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } -} - -@riverpod -void checkForSyncIndependent(Ref ref, bool silent) { - ref.read(SyncServerProvider(syncId: 1).notifier).checkForSync(silent); -} - -@riverpod -class ChangedItemsManager extends _$ChangedItemsManager { - @override - ChangedItems? build({required int? managerId}) { - return isar.changedItems.getSync(managerId!); - } - - void cleanChangedItems(bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - changedItems.deletedMangas = []; - changedItems.updatedChapters = []; - changedItems.deletedCategories = []; - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - void addDeletedManga(Manga manga, bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - log("DEBUG"); - log(jsonEncode(changedItems)); - final deletedManga = DeletedManga(mangaId: manga.id); - changedItems.deletedMangas = changedItems.deletedMangas?.toList() - ?..add(deletedManga); - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - Future addDeletedMangaAsync(Manga manga, bool txn) async { - final changedItems = - await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId); - final deletedManga = DeletedManga(mangaId: manga.id); - changedItems.deletedMangas = changedItems.deletedMangas?.toList() - ?..add(deletedManga); - if (!txn) { - await isar.changedItems.put(changedItems); - } else { - await isar.writeTxn(() async { - await isar.changedItems.put(changedItems); - }); - } - } - - void addUpdatedChapter(Chapter chapter, bool deleted, bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - bool updated = false; - changedItems.updatedChapters = changedItems.updatedChapters?.map((e) { - if (e.chapterId == chapter.id && e.mangaId == chapter.mangaId) { - e.isBookmarked = chapter.isBookmarked; - e.isRead = chapter.isRead; - e.lastPageRead = chapter.lastPageRead; - e.deleted = deleted; - updated = true; - } - return e; - }).toList(); - if (!updated) { - final updatedChapter = UpdatedChapter( - chapterId: chapter.id, - mangaId: chapter.mangaId, - isBookmarked: chapter.isBookmarked, - isRead: chapter.isRead, - lastPageRead: chapter.lastPageRead, - deleted: deleted); - changedItems.updatedChapters = changedItems.updatedChapters?.toList() - ?..add(updatedChapter); - } - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - Future addUpdatedChapterAsync(Chapter chapter, bool deleted, bool txn) async { - final changedItems = - await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId); - bool updated = false; - changedItems.updatedChapters = changedItems.updatedChapters?.map((e) { - if (e.chapterId == chapter.id && e.mangaId == chapter.mangaId) { - e.isBookmarked = chapter.isBookmarked; - e.isRead = chapter.isRead; - e.lastPageRead = chapter.lastPageRead; - e.deleted = deleted; - updated = true; - } - return e; - }).toList(); - if (!updated) { - final updatedChapter = UpdatedChapter( - chapterId: chapter.id, - mangaId: chapter.mangaId, - isBookmarked: chapter.isBookmarked, - isRead: chapter.isRead, - lastPageRead: chapter.lastPageRead, - deleted: deleted); - changedItems.updatedChapters = changedItems.updatedChapters?.toList() - ?..add(updatedChapter); - } - if (!txn) { - await isar.changedItems.put(changedItems); - } else { - await isar.writeTxn(() async { - await isar.changedItems.put(changedItems); - }); - } - } - - void addDeletedCategory(Category category, bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - final deletedCategory = DeletedCategory(categoryId: category.id); - changedItems.deletedCategories = changedItems.deletedCategories?.toList() - ?..add(deletedCategory); - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - Future addDeletedCategoryAsync(Category category, bool txn) async { - final changedItems = - await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId); - final deletedCategory = DeletedCategory(categoryId: category.id); - changedItems.deletedCategories = changedItems.deletedCategories?.toList() - ?..add(deletedCategory); - if (!txn) { - await isar.changedItems.put(changedItems); - } else { - await isar.writeTxn(() async { - await isar.changedItems.put(changedItems); - }); - } - } -} - @riverpod class Synching extends _$Synching { @override @@ -224,13 +22,6 @@ class Synching extends _$Synching { }); } - void setLastSync(int timestamp) { - isar.writeTxnSync(() { - isar.syncPreferences.putSync( - isar.syncPreferences.getSync(syncId!)!..lastSync = timestamp); - }); - } - void setLastUpload(int timestamp) { isar.writeTxnSync(() { isar.syncPreferences.putSync( @@ -252,33 +43,3 @@ class Synching extends _$Synching { }); } } - -@riverpod -class SyncOnAppLaunchState extends _$SyncOnAppLaunchState { - @override - bool build() { - return isar.settings.getSync(227)!.syncOnAppLaunch ?? false; - } - - void set(bool value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync(settings!..syncOnAppLaunch = value)); - } -} - -@riverpod -class SyncAfterReadingState extends _$SyncAfterReadingState { - @override - bool build() { - return isar.settings.getSync(227)!.syncAfterReading ?? false; - } - - void set(bool value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync(settings!..syncAfterReading = value)); - } -} diff --git a/lib/modules/more/settings/sync/providers/sync_providers.g.dart b/lib/modules/more/settings/sync/providers/sync_providers.g.dart index d654f2c..910c3bc 100644 --- a/lib/modules/more/settings/sync/providers/sync_providers.g.dart +++ b/lib/modules/more/settings/sync/providers/sync_providers.g.dart @@ -6,8 +6,7 @@ part of 'sync_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$addUpdatedChapterIndependentHash() => - r'7abb8f085a229ec0573c730234fa4fc4ff86d794'; +String _$synchingHash() => r'3ab44d9e753f2d4b51fd10af6c98ffac78cbf201'; /// Copied from Dart SDK class _SystemHash { @@ -30,450 +29,6 @@ class _SystemHash { } } -/// See also [addUpdatedChapterIndependent]. -@ProviderFor(addUpdatedChapterIndependent) -const addUpdatedChapterIndependentProvider = - AddUpdatedChapterIndependentFamily(); - -/// See also [addUpdatedChapterIndependent]. -class AddUpdatedChapterIndependentFamily extends Family { - /// See also [addUpdatedChapterIndependent]. - const AddUpdatedChapterIndependentFamily(); - - /// See also [addUpdatedChapterIndependent]. - AddUpdatedChapterIndependentProvider call( - Chapter chapter, - bool deleted, - bool txn, - ) { - return AddUpdatedChapterIndependentProvider( - chapter, - deleted, - txn, - ); - } - - @override - AddUpdatedChapterIndependentProvider getProviderOverride( - covariant AddUpdatedChapterIndependentProvider provider, - ) { - return call( - provider.chapter, - provider.deleted, - provider.txn, - ); - } - - 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'addUpdatedChapterIndependentProvider'; -} - -/// See also [addUpdatedChapterIndependent]. -class AddUpdatedChapterIndependentProvider extends AutoDisposeProvider { - /// See also [addUpdatedChapterIndependent]. - AddUpdatedChapterIndependentProvider( - Chapter chapter, - bool deleted, - bool txn, - ) : this._internal( - (ref) => addUpdatedChapterIndependent( - ref as AddUpdatedChapterIndependentRef, - chapter, - deleted, - txn, - ), - from: addUpdatedChapterIndependentProvider, - name: r'addUpdatedChapterIndependentProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$addUpdatedChapterIndependentHash, - dependencies: AddUpdatedChapterIndependentFamily._dependencies, - allTransitiveDependencies: - AddUpdatedChapterIndependentFamily._allTransitiveDependencies, - chapter: chapter, - deleted: deleted, - txn: txn, - ); - - AddUpdatedChapterIndependentProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.chapter, - required this.deleted, - required this.txn, - }) : super.internal(); - - final Chapter chapter; - final bool deleted; - final bool txn; - - @override - Override overrideWith( - void Function(AddUpdatedChapterIndependentRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: AddUpdatedChapterIndependentProvider._internal( - (ref) => create(ref as AddUpdatedChapterIndependentRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - chapter: chapter, - deleted: deleted, - txn: txn, - ), - ); - } - - @override - AutoDisposeProviderElement createElement() { - return _AddUpdatedChapterIndependentProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is AddUpdatedChapterIndependentProvider && - other.chapter == chapter && - other.deleted == deleted && - other.txn == txn; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, chapter.hashCode); - hash = _SystemHash.combine(hash, deleted.hashCode); - hash = _SystemHash.combine(hash, txn.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin AddUpdatedChapterIndependentRef on AutoDisposeProviderRef { - /// The parameter `chapter` of this provider. - Chapter get chapter; - - /// The parameter `deleted` of this provider. - bool get deleted; - - /// The parameter `txn` of this provider. - bool get txn; -} - -class _AddUpdatedChapterIndependentProviderElement - extends AutoDisposeProviderElement - with AddUpdatedChapterIndependentRef { - _AddUpdatedChapterIndependentProviderElement(super.provider); - - @override - Chapter get chapter => - (origin as AddUpdatedChapterIndependentProvider).chapter; - @override - bool get deleted => (origin as AddUpdatedChapterIndependentProvider).deleted; - @override - bool get txn => (origin as AddUpdatedChapterIndependentProvider).txn; -} - -String _$checkForSyncIndependentHash() => - r'3a3658a67cd6cb210e76126b33592bd1ea67e3f0'; - -/// See also [checkForSyncIndependent]. -@ProviderFor(checkForSyncIndependent) -const checkForSyncIndependentProvider = CheckForSyncIndependentFamily(); - -/// See also [checkForSyncIndependent]. -class CheckForSyncIndependentFamily extends Family { - /// See also [checkForSyncIndependent]. - const CheckForSyncIndependentFamily(); - - /// See also [checkForSyncIndependent]. - CheckForSyncIndependentProvider call( - bool silent, - ) { - return CheckForSyncIndependentProvider( - silent, - ); - } - - @override - CheckForSyncIndependentProvider getProviderOverride( - covariant CheckForSyncIndependentProvider provider, - ) { - return call( - provider.silent, - ); - } - - 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'checkForSyncIndependentProvider'; -} - -/// See also [checkForSyncIndependent]. -class CheckForSyncIndependentProvider extends AutoDisposeProvider { - /// See also [checkForSyncIndependent]. - CheckForSyncIndependentProvider( - bool silent, - ) : this._internal( - (ref) => checkForSyncIndependent( - ref as CheckForSyncIndependentRef, - silent, - ), - from: checkForSyncIndependentProvider, - name: r'checkForSyncIndependentProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$checkForSyncIndependentHash, - dependencies: CheckForSyncIndependentFamily._dependencies, - allTransitiveDependencies: - CheckForSyncIndependentFamily._allTransitiveDependencies, - silent: silent, - ); - - CheckForSyncIndependentProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.silent, - }) : super.internal(); - - final bool silent; - - @override - Override overrideWith( - void Function(CheckForSyncIndependentRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: CheckForSyncIndependentProvider._internal( - (ref) => create(ref as CheckForSyncIndependentRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - silent: silent, - ), - ); - } - - @override - AutoDisposeProviderElement createElement() { - return _CheckForSyncIndependentProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is CheckForSyncIndependentProvider && other.silent == silent; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, silent.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin CheckForSyncIndependentRef on AutoDisposeProviderRef { - /// The parameter `silent` of this provider. - bool get silent; -} - -class _CheckForSyncIndependentProviderElement - extends AutoDisposeProviderElement with CheckForSyncIndependentRef { - _CheckForSyncIndependentProviderElement(super.provider); - - @override - bool get silent => (origin as CheckForSyncIndependentProvider).silent; -} - -String _$changedItemsManagerHash() => - r'a4f0363ab430ddb6c2a23fde6f5671ba8ec252cf'; - -abstract class _$ChangedItemsManager - extends BuildlessAutoDisposeNotifier { - late final int? managerId; - - ChangedItems? build({ - required int? managerId, - }); -} - -/// See also [ChangedItemsManager]. -@ProviderFor(ChangedItemsManager) -const changedItemsManagerProvider = ChangedItemsManagerFamily(); - -/// See also [ChangedItemsManager]. -class ChangedItemsManagerFamily extends Family { - /// See also [ChangedItemsManager]. - const ChangedItemsManagerFamily(); - - /// See also [ChangedItemsManager]. - ChangedItemsManagerProvider call({ - required int? managerId, - }) { - return ChangedItemsManagerProvider( - managerId: managerId, - ); - } - - @override - ChangedItemsManagerProvider getProviderOverride( - covariant ChangedItemsManagerProvider provider, - ) { - return call( - managerId: provider.managerId, - ); - } - - 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'changedItemsManagerProvider'; -} - -/// See also [ChangedItemsManager]. -class ChangedItemsManagerProvider extends AutoDisposeNotifierProviderImpl< - ChangedItemsManager, ChangedItems?> { - /// See also [ChangedItemsManager]. - ChangedItemsManagerProvider({ - required int? managerId, - }) : this._internal( - () => ChangedItemsManager()..managerId = managerId, - from: changedItemsManagerProvider, - name: r'changedItemsManagerProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$changedItemsManagerHash, - dependencies: ChangedItemsManagerFamily._dependencies, - allTransitiveDependencies: - ChangedItemsManagerFamily._allTransitiveDependencies, - managerId: managerId, - ); - - ChangedItemsManagerProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.managerId, - }) : super.internal(); - - final int? managerId; - - @override - ChangedItems? runNotifierBuild( - covariant ChangedItemsManager notifier, - ) { - return notifier.build( - managerId: managerId, - ); - } - - @override - Override overrideWith(ChangedItemsManager Function() create) { - return ProviderOverride( - origin: this, - override: ChangedItemsManagerProvider._internal( - () => create()..managerId = managerId, - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - managerId: managerId, - ), - ); - } - - @override - AutoDisposeNotifierProviderElement - createElement() { - return _ChangedItemsManagerProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is ChangedItemsManagerProvider && other.managerId == managerId; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, managerId.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin ChangedItemsManagerRef on AutoDisposeNotifierProviderRef { - /// The parameter `managerId` of this provider. - int? get managerId; -} - -class _ChangedItemsManagerProviderElement - extends AutoDisposeNotifierProviderElement with ChangedItemsManagerRef { - _ChangedItemsManagerProviderElement(super.provider); - - @override - int? get managerId => (origin as ChangedItemsManagerProvider).managerId; -} - -String _$synchingHash() => r'2ef7fd99da4292ed236252d2b727cff9a69f43a9'; - abstract class _$Synching extends BuildlessAutoDisposeNotifier { late final int? syncId; @@ -616,40 +171,5 @@ class _SynchingProviderElement @override int? get syncId => (origin as SynchingProvider).syncId; } - -String _$syncOnAppLaunchStateHash() => - r'dc7f3243e38a748462628229066c8fc0653c908b'; - -/// See also [SyncOnAppLaunchState]. -@ProviderFor(SyncOnAppLaunchState) -final syncOnAppLaunchStateProvider = - AutoDisposeNotifierProvider.internal( - SyncOnAppLaunchState.new, - name: r'syncOnAppLaunchStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$syncOnAppLaunchStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$SyncOnAppLaunchState = AutoDisposeNotifier; -String _$syncAfterReadingStateHash() => - r'e507acd490b5aea7fc1a8fd7a369ec01f4c47192'; - -/// See also [SyncAfterReadingState]. -@ProviderFor(SyncAfterReadingState) -final syncAfterReadingStateProvider = - AutoDisposeNotifierProvider.internal( - SyncAfterReadingState.new, - name: r'syncAfterReadingStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$syncAfterReadingStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$SyncAfterReadingState = AutoDisposeNotifier; // 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 diff --git a/lib/modules/more/settings/sync/sync.dart b/lib/modules/more/settings/sync/sync.dart index ad41286..70dfb14 100644 --- a/lib/modules/more/settings/sync/sync.dart +++ b/lib/modules/more/settings/sync/sync.dart @@ -4,7 +4,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/models/sync_preference.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/sync/widgets/sync_listile.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/services/sync_server.dart'; @@ -15,8 +14,6 @@ class SyncScreen extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - final syncOnAppLaunch = ref.watch(syncOnAppLaunchStateProvider); final l10n = l10nLocalizations(context)!; return Scaffold( appBar: AppBar( @@ -36,26 +33,6 @@ class SyncScreen extends ConsumerWidget { syncPreference.authToken?.isNotEmpty ?? false; return Column( children: [ - SwitchListTile( - value: syncAfterReading, - title: Text(context.l10n.syncAfterReading), - onChanged: !isLogged - ? null - : (value) { - ref - .read(syncAfterReadingStateProvider.notifier) - .set(value); - }), - SwitchListTile( - value: syncOnAppLaunch, - title: Text(context.l10n.syncOnAppLaunch), - onChanged: !isLogged - ? null - : (value) { - ref - .read(syncOnAppLaunchStateProvider.notifier) - .set(value); - }), Padding( padding: const EdgeInsets.only( left: 15, right: 15, bottom: 10, top: 5), @@ -103,12 +80,6 @@ class SyncScreen extends ConsumerWidget { const SizedBox(width: 10), Column(children: [ const SizedBox(width: 20), - Text( - "${l10n.last_sync}: ${dateFormat((syncPreference.lastSync ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastSync ?? 0).toString(), context)}", - style: TextStyle( - fontSize: 11, - color: context.secondaryColor)), - const SizedBox(width: 20), Text( "${l10n.last_upload}: ${dateFormat((syncPreference.lastUpload ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastUpload ?? 0).toString(), context)}", style: TextStyle( @@ -127,27 +98,6 @@ class SyncScreen extends ConsumerWidget { ), Row( children: [ - const SizedBox(width: 20), - Column( - children: [ - IconButton( - onPressed: !isLogged - ? null - : () { - ref - .read(syncServerProvider(syncId: 1) - .notifier) - .checkForSync(false); - }, - icon: Icon( - Icons.sync, - color: !isLogged - ? context.secondaryColor - : context.primaryColor, - )), - Text(l10n.sync_button_sync), - ], - ), const SizedBox(width: 20), Column( children: [ diff --git a/lib/modules/novel/novel_reader_controller_provider.dart b/lib/modules/novel/novel_reader_controller_provider.dart new file mode 100644 index 0000000..621106e --- /dev/null +++ b/lib/modules/novel/novel_reader_controller_provider.dart @@ -0,0 +1,303 @@ +import 'package:isar/isar.dart'; +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/download.dart'; +import 'package:mangayomi/models/history.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'novel_reader_controller_provider.g.dart'; + +@riverpod +class NovelReaderController extends _$NovelReaderController { + @override + void build({required Chapter chapter}) {} + + Manga getManga() { + return chapter.manga.value!; + } + + Chapter geChapter() { + return chapter; + } + + final incognitoMode = isar.settings.getSync(227)!.incognitoMode!; + + Settings getIsarSetting() { + return isar.settings.getSync(227)!; + } + + void setMangaHistoryUpdate() { + if (incognitoMode) return; + isar.writeTxnSync(() { + Manga? manga = chapter.manga.value; + manga!.lastRead = DateTime.now().millisecondsSinceEpoch; + isar.mangas.putSync(manga); + }); + History? history; + + final empty = + isar.historys.filter().mangaIdEqualTo(getManga().id).isEmptySync(); + + if (empty) { + history = History( + mangaId: getManga().id, + date: DateTime.now().millisecondsSinceEpoch.toString(), + itemType: getManga().itemType, + chapterId: chapter.id) + ..chapter.value = chapter; + } else { + history = (isar.historys + .filter() + .mangaIdEqualTo(getManga().id) + .findFirstSync())! + ..chapterId = chapter.id + ..chapter.value = chapter + ..date = DateTime.now().millisecondsSinceEpoch.toString(); + } + isar.writeTxnSync(() { + isar.historys.putSync(history!); + history.chapter.saveSync(); + }); + } + + void setChapterOffset(double newOffset, double maxOffset, bool save) { + if (incognitoMode) return; + final isRead = (newOffset / (maxOffset != 0 ? maxOffset : 1)) >= 0.9; + if (isRead || save) { + final ch = chapter; + isar.writeTxnSync(() { + ch.isRead = isRead; + ch.lastPageRead = (maxOffset != 0 ? newOffset / maxOffset : 0).toString(); + isar.chapters.putSync(ch); + }); + } + } + + void setChapterBookmarked() { + if (incognitoMode) return; + final isBookmarked = getChapterBookmarked(); + final chap = chapter; + isar.writeTxnSync(() { + chap.isBookmarked = !isBookmarked; + isar.chapters.putSync(chap); + }); + } + + bool getChapterBookmarked() { + return isar.chapters.getSync(chapter.id!)!.isBookmarked!; + } + + (int, bool) getPrevChapterIndex() { + final chapters = getManga().getFilteredChapterList(); + int? index; + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i + 1; + } + } + if (index == null) { + final chapters = getManga().chapters.toList().toList(); + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i + 1; + } + } + return (index!, false); + } + return (index, true); + } + + (int, bool) getNextChapterIndex() { + final chapters = getManga().getFilteredChapterList(); + int? index; + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i - 1; + } + } + if (index == null) { + final chapters = getManga().chapters.toList().toList(); + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i - 1; + } + } + return (index!, false); + } + return (index, true); + } + + (int, bool) getChapterIndex() { + final chapters = getManga().getFilteredChapterList(); + int? index; + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i; + } + } + if (index == null) { + final chapters = getManga().chapters.toList().toList(); + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i; + } + } + return (index!, false); + } + return (index, true); + } + + Chapter getPrevChapter() { + final prevChapIdx = getPrevChapterIndex(); + return prevChapIdx.$2 + ? getManga().getFilteredChapterList()[prevChapIdx.$1] + : getManga().chapters.toList().toList()[prevChapIdx.$1]; + } + + Chapter getNextChapter() { + final nextChapIdx = getNextChapterIndex(); + return nextChapIdx.$2 + ? getManga().getFilteredChapterList()[nextChapIdx.$1] + : getManga().chapters.toList().toList()[nextChapIdx.$1]; + } + + int getChaptersLength(bool isInFilterList) { + return isInFilterList + ? getManga().getFilteredChapterList().length + : getManga().chapters.length; + } + + String getMangaName() { + return getManga().name!; + } + + String getSourceName() { + return getManga().source!; + } + + String getChapterTitle() { + return chapter.name!; + } +} + +extension MangaExtensions on Manga { + List getFilteredChapterList() { + final data = this.chapters.toList().toList(); + final filterUnread = (isar.settings + .getSync(227)! + .chapterFilterUnreadList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterUnread( + mangaId: id, + type: 0, + )) + .type!; + + final filterBookmarked = (isar.settings + .getSync(227)! + .chapterFilterBookmarkedList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterBookmarked( + mangaId: id, + type: 0, + )) + .type!; + final filterDownloaded = (isar.settings + .getSync(227)! + .chapterFilterDownloadedList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterDownloaded( + mangaId: id, + type: 0, + )) + .type!; + + final sortChapter = (isar.settings + .getSync(227)! + .sortChapterList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + SortChapter( + mangaId: id, + index: 1, + reverse: false, + )) + .index; + final filterScanlator = _getFilterScanlator(this) ?? []; + List? chapterList; + chapterList = data + .where((element) => filterUnread == 1 + ? element.isRead == false + : filterUnread == 2 + ? element.isRead == true + : true) + .where((element) => filterBookmarked == 1 + ? element.isBookmarked == true + : filterBookmarked == 2 + ? element.isBookmarked == false + : true) + .where((element) { + final modelChapDownload = isar.downloads + .filter() + .idIsNotNull() + .chapterIdEqualTo(element.id) + .findAllSync(); + return filterDownloaded == 1 + ? modelChapDownload.isNotEmpty && + modelChapDownload.first.isDownload == true + : filterDownloaded == 2 + ? !(modelChapDownload.isNotEmpty && + modelChapDownload.first.isDownload == true) + : true; + }) + .where((element) => !filterScanlator.contains(element.scanlator)) + .toList(); + List chapters = + sortChapter == 1 ? chapterList.reversed.toList() : chapterList; + if (sortChapter == 0) { + chapters.sort( + (a, b) { + return (a.scanlator == null || + b.scanlator == null || + a.dateUpload == null || + b.dateUpload == null) + ? 0 + : a.scanlator!.compareTo(b.scanlator!) | + a.dateUpload!.compareTo(b.dateUpload!); + }, + ); + } else if (sortChapter == 2) { + chapters.sort( + (a, b) { + return (a.dateUpload == null || b.dateUpload == null) + ? 0 + : int.parse(a.dateUpload!).compareTo(int.parse(b.dateUpload!)); + }, + ); + } else if (sortChapter == 3) { + chapters.sort( + (a, b) { + return (a.name == null || b.name == null) + ? 0 + : a.name!.compareTo(b.name!); + }, + ); + } + return chapterList; + } +} + +List? _getFilterScanlator(Manga manga) { + final scanlators = isar.settings.getSync(227)!.filterScanlatorList ?? []; + final filter = + scanlators.where((element) => element.mangaId == manga.id).toList(); + return filter.firstOrNull?.scanlators; +} diff --git a/lib/modules/novel/novel_reader_controller_provider.g.dart b/lib/modules/novel/novel_reader_controller_provider.g.dart new file mode 100644 index 0000000..0d0d48b --- /dev/null +++ b/lib/modules/novel/novel_reader_controller_provider.g.dart @@ -0,0 +1,177 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'novel_reader_controller_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$novelReaderControllerHash() => + r'2eec885b858de8195e31a2d0b70feb56c1dc4268'; + +/// 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)); + } +} + +abstract class _$NovelReaderController + extends BuildlessAutoDisposeNotifier { + late final Chapter chapter; + + void build({ + required Chapter chapter, + }); +} + +/// See also [NovelReaderController]. +@ProviderFor(NovelReaderController) +const novelReaderControllerProvider = NovelReaderControllerFamily(); + +/// See also [NovelReaderController]. +class NovelReaderControllerFamily extends Family { + /// See also [NovelReaderController]. + const NovelReaderControllerFamily(); + + /// See also [NovelReaderController]. + NovelReaderControllerProvider call({ + required Chapter chapter, + }) { + return NovelReaderControllerProvider( + chapter: chapter, + ); + } + + @override + NovelReaderControllerProvider getProviderOverride( + covariant NovelReaderControllerProvider provider, + ) { + return call( + chapter: provider.chapter, + ); + } + + 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'novelReaderControllerProvider'; +} + +/// See also [NovelReaderController]. +class NovelReaderControllerProvider + extends AutoDisposeNotifierProviderImpl { + /// See also [NovelReaderController]. + NovelReaderControllerProvider({ + required Chapter chapter, + }) : this._internal( + () => NovelReaderController()..chapter = chapter, + from: novelReaderControllerProvider, + name: r'novelReaderControllerProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelReaderControllerHash, + dependencies: NovelReaderControllerFamily._dependencies, + allTransitiveDependencies: + NovelReaderControllerFamily._allTransitiveDependencies, + chapter: chapter, + ); + + NovelReaderControllerProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.chapter, + }) : super.internal(); + + final Chapter chapter; + + @override + void runNotifierBuild( + covariant NovelReaderController notifier, + ) { + return notifier.build( + chapter: chapter, + ); + } + + @override + Override overrideWith(NovelReaderController Function() create) { + return ProviderOverride( + origin: this, + override: NovelReaderControllerProvider._internal( + () => create()..chapter = chapter, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + chapter: chapter, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement + createElement() { + return _NovelReaderControllerProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is NovelReaderControllerProvider && other.chapter == chapter; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, chapter.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin NovelReaderControllerRef on AutoDisposeNotifierProviderRef { + /// The parameter `chapter` of this provider. + Chapter get chapter; +} + +class _NovelReaderControllerProviderElement + extends AutoDisposeNotifierProviderElement + with NovelReaderControllerRef { + _NovelReaderControllerProviderElement(super.provider); + + @override + Chapter get chapter => (origin as NovelReaderControllerProvider).chapter; +} +// 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 diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart new file mode 100644 index 0000000..79ff04b --- /dev/null +++ b/lib/modules/novel/novel_reader_view.dart @@ -0,0 +1,620 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:extended_image/extended_image.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/page.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/anime/widgets/desktop.dart'; +import 'package:mangayomi/modules/manga/reader/widgets/btn_chapter_list_dialog.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; +import 'package:mangayomi/modules/novel/novel_reader_controller_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/get_html_content.dart'; +import 'package:mangayomi/utils/utils.dart'; +import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; +import 'package:mangayomi/services/get_chapter_pages.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:mangayomi/utils/global_style.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:window_manager/window_manager.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; + +typedef DoubleClickAnimationListener = void Function(); + +class NovelReaderView extends ConsumerWidget { + final Chapter chapter; + const NovelReaderView({ + super.key, + required this.chapter, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final htmlContent = ref.watch(getHtmlContentProvider(chapter: chapter)); + + return NovelWebView( + chapter: chapter, + htmlContent: htmlContent, + ); + } +} + +class NovelWebView extends ConsumerStatefulWidget { + const NovelWebView({ + super.key, + required this.chapter, + required this.htmlContent, + }); + + final Chapter chapter; + final AsyncValue htmlContent; + + @override + ConsumerState createState() { + return _NovelWebViewState(); + } +} + +class _NovelWebViewState extends ConsumerState + with TickerProviderStateMixin { + late final NovelReaderController _readerController = + ref.read(novelReaderControllerProvider(chapter: chapter).notifier); + final _scrollController = ScrollController( + initialScrollOffset: 0, + keepScrollOffset: true, + ); + bool scrolled = false; + double offset = 0; + double maxOffset = 0; + bool isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; + + void onScroll() { + if (_scrollController.hasClients) { + offset = _scrollController.offset; + maxOffset = _scrollController.position.maxScrollExtent; + } + } + + @override + void dispose() { + _readerController.setChapterOffset(offset, maxOffset, true); + _readerController.setMangaHistoryUpdate(); + _scrollController.removeListener(onScroll); + _scrollController.dispose(); + _rebuildDetail.close(); + clearGestureDetailsCache(); + if (isDesktop) { + setFullScreen(value: false); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + } + super.dispose(); + } + + late Chapter chapter = widget.chapter; + + final StreamController _rebuildDetail = + StreamController.broadcast(); + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _scrollController.addListener(onScroll); + }); + } + + late bool _isBookmarked = _readerController.getChapterBookmarked(); + + bool _isView = false; + + double get pixelRatio => View.of(context).devicePixelRatio; + + Size get size => View.of(context).physicalSize / pixelRatio; + + Color _backgroundColor(BuildContext context) => + Theme.of(context).scaffoldBackgroundColor.withOpacity(0.9); + + void _setFullScreen({bool? value}) async { + if (isDesktop) { + value = await windowManager.isFullScreen(); + setFullScreen(value: !value); + } + ref.read(fullScreenReaderStateProvider.notifier).set(!value!); + } + + @override + Widget build(BuildContext context) { + final backgroundColor = ref.watch(backgroundColorStateProvider); + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + return KeyboardListener( + autofocus: true, + focusNode: FocusNode(), + onKeyEvent: (event) { + bool isLogicalKeyPressed(LogicalKeyboardKey key) => + HardwareKeyboard.instance.isLogicalKeyPressed(key); + bool hasNextChapter = _readerController.getChapterIndex().$1 != 0; + bool hasPrevChapter = _readerController.getChapterIndex().$1 + 1 != + _readerController + .getChaptersLength(_readerController.getChapterIndex().$2); + final action = switch (event.logicalKey) { + LogicalKeyboardKey.f11 => + (!isLogicalKeyPressed(LogicalKeyboardKey.f11)) + ? _setFullScreen() + : null, + LogicalKeyboardKey.escape => + (!isLogicalKeyPressed(LogicalKeyboardKey.escape)) + ? _goBack(context) + : null, + LogicalKeyboardKey.backspace => + (!isLogicalKeyPressed(LogicalKeyboardKey.backspace)) + ? _goBack(context) + : null, + LogicalKeyboardKey.keyN || + LogicalKeyboardKey.pageDown => + ((!isLogicalKeyPressed(LogicalKeyboardKey.keyN) || + !isLogicalKeyPressed(LogicalKeyboardKey.pageDown))) + ? switch (hasNextChapter) { + true => pushReplacementMangaReaderView( + context: context, + chapter: _readerController.getNextChapter(), + ), + _ => null + } + : null, + LogicalKeyboardKey.keyP || + LogicalKeyboardKey.pageUp => + ((!isLogicalKeyPressed(LogicalKeyboardKey.keyP) || + !isLogicalKeyPressed(LogicalKeyboardKey.pageUp))) + ? switch (hasPrevChapter) { + true => pushReplacementMangaReaderView( + context: context, + chapter: _readerController.getPrevChapter()), + _ => null + } + : null, + _ => null + }; + action; + }, + child: NotificationListener( + onNotification: (notification) { + if (notification.direction == ScrollDirection.idle) { + if (_isView) { + _isViewFunction(); + } + } + return true; + }, + child: Material( + child: SafeArea( + top: !fullScreenReader, + bottom: false, + child: Stack( + children: [ + Row( + children: [ + widget.htmlContent.when( + data: (htmlContent) { + Future.delayed(const Duration(milliseconds: 1000), + () { + if (!scrolled && _scrollController.hasClients) { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent * + (double.tryParse(chapter.lastPageRead!) ?? + 0), + duration: Duration(seconds: 2), + curve: Curves.fastOutSlowIn); + scrolled = true; + } + }); + return Expanded( + child: SingleChildScrollView( + controller: _scrollController, + physics: const BouncingScrollPhysics(), + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + child: Column( + children: [ + HtmlWidget( + htmlContent, + customStylesBuilder: (element) { + switch (backgroundColor) { + case BackgroundColor.black: + return { + 'background-color': 'black', + }; + default: + return { + 'background-color': '#F0F0F0', + }; + } + }, + onTapUrl: (url) { + context.push("/mangawebview", + extra: {'url': url, 'title': url}); + return true; + }, + renderMode: RenderMode.column, + textStyle: TextStyle( + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + fontSize: 14), + ), + Center( + heightFactor: 2, + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + spacing: 5, + children: [ + IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: _readerController + .getPrevChapter(), + ), + icon: Icon( + size: 32, + Icons.arrow_back, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: _readerController + .getNextChapter(), + ), + icon: Icon( + size: 32, + Icons.arrow_forward, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + }, + loading: () => const Expanded( + child: Center( + child: CircularProgressIndicator(), + )), + error: (err, stack) => Center( + child: Text(err.toString()), + )), + ], + ), + //_gestureRightLeft(), + //_gestureTopBottom(), + _appBar(), + ], + ), + ), + ), + ), + ); + } + + void _goBack(BuildContext context) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + Navigator.pop(context); + } + + Widget _appBar() { + if (!_isView && Platform.isIOS) { + return const SizedBox.shrink(); + } + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + double height = _isView + ? Platform.isIOS + ? 120 + : !fullScreenReader && !isDesktop + ? 55 + : 80 + : 0; + return Positioned( + top: 0, + child: AnimatedContainer( + width: context.width(1), + height: height, + curve: Curves.ease, + duration: const Duration(milliseconds: 200), + child: PreferredSize( + preferredSize: Size.fromHeight(height), + child: AppBar( + centerTitle: false, + automaticallyImplyLeading: false, + titleSpacing: 0, + leading: BackButton( + onPressed: () { + Navigator.pop(context); + }, + ), + title: ListTile( + dense: true, + title: SizedBox( + width: context.width(0.8), + child: Text( + '${_readerController.getMangaName()} ', + style: const TextStyle(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + ), + ), + subtitle: SizedBox( + width: context.width(0.8), + child: Text( + _readerController.getChapterTitle(), + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ), + actions: [ + btnToShowChapterListDialog( + context, context.l10n.chapters, widget.chapter), + IconButton( + onPressed: () { + _readerController.setChapterBookmarked(); + setState(() { + _isBookmarked = !_isBookmarked; + }); + }, + icon: Icon(_isBookmarked + ? Icons.bookmark + : Icons.bookmark_border_outlined)), + if ((chapter.manga.value!.isLocalArchive ?? false) == false) + IconButton( + onPressed: () async { + final manga = chapter.manga.value!; + final source = getSource(manga.lang!, manga.source!)!; + String url = chapter.url!.startsWith('/') + ? "${source.baseUrl}/${chapter.url!}" + : chapter.url!; + Map data = { + 'url': url, + 'sourceId': source.id.toString(), + 'title': chapter.name! + }; + if (Platform.isLinux) { + final urll = Uri.parse(url); + if (!await launchUrl( + urll, + mode: LaunchMode.inAppBrowserView, + )) { + if (!await launchUrl( + urll, + mode: LaunchMode.externalApplication, + )) { + throw 'Could not launch $url'; + } + } + } else { + context.push("/mangawebview", extra: data); + } + }, + icon: const Icon(Icons.public)), + ], + backgroundColor: _backgroundColor(context), + ), + ), + ), + ); + } + + void _isViewFunction() { + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + if (mounted) { + setState(() { + _isView = !_isView; + }); + } + if (fullScreenReader) { + if (_isView) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); + } + } + } + + Widget _gestureRightLeft() { + return Consumer( + builder: (context, ref, child) { + return Row( + children: [ + /// left region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + + /// center region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + + /// right region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + ], + ); + }, + ); + } + + Widget _gestureTopBottom() { + return Consumer( + builder: (context, ref, child) { + return Column( + children: [ + /// top region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + + /// center region + const Expanded(flex: 5, child: SizedBox.shrink()), + + /// bottom region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + ], + ); + }, + ); + } +} + +class UChapDataPreload { + Chapter? chapter; + Directory? directory; + PageUrl? pageUrl; + bool? isLocale; + Uint8List? archiveImage; + int? index; + GetChapterPagesModel? chapterUrlModel; + int? pageIndex; + Uint8List? cropImage; + UChapDataPreload(this.chapter, this.directory, this.pageUrl, this.isLocale, + this.archiveImage, this.index, this.chapterUrlModel, this.pageIndex, + {this.cropImage}); +} + +class CustomPopupMenuButton extends StatelessWidget { + final String label; + final String title; + final ValueChanged onSelected; + final T value; + final List list; + final String Function(T) itemText; + const CustomPopupMenuButton( + {super.key, + required this.label, + required this.title, + required this.onSelected, + required this.value, + required this.list, + required this.itemText}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: PopupMenuButton( + popUpAnimationStyle: popupAnimationStyle, + tooltip: "", + offset: Offset.fromDirection(1), + color: Colors.black, + onSelected: onSelected, + itemBuilder: (context) => [ + for (var d in list) + PopupMenuItem( + value: d, + child: Row( + children: [ + Icon( + Icons.check, + color: d == value ? Colors.white : Colors.transparent, + ), + const SizedBox(width: 7), + Text( + itemText(d), + style: const TextStyle(color: Colors.white), + ), + ], + )), + ], + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + label, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9)), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + Row( + children: [ + Text(title), + const SizedBox(width: 20), + const Icon(Icons.keyboard_arrow_down_outlined) + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index c1fcf0d..a852407 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -11,6 +11,7 @@ import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/updates/widgets/update_chapter_list_tile_widget.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -31,6 +32,7 @@ class _UpdatesScreenState extends ConsumerState with TickerProviderStateMixin { late TabController _tabBarController; bool _isLoading = false; + int tabs = 3; Future _updateLibrary() async { setState(() { _isLoading = true; @@ -42,7 +44,11 @@ class _UpdatesScreenState extends ConsumerState .idIsNotNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(_tabBarController.index == 0) + .itemTypeEqualTo(_tabBarController.index == 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel) .findAllSync(); int numbers = 0; @@ -66,16 +72,18 @@ class _UpdatesScreenState extends ConsumerState }); } + void tabListener() { + setState(() { + _textEditingController.clear(); + _isSearch = false; + }); + } + @override void initState() { - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: tabs, vsync: this); _tabBarController.animateTo(0); - _tabBarController.addListener(() { - setState(() { - _textEditingController.clear(); - _isSearch = false; - }); - }); + _tabBarController.addListener(tabListener); super.initState(); } @@ -84,10 +92,27 @@ class _UpdatesScreenState extends ConsumerState List entriesData = []; @override Widget build(BuildContext context) { + int newTabs = 0; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + if (!hideManga) newTabs++; + if (!hideAnime) newTabs++; + if (!hideNovel) newTabs++; + if (tabs != newTabs) { + _tabBarController.removeListener(tabListener); + _tabBarController.dispose(); + _tabBarController = TabController(length: newTabs, vsync: this); + _tabBarController.animateTo(0); + _tabBarController.addListener(tabListener); + setState(() { + tabs = newTabs; + }); + } final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: newTabs, child: Scaffold( appBar: AppBar( elevation: 0, @@ -160,10 +185,20 @@ class _UpdatesScreenState extends ConsumerState List updates = isar.updates .filter() .idIsNotNull() - .chapter((q) => q.manga((q) => - q.isMangaEqualTo( - _tabBarController.index == - 0))) + .chapter((q) => q.manga((q) => q + .itemTypeEqualTo(_tabBarController + .index == + 0 && + !hideManga + ? ItemType.manga + : _tabBarController.index == + 1 - + (hideManga + ? 1 + : 0) && + !hideAnime + ? ItemType.anime + : ItemType.novel))) .findAllSync() .toList(); isar.writeTxnSync(() { @@ -189,22 +224,30 @@ class _UpdatesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), - Tab(text: l10n.anime), + if (!hideManga) Tab(text: l10n.manga), + if (!hideAnime) Tab(text: l10n.anime), + if (!hideNovel) Tab(text: l10n.novel), ], ), ), body: Padding( padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ - UpdateTab( - isManga: true, - query: _textEditingController.text, - isLoading: _isLoading), - UpdateTab( - isManga: false, - query: _textEditingController.text, - isLoading: _isLoading) + if (!hideManga) + UpdateTab( + itemType: ItemType.manga, + query: _textEditingController.text, + isLoading: _isLoading), + if (!hideAnime) + UpdateTab( + itemType: ItemType.anime, + query: _textEditingController.text, + isLoading: _isLoading), + if (!hideNovel) + UpdateTab( + itemType: ItemType.novel, + query: _textEditingController.text, + isLoading: _isLoading) ]), ), ), @@ -214,10 +257,10 @@ class _UpdatesScreenState extends ConsumerState class UpdateTab extends ConsumerStatefulWidget { final String query; - final bool isManga; + final ItemType itemType; final bool isLoading; const UpdateTab( - {required this.isManga, + {required this.itemType, required this.query, required this.isLoading, super.key}); @@ -231,7 +274,7 @@ class _UpdateTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final update = - ref.watch(getAllUpdateStreamProvider(isManga: widget.isManga)); + ref.watch(getAllUpdateStreamProvider(itemType: widget.itemType)); return Scaffold( body: Stack( children: [ diff --git a/lib/modules/widgets/manga_image_card_widget.dart b/lib/modules/widgets/manga_image_card_widget.dart index 382a62c..90d8dc1 100644 --- a/lib/modules/widgets/manga_image_card_widget.dart +++ b/lib/modules/widgets/manga_image_card_widget.dart @@ -19,7 +19,7 @@ import 'package:mangayomi/modules/widgets/cover_view_widget.dart'; class MangaImageCardWidget extends ConsumerWidget { final Source source; - final bool isManga; + final ItemType itemType; final bool isComfortableGrid; final MManga? getMangaDetail; @@ -28,7 +28,7 @@ class MangaImageCardWidget extends ConsumerWidget { super.key, required this.getMangaDetail, required this.isComfortableGrid, - required this.isManga}); + required this.itemType}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -68,7 +68,7 @@ class MangaImageCardWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga); + itemType: itemType); }, onLongPress: () { pushToMangaReaderDetail( @@ -76,7 +76,7 @@ class MangaImageCardWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, onSecondaryTap: () { @@ -85,7 +85,7 @@ class MangaImageCardWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, children: [ @@ -121,13 +121,13 @@ class MangaImageCardWidget extends ConsumerWidget { class MangaImageCardListTileWidget extends ConsumerWidget { final Source source; - final bool isManga; + final ItemType itemType; final MManga? getMangaDetail; const MangaImageCardListTileWidget( {required this.source, super.key, - required this.isManga, + required this.itemType, required this.getMangaDetail}); @override @@ -166,7 +166,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga); + itemType: itemType); }, onLongPress: () { pushToMangaReaderDetail( @@ -174,7 +174,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, onSecondaryTap: () { @@ -183,7 +183,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, child: Row( @@ -252,7 +252,7 @@ Future pushToMangaReaderDetail( required String source, int? archiveId, Manga? mangaM, - bool? isManga, + ItemType? itemType, bool useMaterialRoute = false, bool addToFavourite = false}) async { int? mangaId; @@ -269,7 +269,7 @@ Future pushToMangaReaderDetail( source: source, lang: lang, lastUpdate: 0, - isManga: isManga ?? true, + itemType: itemType ?? ItemType.manga, artist: getManga.artist ?? ''); final empty = isar.mangas .filter() diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index c16f407..a2977e8 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -4,7 +4,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; -import 'package:mangayomi/models/changed_items.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/update.dart'; @@ -88,19 +87,29 @@ class StorageProvider { String scanlator = chapter.scanlator?.isNotEmpty ?? false ? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_" : ""; - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/" + "${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/" .fixSeparator); } Future getMangaMainDirectory(Chapter chapter) async { final manga = chapter.manga.value!; - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/" + "${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/" .fixSeparator); } @@ -137,7 +146,6 @@ class StorageProvider { final isar = Isar.openSync([ MangaSchema, - ChangedItemsSchema, ChapterSchema, CategorySchema, UpdateSchema, diff --git a/lib/router/router.dart b/lib/router/router.dart index df81ea6..f5199a7 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/anime/anime_player_view.dart'; @@ -10,6 +11,7 @@ import 'package:mangayomi/modules/browse/extension/edit_code.dart'; import 'package:mangayomi/modules/browse/extension/extension_detail.dart'; import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart'; import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart'; +import 'package:mangayomi/modules/novel/novel_reader_view.dart'; import 'package:mangayomi/modules/updates/updates_screen.dart'; import 'package:mangayomi/modules/more/backup_and_restore/backup_and_restore.dart'; import 'package:mangayomi/modules/more/categories/categories_screen.dart'; @@ -86,12 +88,12 @@ class RouterNotifier extends ChangeNotifier { name: "MangaLibrary", path: '/MangaLibrary', builder: (context, state) => const LibraryScreen( - isManga: true, + itemType: ItemType.manga, ), pageBuilder: (context, state) => transitionPage( key: state.pageKey, child: const LibraryScreen( - isManga: true, + itemType: ItemType.manga, ), ), ), @@ -99,12 +101,25 @@ class RouterNotifier extends ChangeNotifier { name: "AnimeLibrary", path: '/AnimeLibrary', builder: (context, state) => const LibraryScreen( - isManga: false, + itemType: ItemType.anime, ), pageBuilder: (context, state) => transitionPage( key: state.pageKey, child: const LibraryScreen( - isManga: false, + itemType: ItemType.anime, + ), + ), + ), + GoRoute( + name: "NovelLibrary", + path: '/NovelLibrary', + builder: (context, state) => const LibraryScreen( + itemType: ItemType.novel, + ), + pageBuilder: (context, state) => transitionPage( + key: state.pageKey, + child: const LibraryScreen( + itemType: ItemType.novel, ), ), ), @@ -184,8 +199,8 @@ class RouterNotifier extends ChangeNotifier { )); }), GoRoute( - path: "/mangareaderview", - name: "mangareaderview", + path: "/mangaReaderView", + name: "mangaReaderView", builder: (context, state) { final chapter = state.extra as Chapter; return MangaReaderView( @@ -221,6 +236,25 @@ class RouterNotifier extends ChangeNotifier { ); }, ), + GoRoute( + path: "/novelReaderView", + name: "novelReaderView", + builder: (context, state) { + final chapter = state.extra as Chapter; + return NovelReaderView( + chapter: chapter, + ); + }, + pageBuilder: (context, state) { + final chapter = state.extra as Chapter; + return transitionPage( + key: state.pageKey, + child: NovelReaderView( + chapter: chapter, + ), + ); + }, + ), GoRoute( path: "/ExtensionLang", name: "ExtensionLang", diff --git a/lib/services/fetch_anime_sources.dart b/lib/services/fetch_anime_sources.dart index bef157b..574b143 100644 --- a/lib/services/fetch_anime_sources.dart +++ b/lib/services/fetch_anime_sources.dart @@ -1,3 +1,4 @@ +import 'package:mangayomi/models/manga.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'; @@ -13,6 +14,6 @@ Future fetchAnimeSourcesList(Ref ref, {int? id, required bool reFresh}) async { refresh: reFresh, id: id, ref: ref, - isManga: false); + itemType: ItemType.anime); } } diff --git a/lib/services/fetch_anime_sources.g.dart b/lib/services/fetch_anime_sources.g.dart index 4a80780..3c1c4e6 100644 --- a/lib/services/fetch_anime_sources.g.dart +++ b/lib/services/fetch_anime_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart'; // ************************************************************************** String _$fetchAnimeSourcesListHash() => - r'8fbe1642aee4d475583a1f04b2d236984c6fcfb4'; + r'75185e008e90491987fabb55851c536de89653a4'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/fetch_manga_sources.dart b/lib/services/fetch_manga_sources.dart index 25254fa..99265cc 100644 --- a/lib/services/fetch_manga_sources.dart +++ b/lib/services/fetch_manga_sources.dart @@ -1,3 +1,4 @@ +import 'package:mangayomi/models/manga.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'; @@ -13,6 +14,6 @@ Future fetchMangaSourcesList(Ref ref, {int? id, required reFresh}) async { refresh: reFresh, id: id, ref: ref, - isManga: true); + itemType: ItemType.manga); } } diff --git a/lib/services/fetch_manga_sources.g.dart b/lib/services/fetch_manga_sources.g.dart index 44c0863..6bf219e 100644 --- a/lib/services/fetch_manga_sources.g.dart +++ b/lib/services/fetch_manga_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart'; // ************************************************************************** String _$fetchMangaSourcesListHash() => - r'8bc08c334cfdba887227c154e249355f33e69da4'; + r'f66f3011e72a3b234d7729ef203fc5f255870db3'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart new file mode 100644 index 0000000..ae9b6c9 --- /dev/null +++ b/lib/services/fetch_novel_sources.dart @@ -0,0 +1,20 @@ +import 'package:mangayomi/models/manga.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 +Future fetchNovelSourcesList(Ref ref, + {int? id, required reFresh}) async { + if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { + await fetchSourcesList( + sourcesIndexUrl: + "https://raw.githubusercontent.com/Schnitzel5/mangayomi-extensions/refs/heads/main/novel_index.json", + refresh: reFresh, + id: id, + ref: ref, + itemType: ItemType.novel); + } +} diff --git a/lib/services/fetch_novel_sources.g.dart b/lib/services/fetch_novel_sources.g.dart new file mode 100644 index 0000000..c212a85 --- /dev/null +++ b/lib/services/fetch_novel_sources.g.dart @@ -0,0 +1,179 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'fetch_novel_sources.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$fetchNovelSourcesListHash() => + r'cc4b989c0248c3b16155444c0c429d1ed0025ecb'; + +/// 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 { + /// 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? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'fetchNovelSourcesListProvider'; +} + +/// See also [fetchNovelSourcesList]. +class FetchNovelSourcesListProvider extends AutoDisposeFutureProvider { + /// 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 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 + AutoDisposeFutureProviderElement 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 AutoDisposeFutureProviderRef { + /// The parameter `id` of this provider. + int? get id; + + /// The parameter `reFresh` of this provider. + dynamic get reFresh; +} + +class _FetchNovelSourcesListProviderElement + extends AutoDisposeFutureProviderElement + 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 diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index ce048a5..7169c23 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/eval/lib.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/services/http/m_client.dart'; @@ -13,7 +14,7 @@ Future fetchSourcesList( required bool refresh, required String sourcesIndexUrl, required Ref ref, - required bool isManga}) async { + required ItemType itemType}) async { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); final req = await http.get(Uri.parse(sourcesIndexUrl)); @@ -25,7 +26,7 @@ Future fetchSourcesList( for (var source in sourceList) { if (source.appMinVerReq != null) { if (compareVersions(info.version, source.appMinVerReq!) > -1) { - if ((source.isManga ?? true) == isManga) { + if (source.itemType == itemType || (!source.isManga! && itemType == ItemType.anime)) { if (id != null) { if (id == source.id) { final sourc = isar.sources.getSync(id)!; @@ -52,7 +53,7 @@ Future fetchSourcesList( ..name = source.name ..version = source.version ..versionLast = source.version - ..isManga = source.isManga + ..itemType = itemType ..isFullData = source.isFullData ?? false ..appMinVerReq = source.appMinVerReq ..sourceCodeLanguage = source.sourceCodeLanguage @@ -92,7 +93,7 @@ Future fetchSourcesList( ..name = source.name ..version = source.version ..versionLast = source.version - ..isManga = source.isManga + ..itemType = itemType ..isFullData = source.isFullData ?? false ..appMinVerReq = source.appMinVerReq ..sourceCodeLanguage = source.sourceCodeLanguage @@ -122,7 +123,7 @@ Future fetchSourcesList( ..name = source.name ..version = source.version ..versionLast = source.version - ..isManga = source.isManga + ..itemType = itemType ..sourceCodeLanguage = source.sourceCodeLanguage ..isFullData = source.isFullData ?? false ..appMinVerReq = source.appMinVerReq @@ -134,14 +135,14 @@ Future fetchSourcesList( } } }); - checkIfSourceIsObsolete(sourceList, isManga); + checkIfSourceIsObsolete(sourceList, itemType); } -void checkIfSourceIsObsolete(List sourceList, bool isManga) { +void checkIfSourceIsObsolete(List sourceList, ItemType itemType) { for (var source in isar.sources .filter() .idIsNotNull() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .findAllSync()) { if (sourceList.isNotEmpty && !(source.isLocal ?? false)) { final ids = diff --git a/lib/services/get_chapter_pages.g.dart b/lib/services/get_chapter_pages.g.dart index 62e0dda..02af665 100644 --- a/lib/services/get_chapter_pages.g.dart +++ b/lib/services/get_chapter_pages.g.dart @@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart'; // RiverpodGenerator // ************************************************************************** -String _$getChapterPagesHash() => r'8a2606a6640046cb006b24516bf88512f3204aca'; +String _$getChapterPagesHash() => r'5b18b20360abecf1125f27c32b10977dd18f1831'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart new file mode 100644 index 0000000..5501250 --- /dev/null +++ b/lib/services/get_html_content.dart @@ -0,0 +1,27 @@ +import 'package:mangayomi/eval/dart/service.dart'; +import 'package:mangayomi/eval/javascript/service.dart'; +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/utils/utils.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +part 'get_html_content.g.dart'; + +@riverpod +Future getHtmlContent(Ref ref, {required Chapter chapter}) async { + if (!chapter.manga.isLoaded) { + chapter.manga.loadSync(); + } + final source = + getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!); + String? html; + if (source!.sourceCodeLanguage == SourceCodeLanguage.dart) { + html = await DartExtensionService(source).getHtmlContent(chapter.url!); + } else { + html = await JsExtensionService(source).getHtmlContent(chapter.url!); + } + return '''

${html.substring(1, html.length - 1)}
''' + .replaceAll("\\n", "") + .replaceAll("\\t", "") + .replaceAll("\\\"", "\""); +} diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart new file mode 100644 index 0000000..5444182 --- /dev/null +++ b/lib/services/get_html_content.g.dart @@ -0,0 +1,160 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'get_html_content.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$getHtmlContentHash() => r'0c964239912b7f93bfb4c80a47f7266ff1ae3f5e'; + +/// 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 [getHtmlContent]. +@ProviderFor(getHtmlContent) +const getHtmlContentProvider = GetHtmlContentFamily(); + +/// See also [getHtmlContent]. +class GetHtmlContentFamily extends Family> { + /// See also [getHtmlContent]. + const GetHtmlContentFamily(); + + /// See also [getHtmlContent]. + GetHtmlContentProvider call({ + required Chapter chapter, + }) { + return GetHtmlContentProvider( + chapter: chapter, + ); + } + + @override + GetHtmlContentProvider getProviderOverride( + covariant GetHtmlContentProvider provider, + ) { + return call( + chapter: provider.chapter, + ); + } + + 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'getHtmlContentProvider'; +} + +/// See also [getHtmlContent]. +class GetHtmlContentProvider extends AutoDisposeFutureProvider { + /// See also [getHtmlContent]. + GetHtmlContentProvider({ + required Chapter chapter, + }) : this._internal( + (ref) => getHtmlContent( + ref as GetHtmlContentRef, + chapter: chapter, + ), + from: getHtmlContentProvider, + name: r'getHtmlContentProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$getHtmlContentHash, + dependencies: GetHtmlContentFamily._dependencies, + allTransitiveDependencies: + GetHtmlContentFamily._allTransitiveDependencies, + chapter: chapter, + ); + + GetHtmlContentProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.chapter, + }) : super.internal(); + + final Chapter chapter; + + @override + Override overrideWith( + FutureOr Function(GetHtmlContentRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: GetHtmlContentProvider._internal( + (ref) => create(ref as GetHtmlContentRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + chapter: chapter, + ), + ); + } + + @override + AutoDisposeFutureProviderElement createElement() { + return _GetHtmlContentProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is GetHtmlContentProvider && other.chapter == chapter; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, chapter.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin GetHtmlContentRef on AutoDisposeFutureProviderRef { + /// The parameter `chapter` of this provider. + Chapter get chapter; +} + +class _GetHtmlContentProviderElement + extends AutoDisposeFutureProviderElement with GetHtmlContentRef { + _GetHtmlContentProviderElement(super.provider); + + @override + Chapter get chapter => (origin as GetHtmlContentProvider).chapter; +} +// 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 diff --git a/lib/services/sync_server.dart b/lib/services/sync_server.dart index 948b87b..7be9826 100644 --- a/lib/services/sync_server.dart +++ b/lib/services/sync_server.dart @@ -1,9 +1,7 @@ -import 'package:crypto/crypto.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; -import 'package:mangayomi/models/changed_items.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/sync_preference.dart'; import 'package:mangayomi/models/track.dart'; @@ -13,6 +11,7 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/backup_and_restore/providers/restore.dart'; import 'package:mangayomi/modules/more/settings/sync/models/jwt.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/blend_level_state_provider.dart'; @@ -30,8 +29,6 @@ part 'sync_server.g.dart'; class SyncServer extends _$SyncServer { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); final String _loginUrl = '/login'; - final String _checkUrl = '/check'; - final String _syncUrl = '/sync'; final String _uploadUrl = '/upload/full'; final String _downloadUrl = '/download'; @@ -67,78 +64,6 @@ class SyncServer extends _$SyncServer { } } - Future checkForSync(bool silent) async { - if (!silent) { - botToast("Checking for sync...", second: 2); - } - try { - final datas = _getData(); - final accessToken = _getAccessToken(); - final localHash = _getDataHash(datas); - - var response = await http.get( - Uri.parse('${_getServer()}$_checkUrl'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $accessToken' - }, - ); - if (response.statusCode != 200) { - botToast("Check failed", second: 5); - return; - } - var jsonData = jsonDecode(response.body) as Map; - final remoteHash = jsonData["hash"]; - if (localHash != remoteHash) { - syncToServer(silent); - } else if (!silent) { - botToast("Sync up to date", second: 2); - } - } catch (error) { - botToast(error.toString(), second: 5); - } - } - - Future syncToServer(bool silent) async { - if (!silent) { - botToast("Sync started...", second: 2); - } - try { - final datas = _getData(); - final accessToken = _getAccessToken(); - - var response = await http.post( - Uri.parse('${_getServer()}$_syncUrl'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $accessToken' - }, - body: jsonEncode( - {'backupData': datas, 'changedItems': _getChangedData()}), - ); - if (response.statusCode != 200) { - botToast("Sync failed", second: 5); - return; - } - var jsonData = jsonDecode(response.body) as Map; - final decodedBackupData = jsonData["backupData"] is String - ? jsonDecode(jsonData["backupData"]) - : jsonData["backupData"]; - _restoreMerge(decodedBackupData); - ref - .read(synchingProvider(syncId: syncId).notifier) - .setLastSync(DateTime.now().millisecondsSinceEpoch); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .cleanChangedItems(true); - if (!silent) { - botToast("Sync finished", second: 2); - } - } catch (error) { - botToast(error.toString(), second: 5); - } - } - Future uploadToServer(AppLocalizations l10n) async { botToast(l10n.sync_uploading, second: 2); try { @@ -160,9 +85,6 @@ class SyncServer extends _$SyncServer { ref .read(synchingProvider(syncId: syncId).notifier) .setLastUpload(DateTime.now().millisecondsSinceEpoch); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .cleanChangedItems(true); botToast(l10n.sync_upload_finished, second: 2); } catch (error) { botToast(error.toString(), second: 5); @@ -192,52 +114,15 @@ class SyncServer extends _$SyncServer { ref .read(synchingProvider(syncId: syncId).notifier) .setLastDownload(DateTime.now().millisecondsSinceEpoch); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .cleanChangedItems(true); botToast(l10n.sync_download_finished, second: 2); } catch (error) { botToast(error.toString(), second: 5); } } - String _getDataHash(Map data) { - Map datas = {}; - datas["version"] = data["version"]; - datas["manga"] = data["manga"]; - datas["categories"] = data["categories"]; - datas["chapters"] = data["chapters"]; - datas["tracks"] = data["tracks"]; - datas["history"] = data["history"]; - datas["updates"] = data["updates"]; - var encodedJson = jsonEncode(datas); - return sha256.convert(utf8.encode(encodedJson)).toString(); - } - - Map _getChangedData() { - Map data = {}; - final changedItems = isar.changedItems.getSync(1); - if (changedItems != null) { - data.addAll({ - "deletedMangas": - changedItems.deletedMangas?.map((e) => e.toJson()).toList() ?? [] - }); - data.addAll({ - "updatedChapters": - changedItems.updatedChapters?.map((e) => e.toJson()).toList() ?? [] - }); - data.addAll({ - "deletedCategories": - changedItems.deletedCategories?.map((e) => e.toJson()).toList() ?? - [] - }); - } - return data; - } - Map _getData() { Map datas = {}; - datas.addAll({"version": "1"}); + datas.addAll({"version": "2"}); final mangas = isar.mangas .filter() .idIsNotNull() @@ -309,208 +194,11 @@ class SyncServer extends _$SyncServer { return datas; } - void _restoreMerge(Map backup) { - if (backup['version'] == "1") { - try { - final manga = - (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); - final chapters = (backup["chapters"] as List?) - ?.map((e) => Chapter.fromJson(e)) - .toList(); - final categories = (backup["categories"] as List?) - ?.map((e) => Category.fromJson(e)) - .toList(); - final track = - (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); - final history = (backup["history"] as List?) - ?.map((e) => History.fromJson(e)) - .toList(); - final updates = (backup["updates"] as List?) - ?.map((e) => Update.fromJson(e)) - .toList(); - - isar.writeTxnSync(() { - isar.mangas.clearSync(); - if (manga != null) { - isar.mangas.putAllSync(manga); - if (chapters != null) { - isar.chapters.clearSync(); - for (var chapter in chapters) { - final manga = isar.mangas.getSync(chapter.mangaId!); - if (manga != null) { - isar.chapters.putSync(chapter..manga.value = manga); - chapter.manga.saveSync(); - } - } - - isar.historys.clearSync(); - if (history != null) { - for (var element in history) { - final chapter = isar.chapters.getSync(element.chapterId!); - if (chapter != null) { - isar.historys.putSync(element..chapter.value = chapter); - element.chapter.saveSync(); - } - } - } - - isar.updates.clearSync(); - if (updates != null) { - final tempChapters = - isar.chapters.filter().idIsNotNull().findAllSync().toList(); - for (var update in updates) { - final matchingChapter = tempChapters - .where((chapter) => - chapter.mangaId == update.mangaId && - chapter.name == update.chapterName) - .firstOrNull; - if (matchingChapter != null) { - isar.updates - .putSync(update..chapter.value = matchingChapter); - update.chapter.saveSync(); - } - } - } - } - - isar.categorys.clearSync(); - if (categories != null) { - isar.categorys.putAllSync(categories); - } - } - - isar.tracks.clearSync(); - if (track != null) { - isar.tracks.putAllSync(track); - } - - ref.invalidate(themeModeStateProvider); - ref.invalidate(blendLevelStateProvider); - ref.invalidate(flexSchemeColorStateProvider); - ref.invalidate(pureBlackDarkModeStateProvider); - ref.invalidate(l10nLocaleStateProvider); - }); - } catch (e) { - botToast(e.toString()); - } - } - } - void _restore(Map backup) { if (backup['version'] == "1") { - try { - final manga = - (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); - final chapters = (backup["chapters"] as List?) - ?.map((e) => Chapter.fromJson(e)) - .toList(); - final categories = (backup["categories"] as List?) - ?.map((e) => Category.fromJson(e)) - .toList(); - final track = - (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); - final history = (backup["history"] as List?) - ?.map((e) => History.fromJson(e)) - .toList(); - final settings = (backup["settings"] as List?) - ?.map((e) => Settings.fromJson(e)) - .toList(); - final extensions = (backup["extensions"] as List?) - ?.map((e) => Source.fromJson(e)) - .toList(); - final extensionsPref = (backup["extensions_preferences"] as List?) - ?.map((e) => SourcePreference.fromJson(e)) - .toList(); - final updates = (backup["updates"] as List?) - ?.map((e) => Update.fromJson(e)) - .toList(); - - isar.writeTxnSync(() { - isar.mangas.clearSync(); - if (manga != null) { - isar.mangas.putAllSync(manga); - if (chapters != null) { - isar.chapters.clearSync(); - for (var chapter in chapters) { - final manga = isar.mangas.getSync(chapter.mangaId!); - if (manga != null) { - isar.chapters.putSync(chapter..manga.value = manga); - chapter.manga.saveSync(); - } - } - - isar.historys.clearSync(); - if (history != null) { - for (var element in history) { - final chapter = isar.chapters.getSync(element.chapterId!); - if (chapter != null) { - isar.historys.putSync(element..chapter.value = chapter); - element.chapter.saveSync(); - } - } - } - - isar.updates.clearSync(); - if (updates != null) { - final tempChapters = - isar.chapters.filter().idIsNotNull().findAllSync().toList(); - for (var update in updates) { - final matchingChapter = tempChapters - .where((chapter) => - chapter.mangaId == update.mangaId && - chapter.name == update.chapterName) - .firstOrNull; - if (matchingChapter != null) { - isar.updates - .putSync(update..chapter.value = matchingChapter); - update.chapter.saveSync(); - } - } - } - } - - isar.categorys.clearSync(); - if (categories != null) { - isar.categorys.putAllSync(categories); - } - } - - isar.tracks.clearSync(); - if (track != null) { - isar.tracks.putAllSync(track); - } - - isar.sources.clearSync(); - if (extensions != null) { - isar.sources.putAllSync(extensions); - } - - isar.sourcePreferences.clearSync(); - if (extensionsPref != null) { - isar.sourcePreferences.putAllSync(extensionsPref); - } - final syncAfterReading = isar.settings.getSync(227)!.syncAfterReading; - final syncOnAppLaunch = isar.settings.getSync(227)!.syncOnAppLaunch; - isar.settings.clearSync(); - if (settings != null) { - isar.settings.putAllSync(settings); - } - if (isar.settings.getSync(227) == null) { - isar.settings.putSync(Settings(id: 227)); - } - isar.settings.putSync( - isar.settings.getSync(227)!..syncAfterReading = syncAfterReading); - isar.settings.putSync( - isar.settings.getSync(227)!..syncOnAppLaunch = syncOnAppLaunch); - ref.invalidate(themeModeStateProvider); - ref.invalidate(blendLevelStateProvider); - ref.invalidate(flexSchemeColorStateProvider); - ref.invalidate(pureBlackDarkModeStateProvider); - ref.invalidate(l10nLocaleStateProvider); - }); - } catch (e) { - botToast(e.toString(), second: 5); - } + ref.watch(restoreV1Provider(backup)); + } else if (backup['version'] == "2") { + ref.watch(restoreV2Provider(backup)); } } diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index b2a9cd6..daf4b7a 100644 --- a/lib/services/sync_server.g.dart +++ b/lib/services/sync_server.g.dart @@ -6,7 +6,7 @@ part of 'sync_server.dart'; // RiverpodGenerator // ************************************************************************** -String _$syncServerHash() => r'99e16d503937f2973f00c0cf2e834a03cf4aa245'; +String _$syncServerHash() => r'4ef01cd50d1ec4eaecd971fe2f176d2650147df8'; /// Copied from Dart SDK class _SystemHash { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 0ffae2a..3c553d1 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,10 +5,12 @@ import FlutterMacOS import Foundation +import audio_session import flutter_inappwebview_macos import flutter_qjs import flutter_web_auth_2 import isar_flutter_libs +import just_audio import media_kit_libs_macos_video import media_kit_video import package_info_plus @@ -16,16 +18,21 @@ import path_provider_foundation import screen_brightness_macos import screen_retriever_macos import share_plus +import sqflite_darwin import url_launcher_macos +import video_player_avfoundation import wakelock_plus +import webview_flutter_wkwebview import window_manager import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) FlutterQjsPlugin.register(with: registry.registrar(forPlugin: "FlutterQjsPlugin")) FlutterWebAuth2Plugin.register(with: registry.registrar(forPlugin: "FlutterWebAuth2Plugin")) IsarFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "IsarFlutterLibsPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) @@ -33,8 +40,11 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 0e28a84..2720009 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,6 +70,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + audio_session: + dependency: transitive + description: + name: audio_session + sha256: b2a26ba8b7efa1790d6460e82971fde3e398cfbe2295df9dea22f3499d2c12a7 + url: "https://pub.dev" + source: hosted + version: "0.1.23" autotrie: dependency: transitive description: @@ -98,10 +106,10 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" build_cli_annotations: dependency: transitive description: @@ -114,42 +122,42 @@ packages: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.14" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "8.0.0" built_collection: dependency: transitive description: @@ -162,10 +170,34 @@ packages: dependency: transitive description: name: built_value - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" url: "https://pub.dev" source: hosted - version: "8.9.2" + version: "8.9.3" + cached_network_image: + dependency: transitive + description: + name: cached_network_image + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" + source: hosted + version: "1.3.1" change_case: dependency: transitive description: @@ -198,6 +230,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + chewie: + dependency: transitive + description: + name: chewie + sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd" + url: "https://pub.dev" + source: hosted + version: "1.8.5" cli_util: dependency: transitive description: @@ -258,10 +298,10 @@ packages: dependency: transitive description: name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "0.17.3" cupertino_icons: dependency: "direct main" description: @@ -468,6 +508,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" flutter_code_editor: dependency: "direct main" description: @@ -573,10 +621,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.0.24" flutter_qjs: dependency: "direct main" description: @@ -602,6 +650,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123" + url: "https://pub.dev" + source: hosted + version: "2.0.16" flutter_test: dependency: "direct dev" description: flutter @@ -628,6 +684,22 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_widget_from_html: + dependency: "direct main" + description: + name: flutter_widget_from_html + sha256: f3967a5b42896662efdd420b5adaf8a7d3692b0f44462a07c80e3b4c173b1a02 + url: "https://pub.dev" + source: hosted + version: "0.15.3" + flutter_widget_from_html_core: + dependency: transitive + description: + name: flutter_widget_from_html_core + sha256: b1048fd119a14762e2361bd057da608148a895477846d6149109b2151d2f7abf + url: "https://pub.dev" + source: hosted + version: "0.15.2" font_awesome_flutter: dependency: "direct main" description: @@ -660,6 +732,54 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + fwfh_cached_network_image: + dependency: transitive + description: + name: fwfh_cached_network_image + sha256: "8e44226801bfba27930673953afce8af44da7e92573be93f60385d9865a089dd" + url: "https://pub.dev" + source: hosted + version: "0.14.3" + fwfh_chewie: + dependency: transitive + description: + name: fwfh_chewie + sha256: "37bde9cedfb6dc5546176f7f0c56af1e814966cb33ec58f16c9565ed93ccb704" + url: "https://pub.dev" + source: hosted + version: "0.14.8" + fwfh_just_audio: + dependency: transitive + description: + name: fwfh_just_audio + sha256: "38dc2c55803bd3cef33042c473e0c40b891ad4548078424641a32032f6a1245f" + url: "https://pub.dev" + source: hosted + version: "0.15.2" + fwfh_svg: + dependency: transitive + description: + name: fwfh_svg + sha256: "550b1014d12b5528d8bdb6e3b44b58721f3fb1f65d7a852d1623a817008bdfc4" + url: "https://pub.dev" + source: hosted + version: "0.8.3" + fwfh_url_launcher: + dependency: transitive + description: + name: fwfh_url_launcher + sha256: b9f5d55a5ae2c2c07243ba33f7ba49ac9544bdb2f4c16d8139df9ccbebe3449c + url: "https://pub.dev" + source: hosted + version: "0.9.1" + fwfh_webview: + dependency: transitive + description: + name: fwfh_webview + sha256: c0a8b664b642f40f4c252a0ab4e72c22dcd97c7fb3a7e50a6b4bdb6f63afca19 + url: "https://pub.dev" + source: hosted + version: "0.15.3" glob: dependency: transitive description: @@ -720,10 +840,10 @@ packages: dependency: "direct main" description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.4" http: dependency: "direct main" description: @@ -752,10 +872,10 @@ packages: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: transitive description: @@ -868,6 +988,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.2" + just_audio: + dependency: transitive + description: + name: just_audio + sha256: a49e7120b95600bd357f37a2bb04cd1e88252f7cdea8f3368803779b925b1049 + url: "https://pub.dev" + source: hosted + version: "0.9.42" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" + url: "https://pub.dev" + source: hosted + version: "4.3.0" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: "9a98035b8b24b40749507687520ec5ab404e291d2b0937823ff45d92cb18d448" + url: "https://pub.dev" + source: hosted + version: "0.4.13" lazy_memo: dependency: transitive description: @@ -1055,6 +1199,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" numberpicker: dependency: "direct main" description: @@ -1063,6 +1215,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" package_config: dependency: transitive description: @@ -1095,6 +1255,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" path_provider: dependency: "direct main" description: @@ -1247,6 +1415,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.1" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" pseudom: dependency: "direct main" description: @@ -1507,6 +1683,46 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" + url: "https://pub.dev" + source: hosted + version: "2.5.4+6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: @@ -1535,10 +1751,10 @@ packages: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: @@ -1699,6 +1915,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + url: "https://pub.dev" + source: hosted + version: "1.1.15" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" + url: "https://pub.dev" + source: hosted + version: "1.1.12" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: @@ -1707,6 +1947,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + video_player: + dependency: transitive + description: + name: video_player + sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" + url: "https://pub.dev" + source: hosted + version: "2.9.2" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898" + url: "https://pub.dev" + source: hosted + version: "2.7.16" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "33224c19775fd244be2d6e3dbd8e1826ab162877bd61123bf71890772119a2b7" + url: "https://pub.dev" + source: hosted + version: "2.6.5" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" + url: "https://pub.dev" + source: hosted + version: "6.2.3" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" + url: "https://pub.dev" + source: hosted + version: "2.3.3" vm_service: dependency: transitive description: @@ -1743,10 +2023,10 @@ packages: dependency: transitive description: name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web: dependency: transitive description: @@ -1771,6 +2051,38 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + webview_flutter: + dependency: transitive + description: + name: webview_flutter + sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" + url: "https://pub.dev" + source: hosted + version: "4.10.0" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: "3d535126f7244871542b2f0b0fcf94629c9a14883250461f9abe1a6644c1c379" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + url: "https://pub.dev" + source: hosted + version: "2.10.0" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb + url: "https://pub.dev" + source: hosted + version: "3.16.3" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5443217..38150af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,6 +78,7 @@ dependencies: path: packages/desktop_webview_window ref: main screen_brightness: ^2.0.1 + flutter_widget_from_html: ^0.15.3 dependency_overrides: http: ^1.2.2