diff --git a/lib/models/track.dart b/lib/models/track.dart index 49b1dbe..5bf8400 100644 --- a/lib/models/track.dart +++ b/lib/models/track.dart @@ -1,4 +1,5 @@ import 'package:isar/isar.dart'; +import 'package:mangayomi/models/manga.dart'; part 'track.g.dart'; @collection @@ -33,6 +34,9 @@ class Track { bool? isManga; + @enumerated + late ItemType itemType; + Track( {this.id = Isar.autoIncrement, this.libraryId, @@ -47,7 +51,8 @@ class Track { this.startedReadingDate, this.finishedReadingDate, this.trackingUrl, - this.isManga}); + this.isManga, + this.itemType = ItemType.manga}); Track.fromJson(Map json) { finishedReadingDate = json['finishedReadingDate']; id = json['id']; diff --git a/lib/models/track.g.dart b/lib/models/track.g.dart index d3bb21b..2f497e2 100644 --- a/lib/models/track.g.dart +++ b/lib/models/track.g.dart @@ -27,59 +27,65 @@ const TrackSchema = CollectionSchema( name: r'isManga', type: IsarType.bool, ), - r'lastChapterRead': PropertySchema( + r'itemType': PropertySchema( id: 2, + name: r'itemType', + type: IsarType.byte, + enumMap: _TrackitemTypeEnumValueMap, + ), + r'lastChapterRead': PropertySchema( + id: 3, name: r'lastChapterRead', type: IsarType.long, ), r'libraryId': PropertySchema( - id: 3, + id: 4, name: r'libraryId', type: IsarType.long, ), r'mangaId': PropertySchema( - id: 4, + id: 5, name: r'mangaId', type: IsarType.long, ), r'mediaId': PropertySchema( - id: 5, + id: 6, name: r'mediaId', type: IsarType.long, ), r'score': PropertySchema( - id: 6, + id: 7, name: r'score', type: IsarType.long, ), r'startedReadingDate': PropertySchema( - id: 7, + id: 8, name: r'startedReadingDate', type: IsarType.long, ), r'status': PropertySchema( - id: 8, + id: 9, name: r'status', type: IsarType.byte, enumMap: _TrackstatusEnumValueMap, ), r'syncId': PropertySchema( - id: 9, + id: 10, name: r'syncId', type: IsarType.long, ), r'title': PropertySchema( - id: 10, + id: 11, name: r'title', type: IsarType.string, ), r'totalChapter': PropertySchema( - id: 11, + id: 12, name: r'totalChapter', type: IsarType.long, ), r'trackingUrl': PropertySchema( - id: 12, + id: 13, name: r'trackingUrl', type: IsarType.string, ) @@ -127,17 +133,18 @@ void _trackSerialize( ) { writer.writeLong(offsets[0], object.finishedReadingDate); writer.writeBool(offsets[1], object.isManga); - writer.writeLong(offsets[2], object.lastChapterRead); - writer.writeLong(offsets[3], object.libraryId); - writer.writeLong(offsets[4], object.mangaId); - writer.writeLong(offsets[5], object.mediaId); - writer.writeLong(offsets[6], object.score); - writer.writeLong(offsets[7], object.startedReadingDate); - writer.writeByte(offsets[8], object.status.index); - writer.writeLong(offsets[9], object.syncId); - writer.writeString(offsets[10], object.title); - writer.writeLong(offsets[11], object.totalChapter); - writer.writeString(offsets[12], object.trackingUrl); + writer.writeByte(offsets[2], object.itemType.index); + writer.writeLong(offsets[3], object.lastChapterRead); + writer.writeLong(offsets[4], object.libraryId); + writer.writeLong(offsets[5], object.mangaId); + writer.writeLong(offsets[6], object.mediaId); + writer.writeLong(offsets[7], object.score); + writer.writeLong(offsets[8], object.startedReadingDate); + writer.writeByte(offsets[9], object.status.index); + writer.writeLong(offsets[10], object.syncId); + writer.writeString(offsets[11], object.title); + writer.writeLong(offsets[12], object.totalChapter); + writer.writeString(offsets[13], object.trackingUrl); } Track _trackDeserialize( @@ -150,18 +157,20 @@ Track _trackDeserialize( finishedReadingDate: reader.readLongOrNull(offsets[0]), id: id, isManga: reader.readBoolOrNull(offsets[1]), - lastChapterRead: reader.readLongOrNull(offsets[2]), - libraryId: reader.readLongOrNull(offsets[3]), - mangaId: reader.readLongOrNull(offsets[4]), - mediaId: reader.readLongOrNull(offsets[5]), - score: reader.readLongOrNull(offsets[6]), - startedReadingDate: reader.readLongOrNull(offsets[7]), - status: _TrackstatusValueEnumMap[reader.readByteOrNull(offsets[8])] ?? + itemType: _TrackitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? + ItemType.manga, + lastChapterRead: reader.readLongOrNull(offsets[3]), + libraryId: reader.readLongOrNull(offsets[4]), + mangaId: reader.readLongOrNull(offsets[5]), + mediaId: reader.readLongOrNull(offsets[6]), + score: reader.readLongOrNull(offsets[7]), + startedReadingDate: reader.readLongOrNull(offsets[8]), + status: _TrackstatusValueEnumMap[reader.readByteOrNull(offsets[9])] ?? TrackStatus.reading, - syncId: reader.readLongOrNull(offsets[9]), - title: reader.readStringOrNull(offsets[10]), - totalChapter: reader.readLongOrNull(offsets[11]), - trackingUrl: reader.readStringOrNull(offsets[12]), + syncId: reader.readLongOrNull(offsets[10]), + title: reader.readStringOrNull(offsets[11]), + totalChapter: reader.readLongOrNull(offsets[12]), + trackingUrl: reader.readStringOrNull(offsets[13]), ); return object; } @@ -178,7 +187,8 @@ P _trackDeserializeProp

( case 1: return (reader.readBoolOrNull(offset)) as P; case 2: - return (reader.readLongOrNull(offset)) as P; + return (_TrackitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 3: return (reader.readLongOrNull(offset)) as P; case 4: @@ -190,21 +200,33 @@ P _trackDeserializeProp

( case 7: return (reader.readLongOrNull(offset)) as P; case 8: + return (reader.readLongOrNull(offset)) as P; + case 9: return (_TrackstatusValueEnumMap[reader.readByteOrNull(offset)] ?? TrackStatus.reading) as P; - case 9: - return (reader.readLongOrNull(offset)) as P; case 10: - return (reader.readStringOrNull(offset)) as P; - case 11: return (reader.readLongOrNull(offset)) as P; + case 11: + return (reader.readStringOrNull(offset)) as P; case 12: + return (reader.readLongOrNull(offset)) as P; + case 13: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } } +const _TrackitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _TrackitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; const _TrackstatusEnumValueMap = { 'reading': 0, 'completed': 1, @@ -482,6 +504,59 @@ extension TrackQueryFilter 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 lastChapterReadIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -1405,6 +1480,18 @@ extension TrackQuerySortBy 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 sortByLastChapterRead() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastChapterRead', Sort.asc); @@ -1575,6 +1662,18 @@ extension TrackQuerySortThenBy 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 thenByLastChapterRead() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lastChapterRead', Sort.asc); @@ -1721,6 +1820,12 @@ extension TrackQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'itemType'); + }); + } + QueryBuilder distinctByLastChapterRead() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'lastChapterRead'); @@ -1809,6 +1914,12 @@ extension TrackQueryProperty on QueryBuilder { }); } + QueryBuilder itemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'itemType'); + }); + } + QueryBuilder lastChapterReadProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lastChapterRead'); diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index 5ad7d43..8045fc3 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -98,8 +98,8 @@ class _BrowseScreenState extends ConsumerState } else { context.push('/globalSearch', extra: _tabBarController.index == 0 - ? true - : false); + ? ItemType.manga + : ItemType.anime); } }, icon: Icon( @@ -116,24 +116,26 @@ class _BrowseScreenState extends ConsumerState splashRadius: 20, onPressed: () { if (_tabBarController.index == 0) { - context.push('/sourceFilter', extra: true); + context.push('/sourceFilter', extra: ItemType.manga); } else if (_tabBarController.index == 1) { - context.push('/sourceFilter', extra: false); + context.push('/sourceFilter', extra: ItemType.anime); } else if (_tabBarController.index == 2) { - context.push('/sourceFilter', extra: false); + context.push('/sourceFilter', extra: ItemType.anime); } else if (_tabBarController.index == 3) { _textEditingController.clear(); - context.push('/ExtensionLang', extra: false); + context.push('/ExtensionLang', extra: ItemType.anime); } else if (_tabBarController.index == 4) { _textEditingController.clear(); - context.push('/ExtensionLang', extra: false); + context.push('/ExtensionLang', extra: ItemType.anime); } else if (_tabBarController.index == 5) { _textEditingController.clear(); - context.push('/ExtensionLang', extra: false); + context.push('/ExtensionLang', extra: ItemType.anime); } else {} }, icon: Icon( - _tabBarController.index == 0 || _tabBarController.index == 1 || _tabBarController.index == 2 + _tabBarController.index == 0 || + _tabBarController.index == 1 || + _tabBarController.index == 2 ? Icons.filter_list_sharp : _tabBarController.index == 3 || _tabBarController.index == 4 || diff --git a/lib/modules/browse/extension/extension_lang.dart b/lib/modules/browse/extension/extension_lang.dart index 20ef4a1..beded59 100644 --- a/lib/modules/browse/extension/extension_lang.dart +++ b/lib/modules/browse/extension/extension_lang.dart @@ -2,14 +2,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.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/modules/browse/extension/widgets/extension_lang_list_tile_widget.dart'; import 'package:mangayomi/utils/global_style.dart'; class ExtensionsLang extends ConsumerWidget { - final bool isManga; - const ExtensionsLang({required this.isManga, super.key}); + final ItemType itemType; + const ExtensionsLang({required this.itemType, super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -43,7 +44,7 @@ class ExtensionsLang extends ConsumerWidget { .filter() .idIsNotNull() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .findAllSync(); for (var source in sources) { isar.sources.putSync(source..isActive = enable); @@ -57,7 +58,7 @@ class ExtensionsLang extends ConsumerWidget { .filter() .idIsNotNull() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true), builder: (context, snapshot) { List? entries = snapshot.hasData ? snapshot.data : []; diff --git a/lib/modules/browse/extension/extension_screen.dart b/lib/modules/browse/extension/extension_screen.dart index 79a47ad..001d7eb 100644 --- a/lib/modules/browse/extension/extension_screen.dart +++ b/lib/modules/browse/extension/extension_screen.dart @@ -41,11 +41,12 @@ class _ExtensionScreenState extends ConsumerState { onRefresh: () => widget.itemType == ItemType.manga ? ref.refresh( fetchMangaSourcesListProvider(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), + : 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( @@ -99,15 +100,17 @@ class _ExtensionScreenState extends ConsumerState { fetchMangaSourcesListProvider( id: source.id, reFresh: true) .future) - : source.itemType == ItemType.anime ? - await ref.watch( - fetchAnimeSourcesListProvider( - id: source.id, reFresh: true) - .future) : - await ref.watch( - fetchNovelSourcesListProvider( - id: source.id, reFresh: true) - .future); + : source.itemType == ItemType.anime + ? await ref.watch( + fetchAnimeSourcesListProvider( + id: source.id, + reFresh: true) + .future) + : await ref.watch( + fetchNovelSourcesListProvider( + id: source.id, + reFresh: true) + .future); } }, child: Text(l10n.update_all)) diff --git a/lib/modules/browse/extension/widgets/create_extension.dart b/lib/modules/browse/extension/widgets/create_extension.dart index 05079ea..ec203e1 100644 --- a/lib/modules/browse/extension/widgets/create_extension.dart +++ b/lib/modules/browse/extension/widgets/create_extension.dart @@ -184,7 +184,8 @@ class _CreateExtensionState extends State { apiUrl: _apiUrl, iconUrl: _iconUrl, typeSource: _sourceTypes[_sourceTypeIndex], - itemType: ItemType.values.elementAt(_itemTypeIndex), + itemType: + ItemType.values.elementAt(_itemTypeIndex), isAdded: true, isActive: true, version: "0.0.1", diff --git a/lib/modules/browse/global_search/global_search_screen.dart b/lib/modules/browse/global_search/global_search_screen.dart index ee9620d..4f7fa3c 100644 --- a/lib/modules/browse/global_search/global_search_screen.dart +++ b/lib/modules/browse/global_search/global_search_screen.dart @@ -22,9 +22,9 @@ import 'package:mangayomi/modules/widgets/bottom_text_widget.dart'; import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart'; class GlobalSearchScreen extends ConsumerStatefulWidget { - final bool isManga; + final ItemType itemType; const GlobalSearchScreen({ - required this.isManga, + required this.itemType, super.key, }); @@ -42,7 +42,7 @@ class _GlobalSearchScreenState extends ConsumerState { .filter() .isPinnedEqualTo(true) .and() - .isMangaEqualTo(widget.isManga) + .itemTypeEqualTo(widget.itemType) .findAllSync() : isar.sources .filter() @@ -50,7 +50,7 @@ class _GlobalSearchScreenState extends ConsumerState { .and() .isAddedEqualTo(true) .and() - .isMangaEqualTo(widget.isManga) + .itemTypeEqualTo(widget.itemType) .findAllSync(); return Scaffold( diff --git a/lib/modules/browse/sources/sources_filter_screen.dart b/lib/modules/browse/sources/sources_filter_screen.dart index 2be30b7..966dd59 100644 --- a/lib/modules/browse/sources/sources_filter_screen.dart +++ b/lib/modules/browse/sources/sources_filter_screen.dart @@ -3,14 +3,15 @@ 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/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/language.dart'; class SourcesFilterScreen extends ConsumerWidget { - final bool isManga; - const SourcesFilterScreen({required this.isManga, super.key}); + final ItemType itemType; + const SourcesFilterScreen({required this.itemType, super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -28,7 +29,7 @@ class SourcesFilterScreen extends ConsumerWidget { .and() .sourceCodeIsNotEmpty() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data!.isNotEmpty) { @@ -44,7 +45,7 @@ class SourcesFilterScreen extends ConsumerWidget { .where((element) => element.lang!.toLowerCase() == groupByValue && element.isActive! && - element.isManga == isManga) + element.itemType == itemType) .isNotEmpty, onChanged: (val) { isar.writeTxnSync(() { @@ -67,7 +68,7 @@ class SourcesFilterScreen extends ConsumerWidget { .where((s) => s.lang!.toLowerCase() == element.lang && s.isActive! && - s.isManga == isManga) + s.itemType == itemType) .isEmpty) { return Container(); } diff --git a/lib/modules/browse/sources/sources_screen.dart b/lib/modules/browse/sources/sources_screen.dart index 0b278a1..1d98e55 100644 --- a/lib/modules/browse/sources/sources_screen.dart +++ b/lib/modules/browse/sources/sources_screen.dart @@ -53,7 +53,11 @@ class _SourcesScreenState extends ConsumerState { padding: const EdgeInsets.all(8.0), child: ElevatedButton.icon( onPressed: () => - widget.tabIndex(widget.itemType == ItemType.manga ? 3 : widget.itemType == ItemType.anime ? 4 : 5), + 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)), ) diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index 3965762..68ff5fb 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -37,7 +37,7 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { Settings appSettings = Settings(); state = displayType; - + switch (itemType) { case ItemType.manga: appSettings = settings..displayType = displayType; @@ -671,7 +671,8 @@ class LibraryShowContinueReadingButtonState @riverpod class SortLibraryMangaState extends _$SortLibraryMangaState { @override - SortLibraryManga build({required ItemType itemType, required Settings settings}) { + SortLibraryManga build( + {required ItemType itemType, required Settings settings}) { switch (itemType) { case ItemType.manga: return settings.sortLibraryManga ?? SortLibraryManga(); diff --git a/lib/modules/library/providers/local_archive.dart b/lib/modules/library/providers/local_archive.dart index 2125b45..fa6b87f 100644 --- a/lib/modules/library/providers/local_archive.dart +++ b/lib/modules/library/providers/local_archive.dart @@ -39,7 +39,8 @@ Future importArchivesFromFile(Ref ref, Manga? mManga, artist: '', ); for (var file in result.files.reversed.toList()) { - (String, LocalExtensionType, Uint8List, String)? data = itemType == ItemType.manga + (String, LocalExtensionType, Uint8List, String)? data = itemType == + ItemType.manga ? await ref.watch(getArchivesDataFromFileProvider(file.path!).future) : null; String name = _getName(file.path!); diff --git a/lib/modules/main_view/providers/migration.dart b/lib/modules/main_view/providers/migration.dart index e4d2172..8e86cb8 100644 --- a/lib/modules/main_view/providers/migration.dart +++ b/lib/modules/main_view/providers/migration.dart @@ -1,9 +1,8 @@ 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/source.dart'; import 'package:mangayomi/models/track.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -11,45 +10,41 @@ part 'migration.g.dart'; @riverpod Future migration(Ref ref) async { - final chapters = - isar.chapters.filter().idIsNotNull().mangaIdIsNull().findAllSync(); - final downloads = - isar.downloads.filter().idIsNotNull().mangaIdIsNull().findAllSync(); + final mangas = + isar.mangas.filter().idIsNotNull().isMangaIsNotNull().findAllSync(); + final histories = isar.historys .filter() .idIsNotNull() .chapterIdIsNull() + .isMangaIsNotNull() .or() .idIsNotNull() + .isMangaIsNotNull() .findAllSync(); + + final sources = + isar.sources.filter().idIsNotNull().isMangaIsNotNull().findAllSync(); final tracks = isar.tracks.filter().idIsNotNull().findAllSync(); isar.writeTxnSync(() { - //mangaId in chapter - for (var chapter in chapters) { - final mangaId = chapter.manga.value?.id; - isar.chapters.putSync(chapter..mangaId = mangaId); - } - //mangaId in Download - for (var download in downloads) { - final mangaId = download.chapter.value?.manga.value?.id; - isar.downloads.putSync(download..mangaId = mangaId); - } - //chapterId and isManga in History for (var history in histories) { - final chapterId = history.chapter.value?.id; - final itemType = - history.chapter.value?.manga.value?.itemType ?? ItemType.manga; - isar.historys.putSync(history - ..chapterId = chapterId - ..itemType = itemType); + isar.historys + .putSync(history..itemType = _convertToItemType(history.isManga!)); + } + for (var source in sources) { + isar.sources + .putSync(source..itemType = _convertToItemType(source.isManga!)); } - // isManga in Track for (var track in tracks) { - final isManga = - (isar.mangas.getSync(track.mangaId!)?.itemType ?? ItemType.manga) == - ItemType.manga; - isar.tracks.putSync(track..isManga = isManga); + isar.tracks.putSync(track..itemType = _convertToItemType(track.isManga!)); + } + for (var manga in mangas) { + isar.mangas.putSync(manga..itemType = _convertToItemType(manga.isManga!)); } }); } + +ItemType _convertToItemType(bool isManga) { + return isManga ? ItemType.manga : ItemType.anime; +} diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index 5b40519..ff52bed 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'403da626b6a797854dde7ae77b4ea452300c40e6'; +String _$migrationHash() => r'748a99069dd212f5eacce8185e414d80fefeaae9'; /// 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 11652e9..97ee89d 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -1656,8 +1656,7 @@ class _MangaDetailViewState extends ConsumerState final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.itemType != - ItemType.anime, + itemType: widget.manga!.itemType, track: Track( status: TrackStatus.planToRead, @@ -1980,16 +1979,14 @@ class _MangaDetailViewState extends ConsumerState mangaId: widget.manga!.id!, syncId: entries[index].syncId!, trackRes: trackRes.first, - isManga: - widget.manga!.itemType == ItemType.manga) + itemType: widget.manga!.itemType) : TrackListile( text: l10nLocalizations(context)!.add_tracker, onTap: () async { final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.itemType != - ItemType.anime, + itemType: widget.manga!.itemType, track: Track( status: TrackStatus.planToRead, syncId: entries[index].syncId!, @@ -1999,9 +1996,8 @@ class _MangaDetailViewState extends ConsumerState await ref .read(trackStateProvider( track: null, - isManga: - widget.manga!.itemType != - ItemType.anime) + itemType: + widget.manga!.itemType) .notifier) .setTrackSearch( trackSearch, diff --git a/lib/modules/manga/detail/providers/track_state_providers.dart b/lib/modules/manga/detail/providers/track_state_providers.dart index c0b89ae..f9cc7b4 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.dart @@ -1,3 +1,4 @@ +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; @@ -10,49 +11,50 @@ part 'track_state_providers.g.dart'; @riverpod class TrackState extends _$TrackState { @override - Track build({Track? track, required bool? isManga}) { + Track build({Track? track, required ItemType? itemType}) { return track!; } Future updateManga() async { Track? updateTrack; - if (track!.syncId == 1) { - updateTrack = isManga! - ? await ref - .read( - myAnimeListProvider(syncId: track!.syncId!, isManga: isManga) - .notifier) - .updateManga(track!) - : await ref - .read( - myAnimeListProvider(syncId: track!.syncId!, isManga: isManga) - .notifier) - .updateAnime(track!); - } else if (track!.syncId == 2) { - updateTrack = isManga! - ? await ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + updateTrack = await switch (track!.syncId) { + 1 => switch (itemType) { + ItemType.manga => ref + .read(myAnimeListProvider( + syncId: track!.syncId!, itemType: itemType) .notifier) - .updateLibManga(track!) - : await ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .updateManga(track!), + _ => ref + .read(myAnimeListProvider( + syncId: track!.syncId!, itemType: itemType) .notifier) - .updateLibAnime(track!); - } else if (track!.syncId == 3) { - updateTrack = isManga! - ? await ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .updateAnime(track!), + }, + 2 => switch (itemType) { + ItemType.manga => ref + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) - .updateLibManga(track!) - : await ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .updateLibManga(track!), + _ => ref + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) - .updateLibAnime(track!); - } + .updateLibAnime(track!), + }, + _ => switch (itemType) { + ItemType.manga => ref + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) + .notifier) + .updateLibManga(track!), + _ => ref + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) + .notifier) + .updateLibAnime(track!), + }, + }; ref .read(tracksProvider(syncId: track!.syncId!).notifier) - .updateTrackManga(updateTrack!, isManga); + .updateTrackManga(updateTrack, itemType!); } int getScoreMaxValue() { @@ -61,7 +63,7 @@ class TrackState extends _$TrackState { maxValue = 10; } else if (track!.syncId == 2) { maxValue = ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .getScoreValue() .$1; @@ -73,7 +75,7 @@ class TrackState extends _$TrackState { if (track!.syncId == 1 || track!.syncId == 3) { } else if (track!.syncId == 2) { numberText = ref - .read(anilistProvider(syncId: 2, isManga: isManga).notifier) + .read(anilistProvider(syncId: 2, itemType: itemType).notifier) .displayScore(int.parse(numberText)); } return numberText; @@ -85,7 +87,7 @@ class TrackState extends _$TrackState { step = 1; } else if (track!.syncId == 2) { step = ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .getScoreValue() .$2; @@ -99,12 +101,14 @@ class TrackState extends _$TrackState { result = score.toString(); } else if (track!.syncId == 2) { result = ref - .read(anilistProvider(syncId: 2, isManga: isManga).notifier) + .read(anilistProvider(syncId: 2, itemType: itemType).notifier) .displayScore(score); } return result!; } + bool get _isManga => itemType == ItemType.manga; + Future setTrackSearch( TrackSearch trackSearch, int mangaId, int syncId) async { Track? findManga; @@ -120,72 +124,79 @@ class TrackState extends _$TrackState { status: TrackStatus.planToRead, startedReadingDate: 0, finishedReadingDate: 0); + if (syncId == 1) { findManga = await ref - .read(myAnimeListProvider(syncId: syncId, isManga: isManga).notifier) + .read( + myAnimeListProvider(syncId: syncId, itemType: itemType).notifier) .findManga(track); } else if (syncId == 2) { - findManga = isManga! + findManga = _isManga ? await ref - .read(anilistProvider(syncId: syncId, isManga: isManga).notifier) + .read( + anilistProvider(syncId: syncId, itemType: itemType).notifier) .findLibManga(track) : await ref - .read(anilistProvider(syncId: syncId, isManga: isManga).notifier) + .read( + anilistProvider(syncId: syncId, itemType: itemType).notifier) .findLibAnime(track); - findManga ??= isManga! + findManga ??= _isManga ? await ref - .read(anilistProvider(syncId: syncId, isManga: isManga).notifier) + .read( + anilistProvider(syncId: syncId, itemType: itemType).notifier) .addLibManga(track) : await ref - .read(anilistProvider(syncId: syncId, isManga: isManga).notifier) + .read( + anilistProvider(syncId: syncId, itemType: itemType).notifier) .addLibAnime(track); } else if (syncId == 3) { - findManga = isManga! + findManga = _isManga ? await ref - .read(kitsuProvider(syncId: syncId, isManga: isManga).notifier) + .read(kitsuProvider(syncId: syncId, itemType: itemType).notifier) .addLibManga(track) : await ref - .read(kitsuProvider(syncId: syncId, isManga: isManga).notifier) + .read(kitsuProvider(syncId: syncId, itemType: itemType).notifier) .addLibAnime(track); } + ref .read(tracksProvider(syncId: syncId).notifier) - .updateTrackManga(findManga!, isManga); + .updateTrackManga(findManga!, itemType!); } List getStatusList() { List statusList = []; List list = []; if (track!.syncId == 1) { - statusList = isManga! + statusList = _isManga ? ref - .read( - myAnimeListProvider(syncId: track!.syncId!, isManga: isManga) - .notifier) + .read(myAnimeListProvider( + syncId: track!.syncId!, itemType: itemType) + .notifier) .myAnimeListStatusListManga : ref - .read( - myAnimeListProvider(syncId: track!.syncId!, isManga: isManga) - .notifier) + .read(myAnimeListProvider( + syncId: track!.syncId!, itemType: itemType) + .notifier) .myAnimeListStatusListAnime; } else if (track!.syncId == 2) { - statusList = isManga! + statusList = _isManga ? ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .aniListStatusListManga : ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .aniListStatusListAnime; } else if (track!.syncId == 3) { - statusList = isManga! + statusList = _isManga ? ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .kitsuStatusListManga : ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .kitsuStatusListAnime; } @@ -201,27 +212,27 @@ class TrackState extends _$TrackState { Track? findManga; if (track!.syncId == 1) { findManga = await ref - .read(myAnimeListProvider(syncId: track!.syncId!, isManga: isManga) + .read(myAnimeListProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .findManga(track!); } else if (track!.syncId == 2) { - findManga = isManga! + findManga = _isManga ? await ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .findLibManga(track!) : await ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .findLibAnime(track!); } else if (track!.syncId == 3) { - findManga = isManga! + findManga = _isManga ? await ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .findLibManga(track!) : await ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .findLibAnime(track!); } @@ -232,27 +243,27 @@ class TrackState extends _$TrackState { List? tracks; if (track!.syncId == 1) { tracks = await ref - .read(myAnimeListProvider(syncId: track!.syncId!, isManga: isManga) + .read(myAnimeListProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .search(query); } else if (track!.syncId == 2) { - tracks = isManga! + tracks = _isManga ? await ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .search(query) : await ref - .read(anilistProvider(syncId: track!.syncId!, isManga: isManga) + .read(anilistProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .searchAnime(query); } else if (track!.syncId == 3) { - tracks = isManga! + tracks = _isManga ? await ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .search(query) : await ref - .read(kitsuProvider(syncId: track!.syncId!, isManga: isManga) + .read(kitsuProvider(syncId: track!.syncId!, itemType: itemType) .notifier) .searchAnime(query); } diff --git a/lib/modules/manga/detail/providers/track_state_providers.g.dart b/lib/modules/manga/detail/providers/track_state_providers.g.dart index 5cb6268..ad04e13 100644 --- a/lib/modules/manga/detail/providers/track_state_providers.g.dart +++ b/lib/modules/manga/detail/providers/track_state_providers.g.dart @@ -6,7 +6,7 @@ part of 'track_state_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$trackStateHash() => r'8b3b72900d3f0c39834cabd942200814099b4106'; +String _$trackStateHash() => r'996bec4204e84eb74a2b818410788e5fbf81fec2'; /// Copied from Dart SDK class _SystemHash { @@ -31,11 +31,11 @@ class _SystemHash { abstract class _$TrackState extends BuildlessAutoDisposeNotifier { late final Track? track; - late final bool? isManga; + late final ItemType? itemType; Track build({ Track? track, - required bool? isManga, + required ItemType? itemType, }); } @@ -51,11 +51,11 @@ class TrackStateFamily extends Family { /// See also [TrackState]. TrackStateProvider call({ Track? track, - required bool? isManga, + required ItemType? itemType, }) { return TrackStateProvider( track: track, - isManga: isManga, + itemType: itemType, ); } @@ -65,7 +65,7 @@ class TrackStateFamily extends Family { ) { return call( track: provider.track, - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -90,11 +90,11 @@ class TrackStateProvider /// See also [TrackState]. TrackStateProvider({ Track? track, - required bool? isManga, + required ItemType? itemType, }) : this._internal( () => TrackState() ..track = track - ..isManga = isManga, + ..itemType = itemType, from: trackStateProvider, name: r'trackStateProvider', debugGetCreateSourceHash: @@ -105,7 +105,7 @@ class TrackStateProvider allTransitiveDependencies: TrackStateFamily._allTransitiveDependencies, track: track, - isManga: isManga, + itemType: itemType, ); TrackStateProvider._internal( @@ -116,11 +116,11 @@ class TrackStateProvider required super.debugGetCreateSourceHash, required super.from, required this.track, - required this.isManga, + required this.itemType, }) : super.internal(); final Track? track; - final bool? isManga; + final ItemType? itemType; @override Track runNotifierBuild( @@ -128,7 +128,7 @@ class TrackStateProvider ) { return notifier.build( track: track, - isManga: isManga, + itemType: itemType, ); } @@ -139,14 +139,14 @@ class TrackStateProvider override: TrackStateProvider._internal( () => create() ..track = track - ..isManga = isManga, + ..itemType = itemType, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, track: track, - isManga: isManga, + itemType: itemType, ), ); } @@ -160,14 +160,14 @@ class TrackStateProvider bool operator ==(Object other) { return other is TrackStateProvider && other.track == track && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, track.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -179,8 +179,8 @@ mixin TrackStateRef on AutoDisposeNotifierProviderRef { /// The parameter `track` of this provider. Track? get track; - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType? get itemType; } class _TrackStateProviderElement @@ -191,7 +191,7 @@ class _TrackStateProviderElement @override Track? get track => (origin as TrackStateProvider).track; @override - bool? get isManga => (origin as TrackStateProvider).isManga; + ItemType? get itemType => (origin as TrackStateProvider).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/manga/detail/widgets/tracker_search_widget.dart b/lib/modules/manga/detail/widgets/tracker_search_widget.dart index e885b76..5572765 100644 --- a/lib/modules/manga/detail/widgets/tracker_search_widget.dart +++ b/lib/modules/manga/detail/widgets/tracker_search_widget.dart @@ -1,6 +1,7 @@ import 'package:draggable_menu/draggable_menu.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; @@ -9,10 +10,10 @@ import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class TrackerWidgetSearch extends ConsumerStatefulWidget { - final bool isManga; + final ItemType itemType; final Track track; const TrackerWidgetSearch( - {required this.isManga, required this.track, super.key}); + {required this.itemType, required this.track, super.key}); @override ConsumerState createState() => @@ -31,7 +32,7 @@ class _TrackerWidgetSearchState extends ConsumerState { _init() async { await Future.delayed(const Duration(microseconds: 100)); tracks = await ref - .read(trackStateProvider(track: widget.track, isManga: widget.isManga) + .read(trackStateProvider(track: widget.track, itemType: widget.itemType) .notifier) .search(query); if (mounted) { @@ -174,7 +175,7 @@ class _TrackerWidgetSearchState extends ConsumerState { tracks = await ref .read(trackStateProvider( track: widget.track, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .search(d.trim()); if (mounted) { @@ -216,7 +217,7 @@ class _TrackerWidgetSearchState extends ConsumerState { } trackersSearchraggableMenu(BuildContext context, - {required Track track, required bool isManga}) async { + {required Track track, required ItemType itemType}) async { return await DraggableMenu.open( context, DraggableMenu( @@ -254,6 +255,6 @@ trackersSearchraggableMenu(BuildContext context, minimizeBeforeFastDrag: true, child: TrackerWidgetSearch( track: track, - isManga: isManga, + itemType: itemType, ))); } diff --git a/lib/modules/manga/detail/widgets/tracker_widget.dart b/lib/modules/manga/detail/widgets/tracker_widget.dart index be286a3..397ea86 100644 --- a/lib/modules/manga/detail/widgets/tracker_widget.dart +++ b/lib/modules/manga/detail/widgets/tracker_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_search.dart'; import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; @@ -12,14 +13,14 @@ import 'package:mangayomi/utils/date.dart'; import 'package:numberpicker/numberpicker.dart'; class TrackerWidget extends ConsumerStatefulWidget { - final bool isManga; + final ItemType itemType; final Track trackRes; final int mangaId; final int syncId; final bool hide; const TrackerWidget( {super.key, - required this.isManga, + required this.itemType, required this.syncId, required this.trackRes, required this.mangaId, @@ -39,14 +40,14 @@ class _TrackerWidgetState extends ConsumerState { _init() async { await Future.delayed(const Duration(microseconds: 100)); final findManga = await ref - .read( - trackStateProvider(track: widget.trackRes, isManga: widget.isManga) - .notifier) + .read(trackStateProvider( + track: widget.trackRes, itemType: widget.itemType) + .notifier) .findManga(); if (mounted) { ref .read(tracksProvider(syncId: widget.syncId).notifier) - .updateTrackManga(findManga!, widget.isManga); + .updateTrackManga(findManga!, widget.itemType); } } @@ -90,12 +91,12 @@ class _TrackerWidgetState extends ConsumerState { ? () async { final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.isManga, + itemType: widget.itemType, track: widget.trackRes) as TrackSearch?; if (trackSearch != null) { await ref .read(trackStateProvider( - track: null, isManga: widget.isManga) + track: null, itemType: widget.itemType) .notifier) .setTrackSearch( trackSearch, widget.mangaId, widget.syncId); @@ -153,7 +154,7 @@ class _TrackerWidgetState extends ConsumerState { itemCount: ref .read(trackStateProvider( track: widget.trackRes, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .getStatusList() .length, @@ -161,7 +162,7 @@ class _TrackerWidgetState extends ConsumerState { final status = ref .read(trackStateProvider( track: widget.trackRes, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .getStatusList()[index]; return RadioListTile( @@ -170,14 +171,14 @@ class _TrackerWidgetState extends ConsumerState { value: status, groupValue: toTrackStatus( widget.trackRes.status, - widget.isManga, + widget.itemType, widget.trackRes.syncId!), onChanged: (value) { ref .read(trackStateProvider( track: widget.trackRes ..status = status, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .updateManga(); Navigator.pop(context); @@ -207,7 +208,7 @@ class _TrackerWidgetState extends ConsumerState { }); }, text: getTrackStatus( - toTrackStatus(widget.trackRes.status, widget.isManga, + toTrackStatus(widget.trackRes.status, widget.itemType, widget.trackRes.syncId!), context)), ), @@ -219,7 +220,9 @@ class _TrackerWidgetState extends ConsumerState { builder: (context) { return AlertDialog( title: Text( - widget.isManga ? l10n!.chapters : l10n!.episodes, + widget.itemType == ItemType.manga + ? l10n!.chapters + : l10n!.episodes, ), content: StatefulBuilder( builder: (context, setState) => SizedBox( @@ -262,7 +265,7 @@ class _TrackerWidgetState extends ConsumerState { track: widget.trackRes ..lastChapterRead = currentIntValue, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .updateManga(); Navigator.pop(context); @@ -304,21 +307,21 @@ class _TrackerWidgetState extends ConsumerState { maxValue: ref .read(trackStateProvider( track: widget.trackRes, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .getScoreMaxValue(), textMapper: (numberText) { return ref .read(trackStateProvider( track: widget.trackRes, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .getTextMapper(numberText); }, step: ref .read(trackStateProvider( track: widget.trackRes, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .getScoreStep(), haptics: true, @@ -348,7 +351,7 @@ class _TrackerWidgetState extends ConsumerState { .read(trackStateProvider( track: widget.trackRes ..score = currentIntValue, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .updateManga(); Navigator.pop(context); @@ -368,7 +371,7 @@ class _TrackerWidgetState extends ConsumerState { ? ref .read(trackStateProvider( track: widget.trackRes, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .displayScore(widget.trackRes.score!) : l10n!.score), @@ -394,7 +397,7 @@ class _TrackerWidgetState extends ConsumerState { track: widget.trackRes ..startedReadingDate = newDate.millisecondsSinceEpoch, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .updateManga(); }, @@ -425,7 +428,7 @@ class _TrackerWidgetState extends ConsumerState { track: widget.trackRes ..finishedReadingDate = newDate.millisecondsSinceEpoch, - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .updateManga(); }, diff --git a/lib/modules/manga/reader/providers/push_router.dart b/lib/modules/manga/reader/providers/push_router.dart index c55f54d..cd7a9c2 100644 --- a/lib/modules/manga/reader/providers/push_router.dart +++ b/lib/modules/manga/reader/providers/push_router.dart @@ -41,14 +41,14 @@ Future pushMangaReaderView({ void pushReplacementMangaReaderView( {required BuildContext context, required Chapter 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; - } + 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 b1b4fdc..1350c82 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.dart @@ -364,7 +364,7 @@ extension ChapterExtensions on Chapter { final tracks = isar.tracks .filter() .idIsNotNull() - .isMangaEqualTo(manga.itemType == ItemType.manga) + .itemTypeEqualTo(manga.itemType) .mangaIdEqualTo(manga.id!) .findAllSync(); @@ -392,8 +392,7 @@ extension ChapterExtensions on Chapter { } } ref - .read(trackStateProvider( - track: track, isManga: manga.itemType == ItemType.manga) + .read(trackStateProvider(track: track, itemType: manga.itemType) .notifier) .updateManga(); } diff --git a/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart b/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart index 387a5be..e62dc0f 100644 --- a/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart +++ b/lib/modules/more/settings/track/manage_trackers/tracking_detail.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/manga/detail/widgets/tracker_widget.dart'; @@ -49,8 +50,10 @@ class _TrackingDetailState extends State ), ), body: TabBarView(controller: _tabBarController, children: [ - TrackingTab(isManga: true, syncId: widget.trackerPref.syncId!), - TrackingTab(isManga: false, syncId: widget.trackerPref.syncId!) + TrackingTab( + itemType: ItemType.manga, syncId: widget.trackerPref.syncId!), + TrackingTab( + itemType: ItemType.anime, syncId: widget.trackerPref.syncId!) ]), ), ); @@ -58,9 +61,9 @@ class _TrackingDetailState extends State } class TrackingTab extends StatelessWidget { - final bool isManga; + final ItemType itemType; final int syncId; - const TrackingTab({super.key, required this.isManga, required this.syncId}); + const TrackingTab({super.key, required this.itemType, required this.syncId}); @override Widget build(BuildContext context) { @@ -68,7 +71,7 @@ class TrackingTab extends StatelessWidget { stream: isar.tracks .filter() .idIsNotNull() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .syncIdEqualTo(syncId) .watch(fireImmediately: true), builder: (context, snapshot) { @@ -89,7 +92,7 @@ class TrackingTab extends StatelessWidget { title: Text(track.title!), children: [ TrackingWidget( - isManga: isManga, syncId: syncId, mediaId: mediaId!) + itemType: itemType, syncId: syncId, mediaId: mediaId!) ], ); }, @@ -104,12 +107,12 @@ class TrackingTab extends StatelessWidget { class TrackingWidget extends StatelessWidget { final int syncId; - final bool isManga; + final ItemType itemType; final int mediaId; const TrackingWidget( {super.key, required this.mediaId, - required this.isManga, + required this.itemType, required this.syncId}); @override @@ -119,7 +122,7 @@ class TrackingWidget extends StatelessWidget { .filter() .idIsNotNull() .mediaIdEqualTo(mediaId) - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true), builder: (context, snapshot) { List? trackRes = []; @@ -145,7 +148,7 @@ class TrackingWidget extends StatelessWidget { mangaId: track.mangaId!, syncId: track.syncId!, trackRes: track, - isManga: isManga, + itemType: itemType, hide: true, ); }, diff --git a/lib/modules/more/settings/track/providers/track_providers.dart b/lib/modules/more/settings/track/providers/track_providers.dart index fb1df51..f3f60e5 100644 --- a/lib/modules/more/settings/track/providers/track_providers.dart +++ b/lib/modules/more/settings/track/providers/track_providers.dart @@ -1,5 +1,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; @@ -25,7 +26,7 @@ class Tracks extends _$Tracks { }); } - void updateTrackManga(Track track, bool? isManga) { + void updateTrackManga(Track track, ItemType itemType) { final tra = isar.tracks .filter() .syncIdEqualTo(syncId) @@ -39,7 +40,7 @@ class Tracks extends _$Tracks { isar.writeTxnSync(() => isar.tracks.putSync(track ..syncId = syncId - ..isManga = isManga)); + ..itemType = itemType)); } void deleteTrackManga(Track track) { diff --git a/lib/modules/more/settings/track/providers/track_providers.g.dart b/lib/modules/more/settings/track/providers/track_providers.g.dart index 920a38c..7dd1a10 100644 --- a/lib/modules/more/settings/track/providers/track_providers.g.dart +++ b/lib/modules/more/settings/track/providers/track_providers.g.dart @@ -6,7 +6,7 @@ part of 'track_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$tracksHash() => r'8fbe5a46115adda0135e97386f4de57f22dc4149'; +String _$tracksHash() => r'a6e052c4102bbe640a397c37887dd618a4512c49'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/track/track.dart b/lib/modules/more/settings/track/track.dart index 9c73a07..782c593 100644 --- a/lib/modules/more/settings/track/track.dart +++ b/lib/modules/more/settings/track/track.dart @@ -73,7 +73,7 @@ class TrackScreen extends ConsumerWidget { TrackListile( onTap: () async { await ref - .read(myAnimeListProvider(syncId: 1, isManga: null) + .read(myAnimeListProvider(syncId: 1, itemType: null) .notifier) .login(); }, diff --git a/lib/modules/novel/novel_reader_controller_provider.dart b/lib/modules/novel/novel_reader_controller_provider.dart index 621106e..9317d6a 100644 --- a/lib/modules/novel/novel_reader_controller_provider.dart +++ b/lib/modules/novel/novel_reader_controller_provider.dart @@ -68,7 +68,8 @@ class NovelReaderController extends _$NovelReaderController { final ch = chapter; isar.writeTxnSync(() { ch.isRead = isRead; - ch.lastPageRead = (maxOffset != 0 ? newOffset / maxOffset : 0).toString(); + ch.lastPageRead = + (maxOffset != 0 ? newOffset / maxOffset : 0).toString(); isar.chapters.putSync(ch); }); } diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index 79ff04b..c3a9ca7 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -118,7 +118,7 @@ class _NovelWebViewState extends ConsumerState Size get size => View.of(context).physicalSize / pixelRatio; Color _backgroundColor(BuildContext context) => - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.9); + Theme.of(context).scaffoldBackgroundColor.withValues(alpha: 0.9); void _setFullScreen({bool? value}) async { if (isDesktop) { @@ -599,7 +599,7 @@ class CustomPopupMenuButton extends StatelessWidget { .textTheme .bodyLarge! .color! - .withOpacity(0.9)), + .withValues(alpha: 0.9)), overflow: TextOverflow.ellipsis, maxLines: 1, ), diff --git a/lib/router/router.dart b/lib/router/router.dart index f5199a7..94c7c76 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -259,17 +259,17 @@ class RouterNotifier extends ChangeNotifier { path: "/ExtensionLang", name: "ExtensionLang", builder: (context, state) { - final isManga = state.extra as bool; + final itemType = state.extra as ItemType; return ExtensionsLang( - isManga: isManga, + itemType: itemType, ); }, pageBuilder: (context, state) { - final isManga = state.extra as bool; + final itemType = state.extra as ItemType; return transitionPage( key: state.pageKey, child: ExtensionsLang( - isManga: isManga, + itemType: itemType, ), ); }, @@ -323,17 +323,17 @@ class RouterNotifier extends ChangeNotifier { path: "/globalSearch", name: "globalSearch", builder: (context, state) { - final isManga = state.extra as bool; + final itemType = state.extra as ItemType; return GlobalSearchScreen( - isManga: isManga, + itemType: itemType, ); }, pageBuilder: (context, state) { - final isManga = state.extra as bool; + final itemType = state.extra as ItemType; return transitionPage( key: state.pageKey, child: GlobalSearchScreen( - isManga: isManga, + itemType: itemType, ), ); }, @@ -381,17 +381,17 @@ class RouterNotifier extends ChangeNotifier { path: "/sourceFilter", name: "sourceFilter", builder: (context, state) { - final isManga = state.extra as bool; + final itemType = state.extra as ItemType; return SourcesFilterScreen( - isManga: isManga, + itemType: itemType, ); }, pageBuilder: (context, state) { - final isManga = state.extra as bool; + final itemType = state.extra as ItemType; return transitionPage( key: state.pageKey, child: SourcesFilterScreen( - isManga: isManga, + itemType: itemType, ), ); }, diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart index ae9b6c9..b6079f7 100644 --- a/lib/services/fetch_novel_sources.dart +++ b/lib/services/fetch_novel_sources.dart @@ -6,8 +6,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'fetch_novel_sources.g.dart'; @riverpod -Future fetchNovelSourcesList(Ref ref, - {int? id, required reFresh}) async { +Future fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { await fetchSourcesList( sourcesIndexUrl: diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index 7169c23..50922c7 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -26,7 +26,12 @@ Future fetchSourcesList( for (var source in sourceList) { if (source.appMinVerReq != null) { if (compareVersions(info.version, source.appMinVerReq!) > -1) { - if (source.itemType == itemType || (!source.isManga! && itemType == ItemType.anime)) { + final itm = source.isManga == null + ? source.itemType + : source.isManga! + ? ItemType.manga + : ItemType.anime; + if (itm == itemType) { if (id != null) { if (id == source.id) { final sourc = isar.sources.getSync(id)!; diff --git a/lib/services/sync_server.dart b/lib/services/sync_server.dart index 7be9826..8b48cb7 100644 --- a/lib/services/sync_server.dart +++ b/lib/services/sync_server.dart @@ -14,11 +14,6 @@ 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'; -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/providers/l10n_providers.dart'; import 'dart:convert'; import 'package:mangayomi/services/http/m_client.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index daf4b7a..71a6c87 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'4ef01cd50d1ec4eaecd971fe2f176d2650147df8'; +String _$syncServerHash() => r'2349594104343ae1bcd658598cd2ac2959b35119'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/anilist.dart b/lib/services/trackers/anilist.dart index db872c0..3d2e569 100644 --- a/lib/services/trackers/anilist.dart +++ b/lib/services/trackers/anilist.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'dart:convert'; @@ -26,7 +27,7 @@ class Anilist extends _$Anilist { : 'G2fFUiGtgFd60D0lCkhgGKvMmrCfDmZXADQIzWXr'; @override - void build({required int syncId, bool? isManga}) {} + void build({required int syncId, ItemType? itemType}) {} Future login() async { final callbackUrlScheme = (Platform.isWindows || Platform.isLinux) diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index dd740dc..834afd6 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58'; +String _$anilistHash() => r'ddd07acc8d28d2aa95c942566109e9393ca9e5ed'; /// Copied from Dart SDK class _SystemHash { @@ -31,11 +31,11 @@ class _SystemHash { abstract class _$Anilist extends BuildlessAutoDisposeNotifier { late final int syncId; - late final bool? isManga; + late final ItemType? itemType; void build({ required int syncId, - bool? isManga, + ItemType? itemType, }); } @@ -51,11 +51,11 @@ class AnilistFamily extends Family { /// See also [Anilist]. AnilistProvider call({ required int syncId, - bool? isManga, + ItemType? itemType, }) { return AnilistProvider( syncId: syncId, - isManga: isManga, + itemType: itemType, ); } @@ -65,7 +65,7 @@ class AnilistFamily extends Family { ) { return call( syncId: provider.syncId, - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -89,11 +89,11 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl { /// See also [Anilist]. AnilistProvider({ required int syncId, - bool? isManga, + ItemType? itemType, }) : this._internal( () => Anilist() ..syncId = syncId - ..isManga = isManga, + ..itemType = itemType, from: anilistProvider, name: r'anilistProvider', debugGetCreateSourceHash: @@ -103,7 +103,7 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl { dependencies: AnilistFamily._dependencies, allTransitiveDependencies: AnilistFamily._allTransitiveDependencies, syncId: syncId, - isManga: isManga, + itemType: itemType, ); AnilistProvider._internal( @@ -114,11 +114,11 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl { required super.debugGetCreateSourceHash, required super.from, required this.syncId, - required this.isManga, + required this.itemType, }) : super.internal(); final int syncId; - final bool? isManga; + final ItemType? itemType; @override void runNotifierBuild( @@ -126,7 +126,7 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl { ) { return notifier.build( syncId: syncId, - isManga: isManga, + itemType: itemType, ); } @@ -137,14 +137,14 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl { override: AnilistProvider._internal( () => create() ..syncId = syncId - ..isManga = isManga, + ..itemType = itemType, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, syncId: syncId, - isManga: isManga, + itemType: itemType, ), ); } @@ -158,14 +158,14 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl { bool operator ==(Object other) { return other is AnilistProvider && other.syncId == syncId && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, syncId.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -177,8 +177,8 @@ mixin AnilistRef on AutoDisposeNotifierProviderRef { /// The parameter `syncId` of this provider. int get syncId; - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType? get itemType; } class _AnilistProviderElement @@ -188,7 +188,7 @@ class _AnilistProviderElement @override int get syncId => (origin as AnilistProvider).syncId; @override - bool? get isManga => (origin as AnilistProvider).isManga; + ItemType? get itemType => (origin as AnilistProvider).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/services/trackers/kitsu.dart b/lib/services/trackers/kitsu.dart index 1f226d4..0fc9ed0 100644 --- a/lib/services/trackers/kitsu.dart +++ b/lib/services/trackers/kitsu.dart @@ -2,6 +2,7 @@ import 'dart:developer'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:intl/intl.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'dart:convert'; @@ -39,7 +40,7 @@ class Kitsu extends _$Kitsu { } @override - void build({required int syncId, bool? isManga}) {} + void build({required int syncId, ItemType? itemType}) {} Future<(bool, String)> login(String username, String password) async { try { diff --git a/lib/services/trackers/kitsu.g.dart b/lib/services/trackers/kitsu.g.dart index 3f677ba..98dec28 100644 --- a/lib/services/trackers/kitsu.g.dart +++ b/lib/services/trackers/kitsu.g.dart @@ -6,7 +6,7 @@ part of 'kitsu.dart'; // RiverpodGenerator // ************************************************************************** -String _$kitsuHash() => r'6953b7520cc144f42992bbecc0d5306841c2382f'; +String _$kitsuHash() => r'9a123ca11d2b9e01d7d78b75d408a9f7a7b9b4e6'; /// Copied from Dart SDK class _SystemHash { @@ -31,11 +31,11 @@ class _SystemHash { abstract class _$Kitsu extends BuildlessAutoDisposeNotifier { late final int syncId; - late final bool? isManga; + late final ItemType? itemType; void build({ required int syncId, - bool? isManga, + ItemType? itemType, }); } @@ -51,11 +51,11 @@ class KitsuFamily extends Family { /// See also [Kitsu]. KitsuProvider call({ required int syncId, - bool? isManga, + ItemType? itemType, }) { return KitsuProvider( syncId: syncId, - isManga: isManga, + itemType: itemType, ); } @@ -65,7 +65,7 @@ class KitsuFamily extends Family { ) { return call( syncId: provider.syncId, - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -89,11 +89,11 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl { /// See also [Kitsu]. KitsuProvider({ required int syncId, - bool? isManga, + ItemType? itemType, }) : this._internal( () => Kitsu() ..syncId = syncId - ..isManga = isManga, + ..itemType = itemType, from: kitsuProvider, name: r'kitsuProvider', debugGetCreateSourceHash: @@ -103,7 +103,7 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl { dependencies: KitsuFamily._dependencies, allTransitiveDependencies: KitsuFamily._allTransitiveDependencies, syncId: syncId, - isManga: isManga, + itemType: itemType, ); KitsuProvider._internal( @@ -114,11 +114,11 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl { required super.debugGetCreateSourceHash, required super.from, required this.syncId, - required this.isManga, + required this.itemType, }) : super.internal(); final int syncId; - final bool? isManga; + final ItemType? itemType; @override void runNotifierBuild( @@ -126,7 +126,7 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl { ) { return notifier.build( syncId: syncId, - isManga: isManga, + itemType: itemType, ); } @@ -137,14 +137,14 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl { override: KitsuProvider._internal( () => create() ..syncId = syncId - ..isManga = isManga, + ..itemType = itemType, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, syncId: syncId, - isManga: isManga, + itemType: itemType, ), ); } @@ -158,14 +158,14 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl { bool operator ==(Object other) { return other is KitsuProvider && other.syncId == syncId && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, syncId.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -177,8 +177,8 @@ mixin KitsuRef on AutoDisposeNotifierProviderRef { /// The parameter `syncId` of this provider. int get syncId; - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType? get itemType; } class _KitsuProviderElement @@ -188,7 +188,7 @@ class _KitsuProviderElement @override int get syncId => (origin as KitsuProvider).syncId; @override - bool? get isManga => (origin as KitsuProvider).isManga; + ItemType? get itemType => (origin as KitsuProvider).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/services/trackers/myanimelist.dart b/lib/services/trackers/myanimelist.dart index e212693..2cd857e 100644 --- a/lib/services/trackers/myanimelist.dart +++ b/lib/services/trackers/myanimelist.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:intl/intl.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/models/track_search.dart'; @@ -24,7 +25,7 @@ class MyAnimeList extends _$MyAnimeList { : '0c9100ccd443ddb441a319a881180f7f'; @override - void build({required int syncId, required bool? isManga}) {} + void build({required int syncId, required ItemType? itemType}) {} Future login() async { final callbackUrlScheme = (Platform.isWindows || Platform.isLinux) @@ -80,7 +81,9 @@ class MyAnimeList extends _$MyAnimeList { Future> search(String query) async { final accessToken = await _getAccesToken(); - final url = Uri.parse(isManga! ? '$baseApiUrl/manga' : '$baseApiUrl/anime') + final url = Uri.parse(itemType == ItemType.manga + ? '$baseApiUrl/manga' + : '$baseApiUrl/anime') .replace(queryParameters: { 'q': query.trim(), 'nsfw': 'true', @@ -94,7 +97,7 @@ class MyAnimeList extends _$MyAnimeList { : (res['data'] as List).map((e) => e['node']["id"] as int).toList(); List trackSearchResult = []; for (var mangaId in mangaIds) { - final trackSearch = isManga! + final trackSearch = itemType == ItemType.manga ? await getMangaDetails(mangaId, accessToken) : await getAnimeDetails(mangaId, accessToken); trackSearchResult.add(trackSearch); @@ -248,25 +251,28 @@ class MyAnimeList extends _$MyAnimeList { Future findManga(Track track) async { final accessToken = await _getAccesToken(); - final uri = Uri.parse(isManga! + final uri = Uri.parse(itemType == ItemType.manga ? '$baseApiUrl/manga/${track.mediaId}' : '$baseApiUrl/anime/${track.mediaId}') .replace(queryParameters: { - 'fields': isManga! + 'fields': itemType == ItemType.manga ? 'num_chapters,my_list_status{start_date,finish_date}' : 'num_episodes,my_list_status{start_date,finish_date}', }); final response = await http.get(uri, headers: {'Authorization': 'Bearer $accessToken'}); final mJson = jsonDecode(response.body); - track.totalChapter = - isManga! ? mJson['num_chapters'] ?? 0 : mJson['num_episodes'] ?? 0; + track.totalChapter = itemType == ItemType.manga + ? mJson['num_chapters'] ?? 0 + : mJson['num_episodes'] ?? 0; if (mJson['my_list_status'] != null) { - track = isManga! + track = itemType == ItemType.manga ? _parseMangaItem(mJson["my_list_status"], track) : _parseAnimeItem(mJson["my_list_status"], track); } else { - track = isManga! ? await updateManga(track) : await updateAnime(track); + track = itemType == ItemType.manga + ? await updateManga(track) + : await updateAnime(track); } return track; } diff --git a/lib/services/trackers/myanimelist.g.dart b/lib/services/trackers/myanimelist.g.dart index b3eb6b7..618fa91 100644 --- a/lib/services/trackers/myanimelist.g.dart +++ b/lib/services/trackers/myanimelist.g.dart @@ -6,7 +6,7 @@ part of 'myanimelist.dart'; // RiverpodGenerator // ************************************************************************** -String _$myAnimeListHash() => r'd69a03e6f385688047c13771528c086542e03218'; +String _$myAnimeListHash() => r'607fd673cf3cf2382874b9a413472129043589d5'; /// Copied from Dart SDK class _SystemHash { @@ -31,11 +31,11 @@ class _SystemHash { abstract class _$MyAnimeList extends BuildlessAutoDisposeNotifier { late final int syncId; - late final bool? isManga; + late final ItemType? itemType; void build({ required int syncId, - required bool? isManga, + required ItemType? itemType, }); } @@ -51,11 +51,11 @@ class MyAnimeListFamily extends Family { /// See also [MyAnimeList]. MyAnimeListProvider call({ required int syncId, - required bool? isManga, + required ItemType? itemType, }) { return MyAnimeListProvider( syncId: syncId, - isManga: isManga, + itemType: itemType, ); } @@ -65,7 +65,7 @@ class MyAnimeListFamily extends Family { ) { return call( syncId: provider.syncId, - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -90,11 +90,11 @@ class MyAnimeListProvider /// See also [MyAnimeList]. MyAnimeListProvider({ required int syncId, - required bool? isManga, + required ItemType? itemType, }) : this._internal( () => MyAnimeList() ..syncId = syncId - ..isManga = isManga, + ..itemType = itemType, from: myAnimeListProvider, name: r'myAnimeListProvider', debugGetCreateSourceHash: @@ -105,7 +105,7 @@ class MyAnimeListProvider allTransitiveDependencies: MyAnimeListFamily._allTransitiveDependencies, syncId: syncId, - isManga: isManga, + itemType: itemType, ); MyAnimeListProvider._internal( @@ -116,11 +116,11 @@ class MyAnimeListProvider required super.debugGetCreateSourceHash, required super.from, required this.syncId, - required this.isManga, + required this.itemType, }) : super.internal(); final int syncId; - final bool? isManga; + final ItemType? itemType; @override void runNotifierBuild( @@ -128,7 +128,7 @@ class MyAnimeListProvider ) { return notifier.build( syncId: syncId, - isManga: isManga, + itemType: itemType, ); } @@ -139,14 +139,14 @@ class MyAnimeListProvider override: MyAnimeListProvider._internal( () => create() ..syncId = syncId - ..isManga = isManga, + ..itemType = itemType, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, syncId: syncId, - isManga: isManga, + itemType: itemType, ), ); } @@ -160,14 +160,14 @@ class MyAnimeListProvider bool operator ==(Object other) { return other is MyAnimeListProvider && other.syncId == syncId && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, syncId.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -179,8 +179,8 @@ mixin MyAnimeListRef on AutoDisposeNotifierProviderRef { /// The parameter `syncId` of this provider. int get syncId; - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType? get itemType; } class _MyAnimeListProviderElement @@ -191,7 +191,7 @@ class _MyAnimeListProviderElement @override int get syncId => (origin as MyAnimeListProvider).syncId; @override - bool? get isManga => (origin as MyAnimeListProvider).isManga; + ItemType? get itemType => (origin as MyAnimeListProvider).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/utils/constant.dart b/lib/utils/constant.dart index 0d86c72..bb8fb9d 100644 --- a/lib/utils/constant.dart +++ b/lib/utils/constant.dart @@ -44,8 +44,8 @@ String getTrackStatus(TrackStatus status, BuildContext context) { }; } -TrackStatus toTrackStatus(TrackStatus status, bool isManga, int syncId) { - return !isManga && syncId == 2 +TrackStatus toTrackStatus(TrackStatus status, ItemType itemType, int syncId) { + return itemType == ItemType.anime && syncId == 2 ? switch (status) { TrackStatus.reading => TrackStatus.watching, TrackStatus.planToRead => TrackStatus.planToWatch,