This commit is contained in:
kodjomoustapha 2024-12-24 11:51:53 +01:00
parent 6a7ab3eed4
commit 87ba9d1291
38 changed files with 506 additions and 359 deletions

View file

@ -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<String, dynamic> json) {
finishedReadingDate = json['finishedReadingDate'];
id = json['id'];

View file

@ -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<P>(
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<P>(
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<Track, Track, QFilterCondition> {
});
}
QueryBuilder<Track, Track, QAfterFilterCondition> itemTypeEqualTo(
ItemType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Track, Track, QAfterFilterCondition> itemTypeGreaterThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Track, Track, QAfterFilterCondition> itemTypeLessThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Track, Track, QAfterFilterCondition> 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<Track, Track, QAfterFilterCondition> lastChapterReadIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@ -1405,6 +1480,18 @@ extension TrackQuerySortBy on QueryBuilder<Track, Track, QSortBy> {
});
}
QueryBuilder<Track, Track, QAfterSortBy> sortByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.asc);
});
}
QueryBuilder<Track, Track, QAfterSortBy> sortByItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.desc);
});
}
QueryBuilder<Track, Track, QAfterSortBy> sortByLastChapterRead() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'lastChapterRead', Sort.asc);
@ -1575,6 +1662,18 @@ extension TrackQuerySortThenBy on QueryBuilder<Track, Track, QSortThenBy> {
});
}
QueryBuilder<Track, Track, QAfterSortBy> thenByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.asc);
});
}
QueryBuilder<Track, Track, QAfterSortBy> thenByItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.desc);
});
}
QueryBuilder<Track, Track, QAfterSortBy> thenByLastChapterRead() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'lastChapterRead', Sort.asc);
@ -1721,6 +1820,12 @@ extension TrackQueryWhereDistinct on QueryBuilder<Track, Track, QDistinct> {
});
}
QueryBuilder<Track, Track, QDistinct> distinctByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'itemType');
});
}
QueryBuilder<Track, Track, QDistinct> distinctByLastChapterRead() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'lastChapterRead');
@ -1809,6 +1914,12 @@ extension TrackQueryProperty on QueryBuilder<Track, Track, QQueryProperty> {
});
}
QueryBuilder<Track, ItemType, QQueryOperations> itemTypeProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'itemType');
});
}
QueryBuilder<Track, int?, QQueryOperations> lastChapterReadProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'lastChapterRead');

View file

@ -98,8 +98,8 @@ class _BrowseScreenState extends ConsumerState<BrowseScreen>
} else {
context.push('/globalSearch',
extra: _tabBarController.index == 0
? true
: false);
? ItemType.manga
: ItemType.anime);
}
},
icon: Icon(
@ -116,24 +116,26 @@ class _BrowseScreenState extends ConsumerState<BrowseScreen>
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 ||

View file

@ -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<Source>? entries = snapshot.hasData ? snapshot.data : [];

View file

@ -41,11 +41,12 @@ class _ExtensionScreenState extends ConsumerState<ExtensionScreen> {
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<ExtensionScreen> {
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))

View file

@ -184,7 +184,8 @@ class _CreateExtensionState extends State<CreateExtension> {
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",

View file

@ -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<GlobalSearchScreen> {
.filter()
.isPinnedEqualTo(true)
.and()
.isMangaEqualTo(widget.isManga)
.itemTypeEqualTo(widget.itemType)
.findAllSync()
: isar.sources
.filter()
@ -50,7 +50,7 @@ class _GlobalSearchScreenState extends ConsumerState<GlobalSearchScreen> {
.and()
.isAddedEqualTo(true)
.and()
.isMangaEqualTo(widget.isManga)
.itemTypeEqualTo(widget.itemType)
.findAllSync();
return Scaffold(

View file

@ -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();
}

View file

@ -53,7 +53,11 @@ class _SourcesScreenState extends ConsumerState<SourcesScreen> {
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)),
)

View file

@ -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();

View file

@ -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!);

View file

@ -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<void> 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;
}

View file

@ -6,7 +6,7 @@ part of 'migration.dart';
// RiverpodGenerator
// **************************************************************************
String _$migrationHash() => r'403da626b6a797854dde7ae77b4ea452300c40e6';
String _$migrationHash() => r'748a99069dd212f5eacce8185e414d80fefeaae9';
/// See also [migration].
@ProviderFor(migration)

View file

@ -1656,8 +1656,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
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<MangaDetailView>
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<MangaDetailView>
await ref
.read(trackStateProvider(
track: null,
isManga:
widget.manga!.itemType !=
ItemType.anime)
itemType:
widget.manga!.itemType)
.notifier)
.setTrackSearch(
trackSearch,

View file

@ -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<TrackStatus> getStatusList() {
List<TrackStatus> statusList = [];
List<TrackStatus> 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<TrackSearch>? 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);
}

View file

@ -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<Track> {
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<Track> {
/// 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<Track> {
) {
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<Track> {
/// 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

View file

@ -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<TrackerWidgetSearch> createState() =>
@ -31,7 +32,7 @@ class _TrackerWidgetSearchState extends ConsumerState<TrackerWidgetSearch> {
_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<TrackerWidgetSearch> {
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<TrackerWidgetSearch> {
}
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,
)));
}

View file

@ -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<TrackerWidget> {
_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<TrackerWidget> {
? () 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<TrackerWidget> {
itemCount: ref
.read(trackStateProvider(
track: widget.trackRes,
isManga: widget.isManga)
itemType: widget.itemType)
.notifier)
.getStatusList()
.length,
@ -161,7 +162,7 @@ class _TrackerWidgetState extends ConsumerState<TrackerWidget> {
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<TrackerWidget> {
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<TrackerWidget> {
});
},
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<TrackerWidget> {
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<TrackerWidget> {
track: widget.trackRes
..lastChapterRead =
currentIntValue,
isManga: widget.isManga)
itemType: widget.itemType)
.notifier)
.updateManga();
Navigator.pop(context);
@ -304,21 +307,21 @@ class _TrackerWidgetState extends ConsumerState<TrackerWidget> {
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<TrackerWidget> {
.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<TrackerWidget> {
? 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<TrackerWidget> {
track: widget.trackRes
..startedReadingDate =
newDate.millisecondsSinceEpoch,
isManga: widget.isManga)
itemType: widget.itemType)
.notifier)
.updateManga();
},
@ -425,7 +428,7 @@ class _TrackerWidgetState extends ConsumerState<TrackerWidget> {
track: widget.trackRes
..finishedReadingDate =
newDate.millisecondsSinceEpoch,
isManga: widget.isManga)
itemType: widget.itemType)
.notifier)
.updateManga();
},

View file

@ -41,14 +41,14 @@ Future<void> 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;
}
}

View file

@ -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();
}

View file

@ -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<TrackingDetail>
),
),
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<TrackingDetail>
}
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<Track>? trackRes = [];
@ -145,7 +148,7 @@ class TrackingWidget extends StatelessWidget {
mangaId: track.mangaId!,
syncId: track.syncId!,
trackRes: track,
isManga: isManga,
itemType: itemType,
hide: true,
);
},

View file

@ -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) {

View file

@ -6,7 +6,7 @@ part of 'track_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$tracksHash() => r'8fbe5a46115adda0135e97386f4de57f22dc4149';
String _$tracksHash() => r'a6e052c4102bbe640a397c37887dd618a4512c49';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -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();
},

View file

@ -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);
});
}

View file

@ -118,7 +118,7 @@ class _NovelWebViewState extends ConsumerState<NovelWebView>
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<T> extends StatelessWidget {
.textTheme
.bodyLarge!
.color!
.withOpacity(0.9)),
.withValues(alpha: 0.9)),
overflow: TextOverflow.ellipsis,
maxLines: 1,
),

View file

@ -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,
),
);
},

View file

@ -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:

View file

@ -26,7 +26,12 @@ Future<void> 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)!;

View file

@ -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';

View file

@ -6,7 +6,7 @@ part of 'sync_server.dart';
// RiverpodGenerator
// **************************************************************************
String _$syncServerHash() => r'4ef01cd50d1ec4eaecd971fe2f176d2650147df8';
String _$syncServerHash() => r'2349594104343ae1bcd658598cd2ac2959b35119';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -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<bool?> login() async {
final callbackUrlScheme = (Platform.isWindows || Platform.isLinux)

View file

@ -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<void> {
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<void> {
/// 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<void> {
) {
return call(
syncId: provider.syncId,
isManga: provider.isManga,
itemType: provider.itemType,
);
}
@ -89,11 +89,11 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl<Anilist, void> {
/// 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<Anilist, void> {
dependencies: AnilistFamily._dependencies,
allTransitiveDependencies: AnilistFamily._allTransitiveDependencies,
syncId: syncId,
isManga: isManga,
itemType: itemType,
);
AnilistProvider._internal(
@ -114,11 +114,11 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl<Anilist, void> {
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<Anilist, void> {
) {
return notifier.build(
syncId: syncId,
isManga: isManga,
itemType: itemType,
);
}
@ -137,14 +137,14 @@ class AnilistProvider extends AutoDisposeNotifierProviderImpl<Anilist, void> {
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<Anilist, void> {
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<void> {
/// 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

View file

@ -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 {

View file

@ -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<void> {
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<void> {
/// 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<void> {
) {
return call(
syncId: provider.syncId,
isManga: provider.isManga,
itemType: provider.itemType,
);
}
@ -89,11 +89,11 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl<Kitsu, void> {
/// 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<Kitsu, void> {
dependencies: KitsuFamily._dependencies,
allTransitiveDependencies: KitsuFamily._allTransitiveDependencies,
syncId: syncId,
isManga: isManga,
itemType: itemType,
);
KitsuProvider._internal(
@ -114,11 +114,11 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl<Kitsu, void> {
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<Kitsu, void> {
) {
return notifier.build(
syncId: syncId,
isManga: isManga,
itemType: itemType,
);
}
@ -137,14 +137,14 @@ class KitsuProvider extends AutoDisposeNotifierProviderImpl<Kitsu, void> {
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<Kitsu, void> {
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<void> {
/// 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

View file

@ -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<bool?> login() async {
final callbackUrlScheme = (Platform.isWindows || Platform.isLinux)
@ -80,7 +81,9 @@ class MyAnimeList extends _$MyAnimeList {
Future<List<TrackSearch>> 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<TrackSearch> 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<Track> 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;
}

View file

@ -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<void> {
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<void> {
/// 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<void> {
) {
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<void> {
/// 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

View file

@ -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,