fix
This commit is contained in:
parent
6a7ab3eed4
commit
87ba9d1291
38 changed files with 506 additions and 359 deletions
|
|
@ -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'];
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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 ||
|
||||
|
|
|
|||
|
|
@ -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 : [];
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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!);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'migration.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$migrationHash() => r'403da626b6a797854dde7ae77b4ea452300c40e6';
|
||||
String _$migrationHash() => r'748a99069dd212f5eacce8185e414d80fefeaae9';
|
||||
|
||||
/// See also [migration].
|
||||
@ProviderFor(migration)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'track_providers.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$tracksHash() => r'8fbe5a46115adda0135e97386f4de57f22dc4149';
|
||||
String _$tracksHash() => r'a6e052c4102bbe640a397c37887dd618a4512c49';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)!;
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'sync_server.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$syncServerHash() => r'4ef01cd50d1ec4eaecd971fe2f176d2650147df8';
|
||||
String _$syncServerHash() => r'2349594104343ae1bcd658598cd2ac2959b35119';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue