migration: hive to isar step 2
This commit is contained in:
parent
f0f1d3a6e2
commit
72b04bac2a
31 changed files with 2412 additions and 1393 deletions
BIN
.dart_tool_/isar/default.isar
Normal file
BIN
.dart_tool_/isar/default.isar
Normal file
Binary file not shown.
BIN
.dart_tool_/isar/default.isar-lck
Normal file
BIN
.dart_tool_/isar/default.isar-lck
Normal file
Binary file not shown.
|
|
@ -13,6 +13,7 @@ import 'package:mangayomi/models/manga_history.dart';
|
|||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:mangayomi/router/router.dart';
|
||||
import 'package:mangayomi/source/source_model.dart';
|
||||
import 'package:mangayomi/views/manga/detail/models/chapter_filter.dart';
|
||||
import 'package:mangayomi/views/manga/download/model/download_model.dart';
|
||||
import 'package:mangayomi/views/manga/reader/providers/reader_controller_provider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/blend_level_state_provider.dart';
|
||||
|
|
@ -56,14 +57,24 @@ initIsar() async {
|
|||
final dir = await getApplicationDocumentsDirectory();
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
isar = Isar.openSync(
|
||||
[ModelMangaSchema, ModelChaptersSchema, CategoriesModelSchema],
|
||||
[
|
||||
ModelMangaSchema,
|
||||
ModelChaptersSchema,
|
||||
CategoriesModelSchema,
|
||||
ChaptersFilterSchema
|
||||
],
|
||||
directory: dir.path,
|
||||
);
|
||||
} else {
|
||||
String rootDir = path.join(Directory.current.path, '.dart_tool', 'isar');
|
||||
String rootDir = path.join(Directory.current.path, '.dart_tool_', 'isar');
|
||||
await Directory(rootDir).create(recursive: true); // something like this
|
||||
isar = await Isar.open(
|
||||
[ModelMangaSchema, ModelChaptersSchema, CategoriesModelSchema],
|
||||
[
|
||||
ModelMangaSchema,
|
||||
ModelChaptersSchema,
|
||||
CategoriesModelSchema,
|
||||
ChaptersFilterSchema
|
||||
],
|
||||
directory: rootDir,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,19 +106,19 @@ class AsyncRouterNotifier extends ChangeNotifier {
|
|||
GoRoute(
|
||||
path: '/manga-reader/detail',
|
||||
builder: (context, state) {
|
||||
int idManga = state.extra as int;
|
||||
int mangaId = state.extra as int;
|
||||
|
||||
return MangaReaderDetail(
|
||||
idManga: idManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
},
|
||||
pageBuilder: (context, state) {
|
||||
int idManga = state.extra as int;
|
||||
int mangaId = state.extra as int;
|
||||
|
||||
return CustomTransition(
|
||||
key: state.pageKey,
|
||||
child: MangaReaderDetail(
|
||||
idManga: idManga,
|
||||
mangaId: mangaId,
|
||||
));
|
||||
}),
|
||||
GoRoute(
|
||||
|
|
|
|||
|
|
@ -10,11 +10,15 @@ import 'package:mangayomi/models/categories.dart';
|
|||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:mangayomi/providers/hive_provider.dart';
|
||||
import 'package:mangayomi/utils/media_query.dart';
|
||||
import 'package:mangayomi/views/library/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/views/library/providers/library_state_provider.dart';
|
||||
import 'package:mangayomi/views/library/search_text_form_field.dart';
|
||||
import 'package:mangayomi/views/library/widgets/library_gridview_widget.dart';
|
||||
import 'package:mangayomi/views/library/widgets/library_listview_widget.dart';
|
||||
import 'package:mangayomi/views/manga/detail/widgets/chapter_filter_list_tile_widget.dart';
|
||||
import 'package:mangayomi/views/more/settings/categoties/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/views/widgets/error_text.dart';
|
||||
import 'package:mangayomi/views/widgets/progress_center.dart';
|
||||
|
||||
class LibraryScreen extends ConsumerStatefulWidget {
|
||||
const LibraryScreen({super.key});
|
||||
|
|
@ -44,121 +48,107 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
final displayType = ref
|
||||
.read(libraryDisplayTypeStateProvider.notifier)
|
||||
.getLibraryDisplayTypeValue(ref.watch(libraryDisplayTypeStateProvider));
|
||||
final isNotFiltering = ref
|
||||
.read(mangaFilterResultStateProvider(mangaList: entries).notifier)
|
||||
.isNotFiltering();
|
||||
return StreamBuilder(
|
||||
stream: isar.categoriesModels
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData &&
|
||||
snapshot.data!.isNotEmpty &&
|
||||
showCategoryTabs) {
|
||||
final entr = snapshot.data;
|
||||
tabBarController = TabController(length: entr!.length, vsync: this);
|
||||
tabBarController.animateTo(tabIndex);
|
||||
tabBarController.addListener(() {
|
||||
tabIndex = tabBarController.index;
|
||||
});
|
||||
return DefaultTabController(
|
||||
length: entr.length,
|
||||
child: Scaffold(
|
||||
appBar:
|
||||
_appBar(isNotFiltering, showNumbersOfItems, entries.length),
|
||||
body: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
TabBar(
|
||||
isScrollable: true,
|
||||
controller: tabBarController,
|
||||
tabs: entr.map((e) => Tab(text: e.name)).toList()),
|
||||
Flexible(
|
||||
child: TabBarView(
|
||||
controller: tabBarController,
|
||||
children: entr
|
||||
.map(
|
||||
(e) => Scaffold(
|
||||
body: StreamBuilder(
|
||||
stream: isar.modelMangas
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.favoriteEqualTo(true)
|
||||
.categoriesIsNotEmpty()
|
||||
.categoriesElementEqualTo(e.id!)
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
// final data = ref.watch(
|
||||
// mangaFilterResultStateProvider(
|
||||
// mangaList: entries));
|
||||
// entriesFilter = _textEditingController
|
||||
// .text.isNotEmpty
|
||||
// ? data
|
||||
// .where((element) => element.name!
|
||||
// .toLowerCase()
|
||||
// .contains(_textEditingController
|
||||
// .text
|
||||
// .toLowerCase()))
|
||||
// .toList()
|
||||
// : data;
|
||||
final isNotFiltering =
|
||||
ref.watch(mangasFilterResultStateProvider(mangaList: entries));
|
||||
final categories = ref.watch(getMangaCategorieStreamProvider);
|
||||
final downloadFilterType =
|
||||
ref.watch(mangaFilterDownloadedStateProvider(mangaList: entries));
|
||||
final unreadFilterType =
|
||||
ref.watch(mangaFilterUnreadStateProvider(mangaList: entries));
|
||||
final startedFilterType =
|
||||
ref.watch(mangaFilterStartedStateProvider(mangaList: entries));
|
||||
final bookmarkedFilterType =
|
||||
ref.watch(mangaFilterBookmarkedStateProvider(mangaList: entries));
|
||||
log(downloadFilterType.toString());
|
||||
return categories.when(
|
||||
data: (data) {
|
||||
if (data.isNotEmpty && showCategoryTabs) {
|
||||
final entr = data;
|
||||
tabBarController = TabController(length: entr.length, vsync: this);
|
||||
tabBarController.animateTo(tabIndex);
|
||||
tabBarController.addListener(() {
|
||||
tabIndex = tabBarController.index;
|
||||
});
|
||||
|
||||
if (snapshot.hasData &&
|
||||
snapshot.data!.isNotEmpty) {
|
||||
final entries = snapshot.data!;
|
||||
final entriesManga = reverse
|
||||
? entries.reversed.toList()
|
||||
: entries;
|
||||
return displayType == DisplayType.list
|
||||
? LibraryListViewWidget(
|
||||
entriesManga: entriesManga,
|
||||
continueReaderBtn:
|
||||
continueReaderBtn,
|
||||
downloadedChapter:
|
||||
downloadedChapter,
|
||||
language: language,
|
||||
)
|
||||
: LibraryGridViewWidget(
|
||||
entriesManga: entriesManga,
|
||||
isCoverOnlyGrid: displayType ==
|
||||
DisplayType.compactGrid
|
||||
? false
|
||||
: true,
|
||||
isComfortableGrid: displayType ==
|
||||
DisplayType.comfortableGrid
|
||||
? true
|
||||
: false,
|
||||
continueReaderBtn:
|
||||
continueReaderBtn,
|
||||
downloadedChapter:
|
||||
downloadedChapter,
|
||||
language: language,
|
||||
);
|
||||
}
|
||||
return const Center(
|
||||
child: Text("Empty Library"));
|
||||
},
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
))
|
||||
],
|
||||
),
|
||||
return DefaultTabController(
|
||||
length: entr.length,
|
||||
child: Scaffold(
|
||||
appBar:
|
||||
_appBar(isNotFiltering, showNumbersOfItems, entries.length),
|
||||
body: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
TabBar(
|
||||
isScrollable: true,
|
||||
controller: tabBarController,
|
||||
tabs: entr.map((e) => Tab(text: e.name)).toList()),
|
||||
Flexible(
|
||||
child: TabBarView(
|
||||
controller: tabBarController,
|
||||
children: entr.map((e) {
|
||||
final mangas = ref
|
||||
.watch(getAllMangaStreamProvider(categoryId: e.id));
|
||||
return Scaffold(
|
||||
body: mangas.when(
|
||||
data: (data) {
|
||||
final entries = _filterMangas(
|
||||
data: data,
|
||||
downloadFilterType: downloadFilterType,
|
||||
unreadFilterType: unreadFilterType,
|
||||
startedFilterType: startedFilterType,
|
||||
bookmarkedFilterType: bookmarkedFilterType);
|
||||
if (entries.isNotEmpty) {
|
||||
final entriesManga =
|
||||
reverse ? entries.reversed.toList() : entries;
|
||||
return displayType == DisplayType.list
|
||||
? LibraryListViewWidget(
|
||||
entriesManga: entriesManga,
|
||||
continueReaderBtn: continueReaderBtn,
|
||||
downloadedChapter: downloadedChapter,
|
||||
language: language,
|
||||
)
|
||||
: LibraryGridViewWidget(
|
||||
entriesManga: entriesManga,
|
||||
isCoverOnlyGrid:
|
||||
displayType == DisplayType.compactGrid
|
||||
? false
|
||||
: true,
|
||||
isComfortableGrid: displayType ==
|
||||
DisplayType.comfortableGrid
|
||||
? true
|
||||
: false,
|
||||
continueReaderBtn: continueReaderBtn,
|
||||
downloadedChapter: downloadedChapter,
|
||||
language: language,
|
||||
);
|
||||
}
|
||||
return const Center(child: Text("Empty Library"));
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return const ProgressCenter();
|
||||
},
|
||||
));
|
||||
}).toList(),
|
||||
))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
return Scaffold(
|
||||
),
|
||||
);
|
||||
}
|
||||
return Scaffold(
|
||||
appBar: _appBar(isNotFiltering, showNumbersOfItems, entries.length),
|
||||
body: StreamBuilder(
|
||||
stream: isar.modelMangas
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.favoriteEqualTo(true)
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
||||
final entries = snapshot.data!;
|
||||
body: ref.watch(getAllMangaStreamProvider(categoryId: null)).when(
|
||||
data: (data) {
|
||||
final entries = _filterMangas(
|
||||
data: data,
|
||||
downloadFilterType: downloadFilterType,
|
||||
unreadFilterType: unreadFilterType,
|
||||
startedFilterType: startedFilterType,
|
||||
bookmarkedFilterType: bookmarkedFilterType);
|
||||
if (entries.isNotEmpty) {
|
||||
final entriesManga =
|
||||
reverse ? entries.reversed.toList() : entries;
|
||||
return displayType == DisplayType.list
|
||||
|
|
@ -185,9 +175,94 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
}
|
||||
return const Center(child: Text("Empty Library"));
|
||||
},
|
||||
),
|
||||
);
|
||||
});
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return const ProgressCenter();
|
||||
},
|
||||
));
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return const ProgressCenter();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
List<ModelManga> _filterMangas(
|
||||
{required List<ModelManga> data,
|
||||
required int downloadFilterType,
|
||||
required int unreadFilterType,
|
||||
required int startedFilterType,
|
||||
required int bookmarkedFilterType}) {
|
||||
return data.where((element) {
|
||||
List list = [];
|
||||
if (downloadFilterType == 1) {
|
||||
for (var chap in element.chapters) {
|
||||
final modelChapDownload = ref
|
||||
.watch(hiveBoxMangaDownloadsProvider)
|
||||
.get("${chap.mangaId}/${chap.id}", defaultValue: null);
|
||||
if (modelChapDownload != null &&
|
||||
modelChapDownload.isDownload == true) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters.length;
|
||||
} else if (downloadFilterType == 2) {
|
||||
for (var chap in element.chapters) {
|
||||
final modelChapDownload = ref
|
||||
.watch(hiveBoxMangaDownloadsProvider)
|
||||
.get("${chap.mangaId}/${chap.id}", defaultValue: null);
|
||||
if (!(modelChapDownload != null &&
|
||||
modelChapDownload.isDownload == true)) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters.length;
|
||||
}
|
||||
return true;
|
||||
}).where((element) {
|
||||
List list = [];
|
||||
if (unreadFilterType == 1 || startedFilterType == 1) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.isNotEmpty;
|
||||
} else if (unreadFilterType == 2 || startedFilterType == 2) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters.length;
|
||||
}
|
||||
return true;
|
||||
}).where((element) {
|
||||
List list = [];
|
||||
if (bookmarkedFilterType == 1) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isBookmarked!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.isNotEmpty;
|
||||
} else if (bookmarkedFilterType == 2) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isBookmarked!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters.length;
|
||||
}
|
||||
return true;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
_showDraggableMenu() {
|
||||
|
|
@ -227,14 +302,12 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
mangaFilterDownloadedStateProvider(
|
||||
mangaList: entries)),
|
||||
onTap: () {
|
||||
setState(() {
|
||||
entriesFilter = ref
|
||||
.read(
|
||||
mangaFilterDownloadedStateProvider(
|
||||
mangaList: entries)
|
||||
.notifier)
|
||||
.update();
|
||||
});
|
||||
ref
|
||||
.read(
|
||||
mangaFilterDownloadedStateProvider(
|
||||
mangaList: entries)
|
||||
.notifier)
|
||||
.update();
|
||||
}),
|
||||
ListTileChapterFilter(
|
||||
label: "Unread",
|
||||
|
|
@ -242,14 +315,11 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
mangaFilterUnreadStateProvider(
|
||||
mangaList: entries)),
|
||||
onTap: () {
|
||||
setState(() {
|
||||
entriesFilter = ref
|
||||
.read(
|
||||
mangaFilterUnreadStateProvider(
|
||||
mangaList: entries)
|
||||
.notifier)
|
||||
.update();
|
||||
});
|
||||
ref
|
||||
.read(mangaFilterUnreadStateProvider(
|
||||
mangaList: entries)
|
||||
.notifier)
|
||||
.update();
|
||||
}),
|
||||
ListTileChapterFilter(
|
||||
label: "Started",
|
||||
|
|
@ -257,14 +327,11 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
mangaFilterStartedStateProvider(
|
||||
mangaList: entries)),
|
||||
onTap: () {
|
||||
setState(() {
|
||||
entriesFilter = ref
|
||||
.read(
|
||||
mangaFilterStartedStateProvider(
|
||||
mangaList: entries)
|
||||
.notifier)
|
||||
.update();
|
||||
});
|
||||
ref
|
||||
.read(mangaFilterStartedStateProvider(
|
||||
mangaList: entries)
|
||||
.notifier)
|
||||
.update();
|
||||
}),
|
||||
ListTileChapterFilter(
|
||||
label: "Bookmarked",
|
||||
|
|
|
|||
23
lib/views/library/providers/isar_providers.dart
Normal file
23
lib/views/library/providers/isar_providers.dart
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'isar_providers.g.dart';
|
||||
|
||||
@riverpod
|
||||
Stream<List<ModelManga>> getAllMangaStream(GetAllMangaStreamRef ref,
|
||||
{required int? categoryId}) async* {
|
||||
yield* categoryId == null
|
||||
? isar.modelMangas
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.favoriteEqualTo(true)
|
||||
.watch(fireImmediately: true)
|
||||
: isar.modelMangas
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.favoriteEqualTo(true)
|
||||
.categoriesIsNotEmpty()
|
||||
.categoriesElementEqualTo(categoryId)
|
||||
.watch(fireImmediately: true);
|
||||
}
|
||||
113
lib/views/library/providers/isar_providers.g.dart
Normal file
113
lib/views/library/providers/isar_providers.g.dart
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'isar_providers.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getAllMangaStreamHash() => r'484e9a88316fef837e7bd38ee518734c19e2c718';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
_SystemHash._();
|
||||
|
||||
static int combine(int hash, int value) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + value);
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||
return hash ^ (hash >> 6);
|
||||
}
|
||||
|
||||
static int finish(int hash) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||
// ignore: parameter_assignments
|
||||
hash = hash ^ (hash >> 11);
|
||||
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||
}
|
||||
}
|
||||
|
||||
typedef GetAllMangaStreamRef = AutoDisposeStreamProviderRef<List<ModelManga>>;
|
||||
|
||||
/// See also [getAllMangaStream].
|
||||
@ProviderFor(getAllMangaStream)
|
||||
const getAllMangaStreamProvider = GetAllMangaStreamFamily();
|
||||
|
||||
/// See also [getAllMangaStream].
|
||||
class GetAllMangaStreamFamily extends Family<AsyncValue<List<ModelManga>>> {
|
||||
/// See also [getAllMangaStream].
|
||||
const GetAllMangaStreamFamily();
|
||||
|
||||
/// See also [getAllMangaStream].
|
||||
GetAllMangaStreamProvider call({
|
||||
required int? categoryId,
|
||||
}) {
|
||||
return GetAllMangaStreamProvider(
|
||||
categoryId: categoryId,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
GetAllMangaStreamProvider getProviderOverride(
|
||||
covariant GetAllMangaStreamProvider provider,
|
||||
) {
|
||||
return call(
|
||||
categoryId: provider.categoryId,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'getAllMangaStreamProvider';
|
||||
}
|
||||
|
||||
/// See also [getAllMangaStream].
|
||||
class GetAllMangaStreamProvider
|
||||
extends AutoDisposeStreamProvider<List<ModelManga>> {
|
||||
/// See also [getAllMangaStream].
|
||||
GetAllMangaStreamProvider({
|
||||
required this.categoryId,
|
||||
}) : super.internal(
|
||||
(ref) => getAllMangaStream(
|
||||
ref,
|
||||
categoryId: categoryId,
|
||||
),
|
||||
from: getAllMangaStreamProvider,
|
||||
name: r'getAllMangaStreamProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$getAllMangaStreamHash,
|
||||
dependencies: GetAllMangaStreamFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
GetAllMangaStreamFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final int? categoryId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is GetAllMangaStreamProvider && other.categoryId == categoryId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, categoryId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:mangayomi/providers/hive_provider.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
|
@ -71,87 +73,21 @@ class MangaFilterDownloadedState extends _$MangaFilterDownloadedState {
|
|||
int getType() {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("filterMangaDownload", defaultValue: 0);
|
||||
.get("filterMangasDownload", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangaDownload", type);
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangasDownload", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
List<ModelManga> getData() {
|
||||
if (getType() == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(chap.name, defaultValue: null);
|
||||
// if (modelChapDownload != null &&
|
||||
// modelChapDownload.isDownload == true) {
|
||||
// list.add(true);
|
||||
// }
|
||||
}
|
||||
return list.isNotEmpty;
|
||||
}).toList();
|
||||
|
||||
return data;
|
||||
} else if (getType() == 2) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(chap.name, defaultValue: null);
|
||||
// if (modelChapDownload == null ||
|
||||
// modelChapDownload.isDownload == false) {
|
||||
// list.add(true);
|
||||
// }
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
}).toList();
|
||||
return data;
|
||||
} else {
|
||||
return mangaList;
|
||||
}
|
||||
}
|
||||
|
||||
List<ModelManga> update() {
|
||||
update() {
|
||||
if (state == 0) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(chap.name, defaultValue: null);
|
||||
// if (modelChapDownload != null &&
|
||||
// modelChapDownload.isDownload == true) {
|
||||
// list.add(true);
|
||||
// }
|
||||
}
|
||||
return list.isNotEmpty;
|
||||
}).toList();
|
||||
setType(1);
|
||||
return data;
|
||||
} else if (state == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(chap.name, defaultValue: null);
|
||||
// if (modelChapDownload == null ||
|
||||
// modelChapDownload.isDownload == false) {
|
||||
// list.add(true);
|
||||
// }
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
}).toList();
|
||||
setType(2);
|
||||
return data;
|
||||
} else {
|
||||
setType(0);
|
||||
return mangaList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -167,11 +103,11 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
|
|||
int getType() {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("filterMangaUnread", defaultValue: 0);
|
||||
.get("filterMangasUnread", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangaUnread", type);
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangasUnread", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
|
|
@ -179,7 +115,7 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
|
|||
if (getType() == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
|
|
@ -190,12 +126,12 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
|
|||
} else if (getType() == 2) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
return list.length == element.chapters.length;
|
||||
}).toList();
|
||||
return data;
|
||||
} else {
|
||||
|
|
@ -203,11 +139,11 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
|
|||
}
|
||||
}
|
||||
|
||||
List<ModelManga> update() {
|
||||
update() {
|
||||
if (state == 0) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
|
|
@ -219,12 +155,12 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
|
|||
} else if (state == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
return list.length == element.chapters.length;
|
||||
}).toList();
|
||||
setType(2);
|
||||
return data;
|
||||
|
|
@ -246,11 +182,11 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
|
|||
int getType() {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("filterMangaStarted", defaultValue: 0);
|
||||
.get("filterMangasStarted", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangaStarted", type);
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangasStarted", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
|
|
@ -258,7 +194,7 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
|
|||
if (getType() == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
|
|
@ -269,12 +205,12 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
|
|||
} else if (getType() == 2) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
return list.length == element.chapters.length;
|
||||
}).toList();
|
||||
return data;
|
||||
} else {
|
||||
|
|
@ -286,7 +222,7 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
|
|||
if (state == 0) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
|
|
@ -298,12 +234,12 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
|
|||
} else if (state == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isRead!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
return list.length == element.chapters.length;
|
||||
}).toList();
|
||||
setType(2);
|
||||
return data;
|
||||
|
|
@ -325,11 +261,11 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
|||
int getType() {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("filterMangaBookMarked", defaultValue: 0);
|
||||
.get("filterMangasBookMarked", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangaBookMarked", type);
|
||||
ref.watch(hiveBoxSettingsProvider).put("filterMangasBookMarked", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
|
|
@ -337,7 +273,7 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
|||
if (getType() == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isBookmarked!) {
|
||||
list.add(true);
|
||||
}
|
||||
|
|
@ -348,12 +284,12 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
|||
} else if (getType() == 2) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isBookmarked!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
return list.length == element.chapters.length;
|
||||
}).toList();
|
||||
return data;
|
||||
} else {
|
||||
|
|
@ -365,7 +301,7 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
|||
if (state == 0) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (chap.isBookmarked!) {
|
||||
list.add(true);
|
||||
}
|
||||
|
|
@ -377,12 +313,12 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
|||
} else if (state == 1) {
|
||||
final data = mangaList.where((element) {
|
||||
List list = [];
|
||||
for (var chap in element.chapters!) {
|
||||
for (var chap in element.chapters) {
|
||||
if (!chap.isBookmarked!) {
|
||||
list.add(true);
|
||||
}
|
||||
}
|
||||
return list.length == element.chapters!.length;
|
||||
return list.length == element.chapters.length;
|
||||
}).toList();
|
||||
setType(2);
|
||||
return data;
|
||||
|
|
@ -394,28 +330,9 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
|||
}
|
||||
|
||||
@riverpod
|
||||
class MangaFilterResultState extends _$MangaFilterResultState {
|
||||
class MangasFilterResultState extends _$MangasFilterResultState {
|
||||
@override
|
||||
List<ModelManga> build({required List<ModelManga> mangaList}) {
|
||||
final data1 = ref
|
||||
.read(mangaFilterDownloadedStateProvider(mangaList: mangaList).notifier)
|
||||
.getData();
|
||||
|
||||
final data2 = ref
|
||||
.read(mangaFilterUnreadStateProvider(mangaList: data1).notifier)
|
||||
.getData();
|
||||
|
||||
final data3 = ref
|
||||
.read(mangaFilterStartedStateProvider(mangaList: data2).notifier)
|
||||
.getData();
|
||||
final data4 = ref
|
||||
.read(mangaFilterBookmarkedStateProvider(mangaList: data3).notifier)
|
||||
.getData();
|
||||
|
||||
return data4;
|
||||
}
|
||||
|
||||
bool isNotFiltering() {
|
||||
bool build({required List<ModelManga> mangaList}) {
|
||||
final downloadFilterType =
|
||||
ref.watch(mangaFilterDownloadedStateProvider(mangaList: mangaList));
|
||||
final unreadFilterType =
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ final libraryDisplayTypeStateProvider =
|
|||
|
||||
typedef _$LibraryDisplayTypeState = AutoDisposeNotifier<String>;
|
||||
String _$mangaFilterDownloadedStateHash() =>
|
||||
r'3c09b61fc80e35711b308b2b0050879c37cdd299';
|
||||
r'd489a673c7a180129be17adccd3da69d529c1ff4';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
@ -161,7 +161,7 @@ class MangaFilterDownloadedStateProvider
|
|||
}
|
||||
|
||||
String _$mangaFilterUnreadStateHash() =>
|
||||
r'bb771edf600c96e1b9fe4ceb786f143fe7050bfb';
|
||||
r'46091316aacb44f8fb900b054632e03fea03fe0d';
|
||||
|
||||
abstract class _$MangaFilterUnreadState
|
||||
extends BuildlessAutoDisposeNotifier<int> {
|
||||
|
|
@ -260,7 +260,7 @@ class MangaFilterUnreadStateProvider
|
|||
}
|
||||
|
||||
String _$mangaFilterStartedStateHash() =>
|
||||
r'b8447b0eb414f15c4200bad461c260bdde3fe91c';
|
||||
r'8b31487fdd597ce67f67581267df65a0037788f2';
|
||||
|
||||
abstract class _$MangaFilterStartedState
|
||||
extends BuildlessAutoDisposeNotifier<int> {
|
||||
|
|
@ -359,7 +359,7 @@ class MangaFilterStartedStateProvider
|
|||
}
|
||||
|
||||
String _$mangaFilterBookmarkedStateHash() =>
|
||||
r'777ac2ceb266d5bf6837ea270fd62ab8471add92';
|
||||
r'e97a2dccce54775e2d321933d9d57a318a6ec973';
|
||||
|
||||
abstract class _$MangaFilterBookmarkedState
|
||||
extends BuildlessAutoDisposeNotifier<int> {
|
||||
|
|
@ -457,39 +457,39 @@ class MangaFilterBookmarkedStateProvider
|
|||
}
|
||||
}
|
||||
|
||||
String _$mangaFilterResultStateHash() =>
|
||||
r'fb5c27326f49a7e361ac19b97b511f1d8ab50920';
|
||||
String _$mangasFilterResultStateHash() =>
|
||||
r'56207315fb81ae3adefa81ff1bea89015e0f99ec';
|
||||
|
||||
abstract class _$MangaFilterResultState
|
||||
extends BuildlessAutoDisposeNotifier<List<ModelManga>> {
|
||||
abstract class _$MangasFilterResultState
|
||||
extends BuildlessAutoDisposeNotifier<bool> {
|
||||
late final List<ModelManga> mangaList;
|
||||
|
||||
List<ModelManga> build({
|
||||
bool build({
|
||||
required List<ModelManga> mangaList,
|
||||
});
|
||||
}
|
||||
|
||||
/// See also [MangaFilterResultState].
|
||||
@ProviderFor(MangaFilterResultState)
|
||||
const mangaFilterResultStateProvider = MangaFilterResultStateFamily();
|
||||
/// See also [MangasFilterResultState].
|
||||
@ProviderFor(MangasFilterResultState)
|
||||
const mangasFilterResultStateProvider = MangasFilterResultStateFamily();
|
||||
|
||||
/// See also [MangaFilterResultState].
|
||||
class MangaFilterResultStateFamily extends Family<List<ModelManga>> {
|
||||
/// See also [MangaFilterResultState].
|
||||
const MangaFilterResultStateFamily();
|
||||
/// See also [MangasFilterResultState].
|
||||
class MangasFilterResultStateFamily extends Family<bool> {
|
||||
/// See also [MangasFilterResultState].
|
||||
const MangasFilterResultStateFamily();
|
||||
|
||||
/// See also [MangaFilterResultState].
|
||||
MangaFilterResultStateProvider call({
|
||||
/// See also [MangasFilterResultState].
|
||||
MangasFilterResultStateProvider call({
|
||||
required List<ModelManga> mangaList,
|
||||
}) {
|
||||
return MangaFilterResultStateProvider(
|
||||
return MangasFilterResultStateProvider(
|
||||
mangaList: mangaList,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
MangaFilterResultStateProvider getProviderOverride(
|
||||
covariant MangaFilterResultStateProvider provider,
|
||||
MangasFilterResultStateProvider getProviderOverride(
|
||||
covariant MangasFilterResultStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
mangaList: provider.mangaList,
|
||||
|
|
@ -508,33 +508,33 @@ class MangaFilterResultStateFamily extends Family<List<ModelManga>> {
|
|||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'mangaFilterResultStateProvider';
|
||||
String? get name => r'mangasFilterResultStateProvider';
|
||||
}
|
||||
|
||||
/// See also [MangaFilterResultState].
|
||||
class MangaFilterResultStateProvider extends AutoDisposeNotifierProviderImpl<
|
||||
MangaFilterResultState, List<ModelManga>> {
|
||||
/// See also [MangaFilterResultState].
|
||||
MangaFilterResultStateProvider({
|
||||
/// See also [MangasFilterResultState].
|
||||
class MangasFilterResultStateProvider
|
||||
extends AutoDisposeNotifierProviderImpl<MangasFilterResultState, bool> {
|
||||
/// See also [MangasFilterResultState].
|
||||
MangasFilterResultStateProvider({
|
||||
required this.mangaList,
|
||||
}) : super.internal(
|
||||
() => MangaFilterResultState()..mangaList = mangaList,
|
||||
from: mangaFilterResultStateProvider,
|
||||
name: r'mangaFilterResultStateProvider',
|
||||
() => MangasFilterResultState()..mangaList = mangaList,
|
||||
from: mangasFilterResultStateProvider,
|
||||
name: r'mangasFilterResultStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$mangaFilterResultStateHash,
|
||||
dependencies: MangaFilterResultStateFamily._dependencies,
|
||||
: _$mangasFilterResultStateHash,
|
||||
dependencies: MangasFilterResultStateFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
MangaFilterResultStateFamily._allTransitiveDependencies,
|
||||
MangasFilterResultStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final List<ModelManga> mangaList;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is MangaFilterResultStateProvider &&
|
||||
return other is MangasFilterResultStateProvider &&
|
||||
other.mangaList == mangaList;
|
||||
}
|
||||
|
||||
|
|
@ -547,8 +547,8 @@ class MangaFilterResultStateProvider extends AutoDisposeNotifierProviderImpl<
|
|||
}
|
||||
|
||||
@override
|
||||
List<ModelManga> runNotifierBuild(
|
||||
covariant MangaFilterResultState notifier,
|
||||
bool runNotifierBuild(
|
||||
covariant MangasFilterResultState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
mangaList: mangaList,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:draggable_menu/draggable_menu.dart';
|
||||
import 'package:draggable_scrollbar/draggable_scrollbar.dart';
|
||||
|
|
@ -5,6 +7,8 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:mangayomi/providers/hive_provider.dart';
|
||||
import 'package:mangayomi/utils/cached_network.dart';
|
||||
|
|
@ -12,17 +16,19 @@ import 'package:mangayomi/utils/colors.dart';
|
|||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/utils/media_query.dart';
|
||||
import 'package:mangayomi/utils/utils.dart';
|
||||
import 'package:mangayomi/views/manga/detail/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/views/manga/detail/providers/state_providers.dart';
|
||||
import 'package:mangayomi/views/manga/detail/readmore.dart';
|
||||
import 'package:mangayomi/views/manga/detail/widgets/chapter_filter_list_tile_widget.dart';
|
||||
import 'package:mangayomi/views/manga/detail/widgets/chapter_list_tile_widget.dart';
|
||||
import 'package:mangayomi/views/manga/detail/widgets/chapter_sort_list_tile_widget.dart';
|
||||
import 'package:mangayomi/views/manga/download/providers/download_provider.dart';
|
||||
import 'package:mangayomi/views/widgets/error_text.dart';
|
||||
import 'package:mangayomi/views/widgets/progress_center.dart';
|
||||
|
||||
class MangaDetailView extends ConsumerStatefulWidget {
|
||||
final Function(bool) isExtended;
|
||||
|
||||
final int listLength;
|
||||
final Widget? titleDescription;
|
||||
final List<Color>? backButtonColors;
|
||||
final Widget? action;
|
||||
|
|
@ -34,7 +40,6 @@ class MangaDetailView extends ConsumerStatefulWidget {
|
|||
this.backButtonColors,
|
||||
this.action,
|
||||
required this.modelManga,
|
||||
required this.listLength,
|
||||
});
|
||||
|
||||
@override
|
||||
|
|
@ -60,8 +65,23 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
Widget build(BuildContext context) {
|
||||
final isLongPressed = ref.watch(isLongPressedStateProvider);
|
||||
final chapterNameList = ref.watch(chapterIdsListStateProvider);
|
||||
bool reverse = ref.watch(
|
||||
reverseChapterStateProvider(modelManga: widget.modelManga!))["reverse"];
|
||||
bool reverse =
|
||||
ref.watch(reverseChapterStateProvider(mangaId: widget.modelManga!.id!))[
|
||||
"reverse"];
|
||||
// log(reverse.toString());
|
||||
// final chaptersList =
|
||||
// ref.watch(getChaptersStreamProvider(mangaId: widget.modelManga!.id!));
|
||||
final filterUnread = ref.watch(
|
||||
chapterFilterUnreadStateProvider(mangaId: widget.modelManga!.id!));
|
||||
final filterBookmarked = ref.watch(
|
||||
chapterFilterBookmarkedStateProvider(mangaId: widget.modelManga!.id!));
|
||||
final filterDownloaded = ref.watch(
|
||||
chapterFilterDownloadedStateProvider(mangaId: widget.modelManga!.id!));
|
||||
final sortChapter =
|
||||
ref.watch(reverseChapterStateProvider(mangaId: widget.modelManga!.id!))[
|
||||
'index'] as int;
|
||||
final chapters =
|
||||
ref.watch(getChaptersStreamProvider(mangaId: widget.modelManga!.id!));
|
||||
return NotificationListener<UserScrollNotification>(
|
||||
onNotification: (notification) {
|
||||
if (notification.direction == ScrollDirection.forward) {
|
||||
|
|
@ -72,278 +92,313 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
}
|
||||
return true;
|
||||
},
|
||||
child: Scaffold(
|
||||
extendBodyBehindAppBar: true,
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size.fromHeight(AppBar().preferredSize.height),
|
||||
child: Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final isNotFiltering = ref
|
||||
.read(chapterFilterResultStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.isNotFiltering();
|
||||
final isLongPressed = ref.watch(isLongPressedStateProvider);
|
||||
final chapterNameList =
|
||||
ref.watch(chapterIdsListStateProvider);
|
||||
return isLongPressed
|
||||
? Container(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
child: AppBar(
|
||||
title: Text(chapterNameList.length.toString()),
|
||||
backgroundColor:
|
||||
primaryColor(context).withOpacity(0.2),
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
child: chapters.when(
|
||||
data: (data) {
|
||||
List<ModelChapters> chapterList = data
|
||||
.where((element) => filterUnread == 1
|
||||
? element.isRead == false
|
||||
: filterUnread == 2
|
||||
? element.isRead == true
|
||||
: true)
|
||||
.where((element) => filterBookmarked == 1
|
||||
? element.isBookmarked == true
|
||||
: filterBookmarked == 2
|
||||
? element.isBookmarked == false
|
||||
: true)
|
||||
.where((element) {
|
||||
final modelChapDownload = ref
|
||||
.watch(hiveBoxMangaDownloadsProvider)
|
||||
.get("${element.mangaId}/${element.id}", defaultValue: null);
|
||||
return filterDownloaded == 1
|
||||
? modelChapDownload != null &&
|
||||
modelChapDownload.isDownload == true
|
||||
: filterDownloaded == 2
|
||||
? !(modelChapDownload != null &&
|
||||
modelChapDownload.isDownload == true)
|
||||
: true;
|
||||
}).toList();
|
||||
List<ModelChapters> chapters =
|
||||
sortChapter == 1 ? chapterList.reversed.toList() : chapterList;
|
||||
if (sortChapter == 0) {
|
||||
chapters.sort(
|
||||
(a, b) {
|
||||
return a.scanlator!.compareTo(b.scanlator!) |
|
||||
a.dateUpload!.compareTo(b.dateUpload!);
|
||||
},
|
||||
);
|
||||
} else if (sortChapter == 2) {
|
||||
chapters.sort(
|
||||
(a, b) {
|
||||
return a.dateUpload!.compareTo(b.dateUpload!);
|
||||
},
|
||||
);
|
||||
}
|
||||
return _buildWidget(
|
||||
chapters: chapters,
|
||||
reverse: reverse,
|
||||
chapterNameList: chapterNameList,
|
||||
isLongPressed: isLongPressed);
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return _buildWidget(
|
||||
chapters: widget.modelManga!.chapters.toList(),
|
||||
reverse: reverse,
|
||||
chapterNameList: chapterNameList,
|
||||
isLongPressed: isLongPressed);
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
Widget _buildWidget(
|
||||
{required List<ModelChapters> chapters,
|
||||
required bool reverse,
|
||||
required List<ModelChapters> chapterNameList,
|
||||
required bool isLongPressed}) {
|
||||
return Scaffold(
|
||||
extendBodyBehindAppBar: true,
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size.fromHeight(AppBar().preferredSize.height),
|
||||
child: Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final isNotFiltering = ref.watch(
|
||||
chapterFilterResultStateProvider(
|
||||
mangaId: widget.modelManga!.id!));
|
||||
final isLongPressed = ref.watch(isLongPressedStateProvider);
|
||||
// final chapterNameList = ref.watch(chapterIdsListStateProvider);
|
||||
return isLongPressed
|
||||
? Container(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
child: AppBar(
|
||||
title: Text(chapterNameList.length.toString()),
|
||||
backgroundColor:
|
||||
primaryColor(context).withOpacity(0.2),
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider.notifier)
|
||||
.clear();
|
||||
|
||||
ref
|
||||
.read(isLongPressedStateProvider.notifier)
|
||||
.update(!isLongPressed);
|
||||
},
|
||||
icon: const Icon(Icons.clear)),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
for (var chapter in chapters) {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider
|
||||
.notifier)
|
||||
.clear();
|
||||
|
||||
.selectAll(chapter);
|
||||
}
|
||||
},
|
||||
icon: const Icon(Icons.select_all)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
if (chapters.length ==
|
||||
chapterNameList.length) {
|
||||
for (var chapter in chapters) {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider
|
||||
.notifier)
|
||||
.selectSome(chapter);
|
||||
}
|
||||
ref
|
||||
.read(
|
||||
isLongPressedStateProvider.notifier)
|
||||
.update(!isLongPressed);
|
||||
},
|
||||
icon: const Icon(Icons.clear)),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
for (var chapter
|
||||
in widget.modelManga!.chapters) {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider
|
||||
.notifier)
|
||||
.selectAll(chapter);
|
||||
}
|
||||
},
|
||||
icon: const Icon(Icons.select_all)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
if (widget.modelManga!.chapters.length ==
|
||||
chapterNameList.length) {
|
||||
for (var chapter
|
||||
in widget.modelManga!.chapters) {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider
|
||||
.notifier)
|
||||
.selectSome(chapter);
|
||||
}
|
||||
ref
|
||||
.read(isLongPressedStateProvider
|
||||
.notifier)
|
||||
.update(false);
|
||||
} else {
|
||||
for (var chapter
|
||||
in widget.modelManga!.chapters) {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider
|
||||
.notifier)
|
||||
.selectSome(chapter);
|
||||
}
|
||||
}
|
||||
},
|
||||
icon:
|
||||
const Icon(Icons.flip_to_back_rounded)),
|
||||
],
|
||||
),
|
||||
)
|
||||
: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
top: 0,
|
||||
child: Stack(
|
||||
children: [
|
||||
cachedNetworkImage(
|
||||
headers: headers(
|
||||
widget.modelManga!.source!),
|
||||
imageUrl:
|
||||
widget.modelManga!.imageUrl!,
|
||||
width: mediaWidth(context, 1),
|
||||
height: 410,
|
||||
fit: BoxFit.cover),
|
||||
Container(
|
||||
width: mediaWidth(context, 1),
|
||||
height: 465,
|
||||
color: Theme.of(context)
|
||||
.scaffoldBackgroundColor
|
||||
.withOpacity(0.9),
|
||||
),
|
||||
],
|
||||
)),
|
||||
AppBar(
|
||||
title: ref.watch(offetProvider) > 200
|
||||
? Text(
|
||||
widget.modelManga!.name!,
|
||||
style: const TextStyle(fontSize: 17),
|
||||
)
|
||||
: null,
|
||||
backgroundColor: ref.watch(offetProvider) == 0.0
|
||||
? Colors.transparent
|
||||
: Theme.of(context).scaffoldBackgroundColor,
|
||||
actions: [
|
||||
IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.download_outlined,
|
||||
)),
|
||||
IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {
|
||||
_showDraggableMenu();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.filter_list_sharp,
|
||||
color: isNotFiltering
|
||||
? null
|
||||
: Colors.yellow,
|
||||
)),
|
||||
PopupMenuButton(
|
||||
itemBuilder: (context) {
|
||||
return [
|
||||
if (widget.modelManga!.favorite)
|
||||
const PopupMenuItem<int>(
|
||||
value: 0,
|
||||
child: Text("Edit categories")),
|
||||
if (widget.modelManga!.favorite)
|
||||
const PopupMenuItem<int>(
|
||||
value: 0,
|
||||
child: Text("Migrate")),
|
||||
const PopupMenuItem<int>(
|
||||
value: 0, child: Text("Share")),
|
||||
];
|
||||
},
|
||||
onSelected: (value) {}),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
)),
|
||||
body: SafeArea(
|
||||
child: DraggableScrollbar(
|
||||
heightScrollThumb: 48.0,
|
||||
backgroundColor: primaryColor(context),
|
||||
scrollThumbBuilder: (backgroundColor, thumbAnimation,
|
||||
labelAnimation, height,
|
||||
{labelConstraints, labelText}) {
|
||||
return FadeTransition(
|
||||
opacity: thumbAnimation,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: backgroundColor,
|
||||
borderRadius: BorderRadius.circular(20)),
|
||||
height: height,
|
||||
width: 8.0,
|
||||
.update(false);
|
||||
} else {
|
||||
for (var chapter in chapters) {
|
||||
ref
|
||||
.read(chapterIdsListStateProvider
|
||||
.notifier)
|
||||
.selectSome(chapter);
|
||||
}
|
||||
}
|
||||
},
|
||||
icon: const Icon(Icons.flip_to_back_rounded)),
|
||||
],
|
||||
),
|
||||
)
|
||||
: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
top: 0,
|
||||
child: Stack(
|
||||
children: [
|
||||
cachedNetworkImage(
|
||||
headers:
|
||||
headers(widget.modelManga!.source!),
|
||||
imageUrl: widget.modelManga!.imageUrl!,
|
||||
width: mediaWidth(context, 1),
|
||||
height: 410,
|
||||
fit: BoxFit.cover),
|
||||
Container(
|
||||
width: mediaWidth(context, 1),
|
||||
height: 465,
|
||||
color: Theme.of(context)
|
||||
.scaffoldBackgroundColor
|
||||
.withOpacity(0.9),
|
||||
),
|
||||
],
|
||||
)),
|
||||
AppBar(
|
||||
title: ref.watch(offetProvider) > 200
|
||||
? Text(
|
||||
widget.modelManga!.name!,
|
||||
style: const TextStyle(fontSize: 17),
|
||||
)
|
||||
: null,
|
||||
backgroundColor: ref.watch(offetProvider) == 0.0
|
||||
? Colors.transparent
|
||||
: Theme.of(context).scaffoldBackgroundColor,
|
||||
actions: [
|
||||
IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.download_outlined,
|
||||
)),
|
||||
IconButton(
|
||||
splashRadius: 20,
|
||||
onPressed: () {
|
||||
_showDraggableMenu();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.filter_list_sharp,
|
||||
color:
|
||||
isNotFiltering ? null : Colors.yellow,
|
||||
)),
|
||||
PopupMenuButton(
|
||||
itemBuilder: (context) {
|
||||
return [
|
||||
if (widget.modelManga!.favorite)
|
||||
const PopupMenuItem<int>(
|
||||
value: 0,
|
||||
child: Text("Edit categories")),
|
||||
if (widget.modelManga!.favorite)
|
||||
const PopupMenuItem<int>(
|
||||
value: 0, child: Text("Migrate")),
|
||||
const PopupMenuItem<int>(
|
||||
value: 0, child: Text("Share")),
|
||||
];
|
||||
},
|
||||
onSelected: (value) {}),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
scrollbarTimeToFade: const Duration(seconds: 2),
|
||||
},
|
||||
)),
|
||||
body: SafeArea(
|
||||
child: DraggableScrollbar(
|
||||
heightScrollThumb: 48.0,
|
||||
backgroundColor: primaryColor(context),
|
||||
scrollThumbBuilder:
|
||||
(backgroundColor, thumbAnimation, labelAnimation, height,
|
||||
{labelConstraints, labelText}) {
|
||||
return FadeTransition(
|
||||
opacity: thumbAnimation,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: backgroundColor,
|
||||
borderRadius: BorderRadius.circular(20)),
|
||||
height: height,
|
||||
width: 8.0,
|
||||
),
|
||||
);
|
||||
},
|
||||
scrollbarTimeToFade: const Duration(seconds: 2),
|
||||
controller: _scrollController,
|
||||
child: ListView.builder(
|
||||
controller: _scrollController,
|
||||
child: ListView.builder(
|
||||
controller: _scrollController,
|
||||
padding: const EdgeInsets.only(top: 0, bottom: 60),
|
||||
itemCount: widget.listLength,
|
||||
itemBuilder: (context, index) {
|
||||
int finalIndex = index - 1;
|
||||
if (index == 0) {
|
||||
return _bodyContainer();
|
||||
}
|
||||
|
||||
int reverseIndex =
|
||||
widget.modelManga!.chapters.length -
|
||||
widget.modelManga!.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.indexOf(widget.modelManga!.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()[finalIndex]) -
|
||||
1;
|
||||
final indexx = reverse ? reverseIndex : finalIndex;
|
||||
List<ModelChapters> chapters = reverse
|
||||
? widget.modelManga!.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
: widget.modelManga!.chapters.toList();
|
||||
|
||||
return ChapterListTileWidget(
|
||||
modelManga: widget.modelManga!,
|
||||
chapter: chapters[indexx],
|
||||
chapterNameList: chapterNameList,
|
||||
chapterIndex: indexx,
|
||||
);
|
||||
}))),
|
||||
bottomNavigationBar: AnimatedContainer(
|
||||
curve: Curves.easeIn,
|
||||
decoration: BoxDecoration(
|
||||
color: primaryColor(context).withOpacity(0.2),
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(20),
|
||||
topRight: Radius.circular(20))),
|
||||
duration: const Duration(milliseconds: 100),
|
||||
height: isLongPressed ? 70 : 0,
|
||||
width: mediaWidth(context, 1),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 70,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterSetIsBookmarkStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.set();
|
||||
},
|
||||
child: const Icon(Icons.bookmark_add_outlined)),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 70,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterSetIsReadStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.set();
|
||||
},
|
||||
child: const Icon(Icons.done_all_sharp)),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 70,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterSetDownloadStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.set();
|
||||
},
|
||||
child: const Icon(Icons.download_outlined)),
|
||||
),
|
||||
)
|
||||
],
|
||||
padding: const EdgeInsets.only(top: 0, bottom: 60),
|
||||
itemCount: chapters.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
int finalIndex = index - 1;
|
||||
if (index == 0) {
|
||||
return _bodyContainer(chapterLength: chapters.length);
|
||||
}
|
||||
int reverseIndex = chapters.length -
|
||||
chapters.reversed
|
||||
.toList()
|
||||
.indexOf(chapters.reversed.toList()[finalIndex]) -
|
||||
1;
|
||||
final indexx = reverse ? reverseIndex : finalIndex;
|
||||
return ChapterListTileWidget(
|
||||
modelManga: widget.modelManga!,
|
||||
chapter: chapters[indexx],
|
||||
chapterNameList: chapterNameList,
|
||||
chapterIndex: indexx,
|
||||
);
|
||||
}))),
|
||||
bottomNavigationBar: AnimatedContainer(
|
||||
curve: Curves.easeIn,
|
||||
decoration: BoxDecoration(
|
||||
color: primaryColor(context).withOpacity(0.2),
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(20), topRight: Radius.circular(20))),
|
||||
duration: const Duration(milliseconds: 100),
|
||||
height: isLongPressed ? 70 : 0,
|
||||
width: mediaWidth(context, 1),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 70,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
elevation: 0, backgroundColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterSetIsBookmarkStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.set();
|
||||
},
|
||||
child: const Icon(Icons.bookmark_add_outlined)),
|
||||
),
|
||||
),
|
||||
)));
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 70,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
elevation: 0, backgroundColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterSetIsReadStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.set();
|
||||
},
|
||||
child: const Icon(Icons.done_all_sharp)),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 70,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
elevation: 0, backgroundColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
ref
|
||||
.read(chapterSetDownloadStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
.notifier)
|
||||
.set();
|
||||
},
|
||||
child: const Icon(Icons.download_outlined)),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
_showDraggableMenu() {
|
||||
|
|
@ -381,13 +436,13 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
label: "Downloaded",
|
||||
type: ref.watch(
|
||||
chapterFilterDownloadedStateProvider(
|
||||
modelManga: widget.modelManga!)),
|
||||
mangaId: widget.modelManga!.id!)),
|
||||
onTap: () {
|
||||
ref
|
||||
.read(
|
||||
chapterFilterDownloadedStateProvider(
|
||||
modelManga:
|
||||
widget.modelManga!)
|
||||
mangaId:
|
||||
widget.modelManga!.id!)
|
||||
.notifier)
|
||||
.update();
|
||||
}),
|
||||
|
|
@ -395,11 +450,11 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
label: "Unread",
|
||||
type: ref.watch(
|
||||
chapterFilterUnreadStateProvider(
|
||||
modelManga: widget.modelManga!)),
|
||||
mangaId: widget.modelManga!.id!)),
|
||||
onTap: () {
|
||||
ref
|
||||
.read(chapterFilterUnreadStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
mangaId: widget.modelManga!.id!)
|
||||
.notifier)
|
||||
.update();
|
||||
}),
|
||||
|
|
@ -407,13 +462,13 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
label: "Bookmarked",
|
||||
type: ref.watch(
|
||||
chapterFilterBookmarkedStateProvider(
|
||||
modelManga: widget.modelManga!)),
|
||||
mangaId: widget.modelManga!.id!)),
|
||||
onTap: () {
|
||||
ref
|
||||
.read(
|
||||
chapterFilterBookmarkedStateProvider(
|
||||
modelManga:
|
||||
widget.modelManga!)
|
||||
mangaId:
|
||||
widget.modelManga!.id!)
|
||||
.notifier)
|
||||
.update();
|
||||
}),
|
||||
|
|
@ -423,12 +478,12 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
Consumer(builder: (context, ref, chil) {
|
||||
final reverse = ref
|
||||
.read(reverseChapterStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
mangaId: widget.modelManga!.id!)
|
||||
.notifier)
|
||||
.isReverse();
|
||||
final reverseChapter = ref.watch(
|
||||
reverseChapterStateProvider(
|
||||
modelManga: widget.modelManga!));
|
||||
mangaId: widget.modelManga!.id!));
|
||||
return Column(
|
||||
children: [
|
||||
for (var i = 0; i < 3; i++)
|
||||
|
|
@ -442,7 +497,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
onTap: () {
|
||||
ref
|
||||
.read(reverseChapterStateProvider(
|
||||
modelManga: widget.modelManga!)
|
||||
mangaId: widget.modelManga!.id!)
|
||||
.notifier)
|
||||
.set(i);
|
||||
},
|
||||
|
|
@ -481,7 +536,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
);
|
||||
}
|
||||
|
||||
Widget _bodyContainer() {
|
||||
Widget _bodyContainer({required int chapterLength}) {
|
||||
return Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
|
|
@ -621,7 +676,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 8),
|
||||
child: Text(
|
||||
'${(widget.listLength - 1)} chapters',
|
||||
'$chapterLength chapters',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -59,130 +59,130 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
|||
Widget build(BuildContext context) {
|
||||
_checkFavorite(widget.modelManga.favorite);
|
||||
return Scaffold(
|
||||
// floatingActionButton: ref.watch(isLongPressedStateProvider) == true
|
||||
// ? null
|
||||
// : widget.modelManga.chapters!.isNotEmpty
|
||||
// ? ValueListenableBuilder<Box>(
|
||||
// valueListenable:
|
||||
// ref.watch(hiveBoxMangaInfoProvider).listenable(),
|
||||
// builder: (context, value, child) {
|
||||
// final entries = value.get(
|
||||
// "${widget.modelManga.lang}-${widget.modelManga.source}/${widget.modelManga.name}-chapter_index",
|
||||
// defaultValue: '');
|
||||
// final incognitoMode = ref.watch(incognitoModeStateProvider);
|
||||
floatingActionButton: ref.watch(isLongPressedStateProvider) == true
|
||||
? null
|
||||
: widget.modelManga.chapters.isNotEmpty
|
||||
? ValueListenableBuilder<Box>(
|
||||
valueListenable:
|
||||
ref.watch(hiveBoxMangaInfoProvider).listenable(),
|
||||
builder: (context, value, child) {
|
||||
final entries = value.get(
|
||||
"${widget.modelManga.lang}-${widget.modelManga.source}/${widget.modelManga.name}-chapter_index",
|
||||
defaultValue: '');
|
||||
final incognitoMode = ref.watch(incognitoModeStateProvider);
|
||||
|
||||
// if (entries.isNotEmpty && !incognitoMode) {
|
||||
// return Consumer(builder: (context, ref, child) {
|
||||
// final isExtended = ref.watch(isExtendedStateProvider);
|
||||
// return Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.end,
|
||||
// children: [
|
||||
// AnimatedContainer(
|
||||
// height: 55,
|
||||
// width: !isExtended ? 63 : 130,
|
||||
// duration: const Duration(milliseconds: 200),
|
||||
// curve: Curves.easeIn,
|
||||
// child: ElevatedButton(
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// backgroundColor: primaryColor(context),
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(15))),
|
||||
// onPressed: () {
|
||||
// pushMangaReaderView(
|
||||
// context: context,
|
||||
// modelManga: widget.modelManga,
|
||||
// index: int.parse(entries.toString()));
|
||||
// },
|
||||
// child: Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
// children: [
|
||||
// const Icon(
|
||||
// Icons.play_arrow,
|
||||
// color: Colors.white,
|
||||
// ),
|
||||
// AnimatedContainer(
|
||||
// curve: Curves.easeIn,
|
||||
// width: !isExtended ? 0 : 8,
|
||||
// duration:
|
||||
// const Duration(milliseconds: 500),
|
||||
// ),
|
||||
// AnimatedContainer(
|
||||
// curve: Curves.easeIn,
|
||||
// width: !isExtended ? 0 : 60,
|
||||
// duration:
|
||||
// const Duration(milliseconds: 200),
|
||||
// child: const Text(
|
||||
// "Continue",
|
||||
// overflow: TextOverflow.ellipsis,
|
||||
// style: TextStyle(
|
||||
// fontSize: 14, color: Colors.white),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// });
|
||||
// }
|
||||
// return Consumer(builder: (context, ref, child) {
|
||||
// final isExtended = ref.watch(isExtendedStateProvider);
|
||||
// return Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.end,
|
||||
// children: [
|
||||
// AnimatedContainer(
|
||||
// height: 55,
|
||||
// width: !isExtended ? 60 : 105,
|
||||
// duration: const Duration(milliseconds: 300),
|
||||
// curve: Curves.easeIn,
|
||||
// child: ElevatedButton(
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// backgroundColor: primaryColor(context),
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(15))),
|
||||
// onPressed: () {
|
||||
// pushMangaReaderView(
|
||||
// context: context,
|
||||
// modelManga: widget.modelManga,
|
||||
// index:
|
||||
// widget.modelManga.chapters!.length - 1);
|
||||
// },
|
||||
// child: Row(
|
||||
// children: [
|
||||
// const Icon(
|
||||
// Icons.play_arrow,
|
||||
// color: Colors.white,
|
||||
// ),
|
||||
// AnimatedContainer(
|
||||
// curve: Curves.easeIn,
|
||||
// width: !isExtended ? 0 : 5,
|
||||
// duration: const Duration(milliseconds: 300),
|
||||
// ),
|
||||
// AnimatedContainer(
|
||||
// curve: Curves.easeIn,
|
||||
// width: !isExtended ? 0 : 40,
|
||||
// duration: const Duration(milliseconds: 300),
|
||||
// child: const Text(
|
||||
// "Read",
|
||||
// overflow: TextOverflow.ellipsis,
|
||||
// style: TextStyle(
|
||||
// fontSize: 14,
|
||||
// color: Colors.white,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// });
|
||||
// },
|
||||
// )
|
||||
// : null,
|
||||
if (entries.isNotEmpty && !incognitoMode) {
|
||||
return Consumer(builder: (context, ref, child) {
|
||||
final isExtended = ref.watch(isExtendedStateProvider);
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
AnimatedContainer(
|
||||
height: 55,
|
||||
width: !isExtended ? 63 : 130,
|
||||
duration: const Duration(milliseconds: 200),
|
||||
curve: Curves.easeIn,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: primaryColor(context),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
BorderRadius.circular(15))),
|
||||
onPressed: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
modelManga: widget.modelManga,
|
||||
index: int.parse(entries.toString()));
|
||||
},
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.play_arrow,
|
||||
color: Colors.white,
|
||||
),
|
||||
AnimatedContainer(
|
||||
curve: Curves.easeIn,
|
||||
width: !isExtended ? 0 : 8,
|
||||
duration:
|
||||
const Duration(milliseconds: 500),
|
||||
),
|
||||
AnimatedContainer(
|
||||
curve: Curves.easeIn,
|
||||
width: !isExtended ? 0 : 60,
|
||||
duration:
|
||||
const Duration(milliseconds: 200),
|
||||
child: const Text(
|
||||
"Continue",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 14, color: Colors.white),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
return Consumer(builder: (context, ref, child) {
|
||||
final isExtended = ref.watch(isExtendedStateProvider);
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
AnimatedContainer(
|
||||
height: 55,
|
||||
width: !isExtended ? 60 : 105,
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.easeIn,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: primaryColor(context),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(15))),
|
||||
onPressed: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
modelManga: widget.modelManga,
|
||||
index:
|
||||
widget.modelManga.chapters.length - 1);
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.play_arrow,
|
||||
color: Colors.white,
|
||||
),
|
||||
AnimatedContainer(
|
||||
curve: Curves.easeIn,
|
||||
width: !isExtended ? 0 : 5,
|
||||
duration: const Duration(milliseconds: 300),
|
||||
),
|
||||
AnimatedContainer(
|
||||
curve: Curves.easeIn,
|
||||
width: !isExtended ? 0 : 40,
|
||||
duration: const Duration(milliseconds: 300),
|
||||
child: const Text(
|
||||
"Read",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
},
|
||||
)
|
||||
: null,
|
||||
body: MangaDetailView(
|
||||
titleDescription: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
|
@ -287,85 +287,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
|||
),
|
||||
),
|
||||
),
|
||||
|
||||
// ValueListenableBuilder<Box<ModelManga>>(
|
||||
// valueListenable: ref.watch(hiveBoxMangaProvider).listenable(),
|
||||
// builder: (context, value, child) {
|
||||
// final entries = value.values
|
||||
// .where((element) =>
|
||||
// '${element.lang}-${element.link}' ==
|
||||
// '${widget.modelManga.lang}-${widget.modelManga.link}')
|
||||
// .toList();
|
||||
// if (entries.isNotEmpty) {
|
||||
// if (entries[0].favorite == true) {
|
||||
// _checkFavorite(true);
|
||||
|
||||
// return ;
|
||||
// } else {
|
||||
// _checkFavorite(false);
|
||||
// return ;
|
||||
// }
|
||||
// }
|
||||
// return SizedBox(
|
||||
// width: mediaWidth(context, 0.4),
|
||||
// child: ElevatedButton(
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
// elevation: 0),
|
||||
// onPressed: () {
|
||||
// final checkCategoryList = ref
|
||||
// .watch(hiveBoxCategoriesProvider)
|
||||
// .values
|
||||
// .toList()
|
||||
// .isNotEmpty;
|
||||
// if (checkCategoryList) {
|
||||
// _openCategory(manga);
|
||||
// } else {
|
||||
// _setFavorite(true);
|
||||
// final model = ModelManga(
|
||||
// imageUrl: widget.modelManga.imageUrl,
|
||||
// name: widget.modelManga.name,
|
||||
// genre: widget.modelManga.genre,
|
||||
// author: widget.modelManga.author,
|
||||
// status: widget.modelManga.status,
|
||||
// description: widget.modelManga.description,
|
||||
// favorite: true,
|
||||
// link: widget.modelManga.link,
|
||||
// source: widget.modelManga.source,
|
||||
// lang: widget.modelManga.lang,
|
||||
// dateAdded: DateTime.now().microsecondsSinceEpoch,
|
||||
// lastUpdate: DateTime.now().microsecondsSinceEpoch,
|
||||
// chapters: widget.modelManga.chapters,
|
||||
// categories: [],
|
||||
// lastRead: '');
|
||||
// manga.put(
|
||||
// '${widget.modelManga.lang}-${widget.modelManga.link}',
|
||||
// model);
|
||||
// }
|
||||
// },
|
||||
// child: Column(
|
||||
// children: [
|
||||
// Icon(
|
||||
// Icons.favorite_border_rounded,
|
||||
// size: 22,
|
||||
// color: secondaryColor(context),
|
||||
// ),
|
||||
// const SizedBox(
|
||||
// height: 4,
|
||||
// ),
|
||||
// Text(
|
||||
// 'Add to library',
|
||||
// style: TextStyle(
|
||||
// color: secondaryColor(context), fontSize: 13),
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
modelManga: widget.modelManga,
|
||||
listLength: widget.modelManga.chapters.length + 1,
|
||||
isExtended: (value) {
|
||||
ref.read(isExtendedStateProvider.notifier).update(value);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -11,23 +11,18 @@ import 'package:mangayomi/models/model_manga.dart';
|
|||
import 'package:mangayomi/providers/hive_provider.dart';
|
||||
import 'package:mangayomi/services/get_manga_detail.dart';
|
||||
import 'package:mangayomi/views/manga/detail/manga_details_view.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:mangayomi/views/manga/detail/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/views/widgets/error_text.dart';
|
||||
import 'package:mangayomi/views/widgets/progress_center.dart';
|
||||
|
||||
class MangaReaderDetail extends ConsumerStatefulWidget {
|
||||
final int idManga;
|
||||
const MangaReaderDetail({super.key, required this.idManga});
|
||||
final int mangaId;
|
||||
const MangaReaderDetail({super.key, required this.mangaId});
|
||||
|
||||
@override
|
||||
ConsumerState<MangaReaderDetail> createState() => _MangaReaderDetailState();
|
||||
}
|
||||
|
||||
final mangaa = StreamProvider.family<ModelManga?, int>((ref, id) async* {
|
||||
// final ddd = isar.modelMangas.filter().chapters((q) => q.isReadEqualTo(true)).build().watch();
|
||||
yield* isar.modelMangas.watchObject(id, fireImmediately: true);
|
||||
});
|
||||
|
||||
class _MangaReaderDetailState extends ConsumerState<MangaReaderDetail> {
|
||||
bool _isFavorite = false;
|
||||
@override
|
||||
|
|
@ -48,118 +43,76 @@ class _MangaReaderDetailState extends ConsumerState<MangaReaderDetail> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final mm = ref.watch(mangaa(widget.idManga));
|
||||
final manga =
|
||||
ref.watch(getMangaDetailStreamProvider(mangaId: widget.mangaId));
|
||||
return Scaffold(
|
||||
body: mm.when(
|
||||
data: (data) {
|
||||
// final mang = data.where((element) => element.id==widget.idManga).toList().first;
|
||||
return MangaDetailsView(
|
||||
modelManga: data!,
|
||||
isFavorite: (value) {
|
||||
setState(() {
|
||||
_isFavorite = value;
|
||||
});
|
||||
body: manga.when(
|
||||
data: (modelManga) {
|
||||
return RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
if (_isFavorite) {
|
||||
bool isOk = false;
|
||||
ref
|
||||
.watch(getMangaDetailProvider(
|
||||
imageUrl: modelManga.imageUrl!,
|
||||
lang: modelManga.lang!,
|
||||
title: modelManga.name!,
|
||||
source: modelManga.source!,
|
||||
url: modelManga.link!)
|
||||
.future)
|
||||
.then((value) async {
|
||||
if (value.chapters.isNotEmpty &&
|
||||
value.chapters.length > modelManga.chapters.length) {
|
||||
await isar.writeTxn(() async {
|
||||
int newChapsIndex =
|
||||
value.chapters.length - modelManga.chapters.length;
|
||||
for (var i = 0; i < newChapsIndex; i++) {
|
||||
final chapters = ModelChapters(
|
||||
name: value.chapters[i].name,
|
||||
url: value.chapters[i].url,
|
||||
dateUpload: value.chapters[i].dateUpload,
|
||||
isBookmarked: false,
|
||||
scanlator: value.chapters[i].scanlator,
|
||||
isRead: false,
|
||||
lastPageRead: '',
|
||||
mangaId: modelManga.id)
|
||||
..manga.value = modelManga;
|
||||
await isar.modelChapters.put(chapters);
|
||||
await chapters.manga.save();
|
||||
}
|
||||
});
|
||||
}
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
isOk = true;
|
||||
});
|
||||
}
|
||||
});
|
||||
await Future.doWhile(() async {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
if (isOk == true) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
},
|
||||
child: MangaDetailsView(
|
||||
modelManga: modelManga!,
|
||||
isFavorite: (value) {
|
||||
setState(() {
|
||||
_isFavorite = value;
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return Text("data");
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return Text("eeee");
|
||||
return const ProgressCenter();
|
||||
},
|
||||
)
|
||||
|
||||
// RefreshIndicator(
|
||||
// onRefresh: () async {
|
||||
// if (_isFavorite) {
|
||||
// // bool isOk = false;
|
||||
// // ref
|
||||
// // .watch(getMangaDetailProvider(
|
||||
// // imageUrl: widget.modelManga.imageUrl!,
|
||||
// // lang: widget.modelManga.lang!,
|
||||
// // title: widget.modelManga.name!,
|
||||
// // source: widget.modelManga.source!,
|
||||
// // url: widget.modelManga.link!)
|
||||
// // .future)
|
||||
// // .then((value) {
|
||||
// // if (value.chapters.isNotEmpty &&
|
||||
// // value.chapters.length > widget.modelManga.chapters!.length) {
|
||||
// // List<ModelChapters>? chapters = [];
|
||||
// // for (var chap in widget.modelManga.chapters!) {
|
||||
// // chapters.add(chap);
|
||||
// // }
|
||||
// // int newChapsSize =
|
||||
// // value.chapters.length - widget.modelManga.chapters!.length;
|
||||
// // for (var i = 0; i < newChapsSize; i++) {
|
||||
// // chapters.insert(i, value.chapters[i]);
|
||||
// // }
|
||||
// // final model = ModelManga(
|
||||
// // imageUrl: widget.modelManga.imageUrl,
|
||||
// // name: widget.modelManga.name,
|
||||
// // genre: widget.modelManga.genre,
|
||||
// // author: widget.modelManga.author,
|
||||
// // description: widget.modelManga.description,
|
||||
// // status: value.status,
|
||||
// // favorite: _isFavorite,
|
||||
// // link: widget.modelManga.link,
|
||||
// // source: widget.modelManga.source,
|
||||
// // lang: widget.modelManga.lang,
|
||||
// // dateAdded: widget.modelManga.dateAdded,
|
||||
// // lastUpdate: DateTime.now().microsecondsSinceEpoch,
|
||||
// // chapters: chapters,
|
||||
// // categories: widget.modelManga.categories,
|
||||
// // lastRead: widget.modelManga.lastRead);
|
||||
// // ref.watch(hiveBoxMangaProvider).put(
|
||||
// // '${widget.modelManga.lang}-${widget.modelManga.link}',
|
||||
// // model);
|
||||
// // }
|
||||
// // if (mounted) {
|
||||
// // setState(() {
|
||||
// // isOk = true;
|
||||
// // });
|
||||
// // }
|
||||
// // });
|
||||
// // await Future.doWhile(() async {
|
||||
// // await Future.delayed(const Duration(seconds: 1));
|
||||
// // if (isOk == true) {
|
||||
// // return false;
|
||||
// // }
|
||||
// // return true;
|
||||
// // });
|
||||
// }
|
||||
// },
|
||||
// child:
|
||||
|
||||
// // ValueListenableBuilder<ModelManga>(
|
||||
// // valueListenable: ref.watch(hiveBoxMangaProvider).listenable(),
|
||||
// // builder: (context, value, child) {
|
||||
// // final entries = value.values
|
||||
// // .where((element) =>
|
||||
// // '${element.lang}-${element.link}' ==
|
||||
// // '${widget.modelManga.lang}-${widget.modelManga.link}')
|
||||
// // .toList();
|
||||
// // if (entries.isNotEmpty) {
|
||||
// // return MangaDetailsView(
|
||||
// // modelManga: entries[0],
|
||||
// // isFavorite: (value) {
|
||||
// // setState(() {
|
||||
// // _isFavorite = value;
|
||||
// // });
|
||||
// // },
|
||||
// // );
|
||||
// // }
|
||||
// // return MangaDetailsView(
|
||||
// // modelManga: widget.modelManga,
|
||||
// // isFavorite: (value) {
|
||||
// // setState(() {
|
||||
// // _isFavorite = value;
|
||||
// // });
|
||||
// // },
|
||||
// // );
|
||||
// // },
|
||||
// // ),
|
||||
// ),
|
||||
);
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
24
lib/views/manga/detail/models/chapter_filter.dart
Normal file
24
lib/views/manga/detail/models/chapter_filter.dart
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/models/model_manga.dart';
|
||||
part 'chapter_filter.g.dart';
|
||||
|
||||
@collection
|
||||
@Name("ChaptersFilter")
|
||||
class ChaptersFilter {
|
||||
Id? id;
|
||||
|
||||
int? downloaded;
|
||||
|
||||
int? unread;
|
||||
|
||||
int? bookmarked;
|
||||
|
||||
final manga = IsarLink<ModelManga>();
|
||||
|
||||
ChaptersFilter({
|
||||
this.id = Isar.autoIncrement,
|
||||
this.downloaded = 0,
|
||||
this.unread = 0,
|
||||
this.bookmarked = 0,
|
||||
});
|
||||
}
|
||||
671
lib/views/manga/detail/models/chapter_filter.g.dart
Normal file
671
lib/views/manga/detail/models/chapter_filter.g.dart
Normal file
|
|
@ -0,0 +1,671 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'chapter_filter.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// IsarCollectionGenerator
|
||||
// **************************************************************************
|
||||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
|
||||
|
||||
extension GetChaptersFilterCollection on Isar {
|
||||
IsarCollection<ChaptersFilter> get chaptersFilters => this.collection();
|
||||
}
|
||||
|
||||
const ChaptersFilterSchema = CollectionSchema(
|
||||
name: r'ChaptersFilter',
|
||||
id: -1016921506623071712,
|
||||
properties: {
|
||||
r'bookmarked': PropertySchema(
|
||||
id: 0,
|
||||
name: r'bookmarked',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'downloaded': PropertySchema(
|
||||
id: 1,
|
||||
name: r'downloaded',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'unread': PropertySchema(
|
||||
id: 2,
|
||||
name: r'unread',
|
||||
type: IsarType.long,
|
||||
)
|
||||
},
|
||||
estimateSize: _chaptersFilterEstimateSize,
|
||||
serialize: _chaptersFilterSerialize,
|
||||
deserialize: _chaptersFilterDeserialize,
|
||||
deserializeProp: _chaptersFilterDeserializeProp,
|
||||
idName: r'id',
|
||||
indexes: {},
|
||||
links: {
|
||||
r'manga': LinkSchema(
|
||||
id: -1307930859387237185,
|
||||
name: r'manga',
|
||||
target: r'Manga',
|
||||
single: true,
|
||||
)
|
||||
},
|
||||
embeddedSchemas: {},
|
||||
getId: _chaptersFilterGetId,
|
||||
getLinks: _chaptersFilterGetLinks,
|
||||
attach: _chaptersFilterAttach,
|
||||
version: '3.1.0+1',
|
||||
);
|
||||
|
||||
int _chaptersFilterEstimateSize(
|
||||
ChaptersFilter object,
|
||||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
var bytesCount = offsets.last;
|
||||
return bytesCount;
|
||||
}
|
||||
|
||||
void _chaptersFilterSerialize(
|
||||
ChaptersFilter object,
|
||||
IsarWriter writer,
|
||||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
writer.writeLong(offsets[0], object.bookmarked);
|
||||
writer.writeLong(offsets[1], object.downloaded);
|
||||
writer.writeLong(offsets[2], object.unread);
|
||||
}
|
||||
|
||||
ChaptersFilter _chaptersFilterDeserialize(
|
||||
Id id,
|
||||
IsarReader reader,
|
||||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
final object = ChaptersFilter(
|
||||
bookmarked: reader.readLongOrNull(offsets[0]),
|
||||
downloaded: reader.readLongOrNull(offsets[1]),
|
||||
id: id,
|
||||
unread: reader.readLongOrNull(offsets[2]),
|
||||
);
|
||||
return object;
|
||||
}
|
||||
|
||||
P _chaptersFilterDeserializeProp<P>(
|
||||
IsarReader reader,
|
||||
int propertyId,
|
||||
int offset,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
switch (propertyId) {
|
||||
case 0:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
case 1:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
case 2:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
}
|
||||
}
|
||||
|
||||
Id _chaptersFilterGetId(ChaptersFilter object) {
|
||||
return object.id ?? Isar.autoIncrement;
|
||||
}
|
||||
|
||||
List<IsarLinkBase<dynamic>> _chaptersFilterGetLinks(ChaptersFilter object) {
|
||||
return [object.manga];
|
||||
}
|
||||
|
||||
void _chaptersFilterAttach(
|
||||
IsarCollection<dynamic> col, Id id, ChaptersFilter object) {
|
||||
object.id = id;
|
||||
object.manga.attach(col, col.isar.collection<ModelManga>(), r'manga', id);
|
||||
}
|
||||
|
||||
extension ChaptersFilterQueryWhereSort
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QWhere> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterWhere> anyId() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addWhereClause(const IdWhereClause.any());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQueryWhere
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QWhereClause> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterWhereClause> idEqualTo(
|
||||
Id id) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addWhereClause(IdWhereClause.between(
|
||||
lower: id,
|
||||
upper: id,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterWhereClause> idNotEqualTo(
|
||||
Id id) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
if (query.whereSort == Sort.asc) {
|
||||
return query
|
||||
.addWhereClause(
|
||||
IdWhereClause.lessThan(upper: id, includeUpper: false),
|
||||
)
|
||||
.addWhereClause(
|
||||
IdWhereClause.greaterThan(lower: id, includeLower: false),
|
||||
);
|
||||
} else {
|
||||
return query
|
||||
.addWhereClause(
|
||||
IdWhereClause.greaterThan(lower: id, includeLower: false),
|
||||
)
|
||||
.addWhereClause(
|
||||
IdWhereClause.lessThan(upper: id, includeUpper: false),
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterWhereClause> idGreaterThan(
|
||||
Id id,
|
||||
{bool include = false}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addWhereClause(
|
||||
IdWhereClause.greaterThan(lower: id, includeLower: include),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterWhereClause> idLessThan(
|
||||
Id id,
|
||||
{bool include = false}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addWhereClause(
|
||||
IdWhereClause.lessThan(upper: id, includeUpper: include),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterWhereClause> idBetween(
|
||||
Id lowerId,
|
||||
Id upperId, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addWhereClause(IdWhereClause.between(
|
||||
lower: lowerId,
|
||||
includeLower: includeLower,
|
||||
upper: upperId,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQueryFilter
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QFilterCondition> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
bookmarkedIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'bookmarked',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
bookmarkedIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'bookmarked',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
bookmarkedEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'bookmarked',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
bookmarkedGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'bookmarked',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
bookmarkedLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'bookmarked',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
bookmarkedBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'bookmarked',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
downloadedIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'downloaded',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
downloadedIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'downloaded',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
downloadedEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'downloaded',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
downloadedGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'downloaded',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
downloadedLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'downloaded',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
downloadedBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'downloaded',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
idIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'id',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
idIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'id',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition> idEqualTo(
|
||||
Id? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'id',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
idGreaterThan(
|
||||
Id? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'id',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
idLessThan(
|
||||
Id? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'id',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition> idBetween(
|
||||
Id? lower,
|
||||
Id? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'id',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
unreadIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'unread',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
unreadIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'unread',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
unreadEqualTo(int? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'unread',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
unreadGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'unread',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
unreadLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'unread',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
unreadBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'unread',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQueryObject
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QFilterCondition> {}
|
||||
|
||||
extension ChaptersFilterQueryLinks
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QFilterCondition> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition> manga(
|
||||
FilterQuery<ModelManga> q) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.link(q, r'manga');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterFilterCondition>
|
||||
mangaIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.linkLength(r'manga', 0, true, 0, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQuerySortBy
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QSortBy> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
sortByBookmarked() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'bookmarked', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
sortByBookmarkedDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'bookmarked', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
sortByDownloaded() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'downloaded', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
sortByDownloadedDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'downloaded', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy> sortByUnread() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'unread', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
sortByUnreadDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'unread', Sort.desc);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQuerySortThenBy
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QSortThenBy> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
thenByBookmarked() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'bookmarked', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
thenByBookmarkedDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'bookmarked', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
thenByDownloaded() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'downloaded', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
thenByDownloadedDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'downloaded', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy> thenById() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'id', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy> thenByIdDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'id', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy> thenByUnread() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'unread', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QAfterSortBy>
|
||||
thenByUnreadDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'unread', Sort.desc);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQueryWhereDistinct
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QDistinct> {
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QDistinct>
|
||||
distinctByBookmarked() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'bookmarked');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QDistinct>
|
||||
distinctByDownloaded() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'downloaded');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, ChaptersFilter, QDistinct> distinctByUnread() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'unread');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ChaptersFilterQueryProperty
|
||||
on QueryBuilder<ChaptersFilter, ChaptersFilter, QQueryProperty> {
|
||||
QueryBuilder<ChaptersFilter, int, QQueryOperations> idProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'id');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, int?, QQueryOperations> bookmarkedProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'bookmarked');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, int?, QQueryOperations> downloadedProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'downloaded');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ChaptersFilter, int?, QQueryOperations> unreadProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'unread');
|
||||
});
|
||||
}
|
||||
}
|
||||
31
lib/views/manga/detail/providers/isar_providers.dart
Normal file
31
lib/views/manga/detail/providers/isar_providers.dart
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/model_manga.dart';
|
||||
import 'package:mangayomi/views/manga/detail/models/chapter_filter.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'isar_providers.g.dart';
|
||||
|
||||
@riverpod
|
||||
Stream<ModelManga?> getMangaDetailStream(GetMangaDetailStreamRef ref,
|
||||
{required int mangaId}) async* {
|
||||
yield* isar.modelMangas.watchObject(mangaId, fireImmediately: true);
|
||||
}
|
||||
|
||||
@riverpod
|
||||
Stream<List<ModelChapters>> getChaptersStream(
|
||||
GetChaptersStreamRef ref, {
|
||||
required int mangaId,
|
||||
}) async* {
|
||||
yield* isar.modelChapters
|
||||
.filter()
|
||||
.mangaIdEqualTo(mangaId)
|
||||
.watch(fireImmediately: true);
|
||||
}
|
||||
|
||||
@riverpod
|
||||
Stream<ChaptersFilter?> getChaptersFilterStream(
|
||||
GetChaptersFilterStreamRef ref, {
|
||||
required int mangaId,
|
||||
}) async* {
|
||||
yield* isar.chaptersFilters.watchObject(mangaId, fireImmediately: true);
|
||||
}
|
||||
284
lib/views/manga/detail/providers/isar_providers.g.dart
Normal file
284
lib/views/manga/detail/providers/isar_providers.g.dart
Normal file
|
|
@ -0,0 +1,284 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'isar_providers.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getMangaDetailStreamHash() =>
|
||||
r'e5323174237e1a07497b683c59a88f4f3d74b492';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
_SystemHash._();
|
||||
|
||||
static int combine(int hash, int value) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + value);
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||
return hash ^ (hash >> 6);
|
||||
}
|
||||
|
||||
static int finish(int hash) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||
// ignore: parameter_assignments
|
||||
hash = hash ^ (hash >> 11);
|
||||
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||
}
|
||||
}
|
||||
|
||||
typedef GetMangaDetailStreamRef = AutoDisposeStreamProviderRef<ModelManga?>;
|
||||
|
||||
/// See also [getMangaDetailStream].
|
||||
@ProviderFor(getMangaDetailStream)
|
||||
const getMangaDetailStreamProvider = GetMangaDetailStreamFamily();
|
||||
|
||||
/// See also [getMangaDetailStream].
|
||||
class GetMangaDetailStreamFamily extends Family<AsyncValue<ModelManga?>> {
|
||||
/// See also [getMangaDetailStream].
|
||||
const GetMangaDetailStreamFamily();
|
||||
|
||||
/// See also [getMangaDetailStream].
|
||||
GetMangaDetailStreamProvider call({
|
||||
required int mangaId,
|
||||
}) {
|
||||
return GetMangaDetailStreamProvider(
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
GetMangaDetailStreamProvider getProviderOverride(
|
||||
covariant GetMangaDetailStreamProvider provider,
|
||||
) {
|
||||
return call(
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'getMangaDetailStreamProvider';
|
||||
}
|
||||
|
||||
/// See also [getMangaDetailStream].
|
||||
class GetMangaDetailStreamProvider
|
||||
extends AutoDisposeStreamProvider<ModelManga?> {
|
||||
/// See also [getMangaDetailStream].
|
||||
GetMangaDetailStreamProvider({
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
(ref) => getMangaDetailStream(
|
||||
ref,
|
||||
mangaId: mangaId,
|
||||
),
|
||||
from: getMangaDetailStreamProvider,
|
||||
name: r'getMangaDetailStreamProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$getMangaDetailStreamHash,
|
||||
dependencies: GetMangaDetailStreamFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
GetMangaDetailStreamFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is GetMangaDetailStreamProvider && other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
|
||||
String _$getChaptersStreamHash() => r'975919d4d4c67e8677bf47d81e2f2def812c1325';
|
||||
typedef GetChaptersStreamRef
|
||||
= AutoDisposeStreamProviderRef<List<ModelChapters>>;
|
||||
|
||||
/// See also [getChaptersStream].
|
||||
@ProviderFor(getChaptersStream)
|
||||
const getChaptersStreamProvider = GetChaptersStreamFamily();
|
||||
|
||||
/// See also [getChaptersStream].
|
||||
class GetChaptersStreamFamily extends Family<AsyncValue<List<ModelChapters>>> {
|
||||
/// See also [getChaptersStream].
|
||||
const GetChaptersStreamFamily();
|
||||
|
||||
/// See also [getChaptersStream].
|
||||
GetChaptersStreamProvider call({
|
||||
required int mangaId,
|
||||
}) {
|
||||
return GetChaptersStreamProvider(
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
GetChaptersStreamProvider getProviderOverride(
|
||||
covariant GetChaptersStreamProvider provider,
|
||||
) {
|
||||
return call(
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'getChaptersStreamProvider';
|
||||
}
|
||||
|
||||
/// See also [getChaptersStream].
|
||||
class GetChaptersStreamProvider
|
||||
extends AutoDisposeStreamProvider<List<ModelChapters>> {
|
||||
/// See also [getChaptersStream].
|
||||
GetChaptersStreamProvider({
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
(ref) => getChaptersStream(
|
||||
ref,
|
||||
mangaId: mangaId,
|
||||
),
|
||||
from: getChaptersStreamProvider,
|
||||
name: r'getChaptersStreamProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$getChaptersStreamHash,
|
||||
dependencies: GetChaptersStreamFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
GetChaptersStreamFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is GetChaptersStreamProvider && other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
|
||||
String _$getChaptersFilterStreamHash() =>
|
||||
r'a8ebf64e90477dd851f65a7f1e5134b5fd6ada1c';
|
||||
typedef GetChaptersFilterStreamRef
|
||||
= AutoDisposeStreamProviderRef<ChaptersFilter?>;
|
||||
|
||||
/// See also [getChaptersFilterStream].
|
||||
@ProviderFor(getChaptersFilterStream)
|
||||
const getChaptersFilterStreamProvider = GetChaptersFilterStreamFamily();
|
||||
|
||||
/// See also [getChaptersFilterStream].
|
||||
class GetChaptersFilterStreamFamily
|
||||
extends Family<AsyncValue<ChaptersFilter?>> {
|
||||
/// See also [getChaptersFilterStream].
|
||||
const GetChaptersFilterStreamFamily();
|
||||
|
||||
/// See also [getChaptersFilterStream].
|
||||
GetChaptersFilterStreamProvider call({
|
||||
required int mangaId,
|
||||
}) {
|
||||
return GetChaptersFilterStreamProvider(
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
GetChaptersFilterStreamProvider getProviderOverride(
|
||||
covariant GetChaptersFilterStreamProvider provider,
|
||||
) {
|
||||
return call(
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'getChaptersFilterStreamProvider';
|
||||
}
|
||||
|
||||
/// See also [getChaptersFilterStream].
|
||||
class GetChaptersFilterStreamProvider
|
||||
extends AutoDisposeStreamProvider<ChaptersFilter?> {
|
||||
/// See also [getChaptersFilterStream].
|
||||
GetChaptersFilterStreamProvider({
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
(ref) => getChaptersFilterStream(
|
||||
ref,
|
||||
mangaId: mangaId,
|
||||
),
|
||||
from: getChaptersFilterStreamProvider,
|
||||
name: r'getChaptersFilterStreamProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$getChaptersFilterStreamHash,
|
||||
dependencies: GetChaptersFilterStreamFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
GetChaptersFilterStreamFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is GetChaptersFilterStreamProvider && other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions
|
||||
|
|
@ -99,10 +99,9 @@ class IsExtendedState extends _$IsExtendedState {
|
|||
@riverpod
|
||||
class ReverseChapterState extends _$ReverseChapterState {
|
||||
@override
|
||||
dynamic build({required ModelManga modelManga}) {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-reverseChapterMap",
|
||||
defaultValue: {"reverse": false, "index": 0});
|
||||
dynamic build({required int mangaId}) {
|
||||
return ref.watch(hiveBoxSettingsProvider).get("$mangaId-reverseChapterMap",
|
||||
defaultValue: {"reverse": false, "index": 2});
|
||||
}
|
||||
|
||||
void update(bool reverse, int index) {
|
||||
|
|
@ -110,34 +109,31 @@ class ReverseChapterState extends _$ReverseChapterState {
|
|||
"reverse": state['index'] == index ? !reverse : reverse,
|
||||
"index": index
|
||||
};
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-reverseChapterMap", value);
|
||||
ref.watch(hiveBoxSettingsProvider).put("$mangaId-reverseChapterMap", value);
|
||||
state = value;
|
||||
}
|
||||
|
||||
void set(int index) {
|
||||
final reverse = ref
|
||||
.read(reverseChapterStateProvider(modelManga: modelManga).notifier)
|
||||
.read(reverseChapterStateProvider(mangaId: mangaId).notifier)
|
||||
.isReverse();
|
||||
final sortBySource =
|
||||
ref.watch(sortBySourceStateProvider(modelManga: modelManga));
|
||||
final sortBySource = ref.watch(sortBySourceStateProvider(mangaId: mangaId));
|
||||
final sortByChapterNumber =
|
||||
ref.watch(sortByChapterNumberStateProvider(modelManga: modelManga));
|
||||
ref.watch(sortByChapterNumberStateProvider(mangaId: mangaId));
|
||||
final sortByUploadDate =
|
||||
ref.watch(sortByUploadDateStateProvider(modelManga: modelManga));
|
||||
ref.watch(sortByUploadDateStateProvider(mangaId: mangaId));
|
||||
update(reverse, index);
|
||||
if (index == 0) {
|
||||
ref
|
||||
.read(sortBySourceStateProvider(modelManga: modelManga).notifier)
|
||||
.read(sortBySourceStateProvider(mangaId: mangaId).notifier)
|
||||
.update(!sortBySource);
|
||||
} else if (index == 1) {
|
||||
ref
|
||||
.read(
|
||||
sortByChapterNumberStateProvider(modelManga: modelManga).notifier)
|
||||
.read(sortByChapterNumberStateProvider(mangaId: mangaId).notifier)
|
||||
.update(!sortByChapterNumber);
|
||||
} else {
|
||||
ref
|
||||
.read(sortByUploadDateStateProvider(modelManga: modelManga).notifier)
|
||||
.read(sortByUploadDateStateProvider(mangaId: mangaId).notifier)
|
||||
.update(!sortByUploadDate);
|
||||
}
|
||||
}
|
||||
|
|
@ -150,85 +146,31 @@ class ReverseChapterState extends _$ReverseChapterState {
|
|||
@riverpod
|
||||
class ChapterFilterDownloadedState extends _$ChapterFilterDownloadedState {
|
||||
@override
|
||||
int build({required ModelManga modelManga}) {
|
||||
int build({required int mangaId}) {
|
||||
state = getType();
|
||||
return getType();
|
||||
}
|
||||
|
||||
int getType() {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-filterChapterDownload",
|
||||
defaultValue: 0);
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("$mangaId-filterChapterDownload", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-filterChapterDownload", type);
|
||||
ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.put("$mangaId-filterChapterDownload", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
ModelManga getData() {
|
||||
if (getType() == 1) {
|
||||
List<ModelChapters> chap = [];
|
||||
// chap = modelManga.chapters.where((element) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(element.name, defaultValue: null);
|
||||
// return modelChapDownload != null &&
|
||||
// modelChapDownload.isDownload == true;
|
||||
// }).toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
|
||||
return model;
|
||||
} else if (getType() == 2) {
|
||||
List<ModelChapters> chap = [];
|
||||
// chap = modelManga.chapters.where((element) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(element.name, defaultValue: null);
|
||||
// return !(modelChapDownload != null &&
|
||||
// modelChapDownload.isDownload == true);
|
||||
// }).toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
|
||||
return model;
|
||||
} else {
|
||||
return modelManga;
|
||||
}
|
||||
}
|
||||
|
||||
ModelManga update() {
|
||||
void update() {
|
||||
if (state == 0) {
|
||||
List<ModelChapters> chap = [];
|
||||
// chap = modelManga.chapters!.where((element) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(element.name, defaultValue: null);
|
||||
// return modelChapDownload != null &&
|
||||
// modelChapDownload.isDownload == true;
|
||||
// }).toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
setType(1);
|
||||
return model;
|
||||
} else if (state == 1) {
|
||||
List<ModelChapters> chap = [];
|
||||
// chap = modelManga.chapters!.where((element) {
|
||||
// final modelChapDownload = ref
|
||||
// .watch(hiveBoxMangaDownloadsProvider)
|
||||
// .get(element.name, defaultValue: null);
|
||||
// return !(modelChapDownload != null &&
|
||||
// modelChapDownload.isDownload == true);
|
||||
// }).toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
setType(2);
|
||||
return model;
|
||||
} else {
|
||||
setType(0);
|
||||
return modelManga;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -236,69 +178,31 @@ class ChapterFilterDownloadedState extends _$ChapterFilterDownloadedState {
|
|||
@riverpod
|
||||
class ChapterFilterUnreadState extends _$ChapterFilterUnreadState {
|
||||
@override
|
||||
int build({required ModelManga modelManga}) {
|
||||
int build({required int mangaId}) {
|
||||
state = getType();
|
||||
return getType();
|
||||
}
|
||||
|
||||
int getType() {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-filterChapterUnread",
|
||||
defaultValue: 0);
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("$mangaId-filterChapterUnread", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-filterChapterUnread", type);
|
||||
ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.put("$mangaId-filterChapterUnread", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
ModelManga getData() {
|
||||
if (getType() == 1) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isRead == false)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
|
||||
return model;
|
||||
} else if (getType() == 2) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isRead == true)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
|
||||
return model;
|
||||
} else {
|
||||
return modelManga;
|
||||
}
|
||||
}
|
||||
|
||||
ModelManga update() {
|
||||
void update() {
|
||||
if (state == 0) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isRead == false)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
setType(1);
|
||||
return model;
|
||||
} else if (state == 1) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isRead == false)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
setType(2);
|
||||
return model;
|
||||
} else {
|
||||
setType(0);
|
||||
return modelManga;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -306,68 +210,31 @@ class ChapterFilterUnreadState extends _$ChapterFilterUnreadState {
|
|||
@riverpod
|
||||
class ChapterFilterBookmarkedState extends _$ChapterFilterBookmarkedState {
|
||||
@override
|
||||
int build({required ModelManga modelManga}) {
|
||||
int build({required int mangaId}) {
|
||||
state = getType();
|
||||
return getType();
|
||||
}
|
||||
|
||||
int getType() {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-filterChapterBookMark",
|
||||
defaultValue: 0);
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("$mangaId-filterChapterBookMark", defaultValue: 0);
|
||||
}
|
||||
|
||||
void setType(int type) {
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-filterChapterBookMark", type);
|
||||
ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.put("$mangaId-filterChapterBookMark", type);
|
||||
state = type;
|
||||
}
|
||||
|
||||
ModelManga getData() {
|
||||
if (getType() == 1) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isBookmarked == true)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
return model;
|
||||
} else if (getType() == 2) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isBookmarked == false)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
|
||||
return model;
|
||||
} else {
|
||||
return modelManga;
|
||||
}
|
||||
}
|
||||
|
||||
ModelManga update() {
|
||||
void update() {
|
||||
if (state == 0) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isBookmarked == true)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
setType(1);
|
||||
return model;
|
||||
} else if (state == 1) {
|
||||
List<ModelChapters> chap = [];
|
||||
chap = modelManga.chapters
|
||||
.where((element) => element.isBookmarked == false)
|
||||
.toList();
|
||||
final model =
|
||||
modelMangaWithNewChapValue(modelManga: modelManga, chapters: chap);
|
||||
setType(2);
|
||||
return model;
|
||||
} else {
|
||||
setType(0);
|
||||
return modelManga;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -375,51 +242,14 @@ class ChapterFilterBookmarkedState extends _$ChapterFilterBookmarkedState {
|
|||
@riverpod
|
||||
class ChapterFilterResultState extends _$ChapterFilterResultState {
|
||||
@override
|
||||
ModelManga build({required ModelManga modelManga}) {
|
||||
int indexSelected =
|
||||
ref.watch(reverseChapterStateProvider(modelManga: modelManga))["index"];
|
||||
final data1 = ref
|
||||
.read(chapterFilterDownloadedStateProvider(modelManga: modelManga)
|
||||
.notifier)
|
||||
.getData();
|
||||
|
||||
final data2 = ref
|
||||
.read(chapterFilterUnreadStateProvider(modelManga: data1).notifier)
|
||||
.getData();
|
||||
|
||||
final data3 = ref
|
||||
.read(chapterFilterBookmarkedStateProvider(modelManga: data2).notifier)
|
||||
.getData();
|
||||
if (indexSelected == 0) {
|
||||
data3.chapters.toList().sort(
|
||||
(a, b) {
|
||||
return b.scanlator!.compareTo(a.scanlator!);
|
||||
},
|
||||
);
|
||||
} else if (indexSelected == 1) {
|
||||
// data3.chapters!.sort(
|
||||
// (a, b) {
|
||||
// return a.dateUpload!.compareTo(b.dateUpload!);
|
||||
// },
|
||||
// );
|
||||
} else {
|
||||
data3.chapters.toList().sort(
|
||||
(a, b) {
|
||||
return a.dateUpload!.compareTo(b.dateUpload!);
|
||||
},
|
||||
);
|
||||
}
|
||||
return data3;
|
||||
}
|
||||
|
||||
bool isNotFiltering() {
|
||||
bool build({required int mangaId}) {
|
||||
final downloadFilterType =
|
||||
ref.watch(chapterFilterDownloadedStateProvider(modelManga: modelManga));
|
||||
ref.watch(chapterFilterDownloadedStateProvider(mangaId: mangaId));
|
||||
final unreadFilterType =
|
||||
ref.watch(chapterFilterUnreadStateProvider(modelManga: modelManga));
|
||||
ref.watch(chapterFilterUnreadStateProvider(mangaId: mangaId));
|
||||
|
||||
final bookmarkedFilterType =
|
||||
ref.watch(chapterFilterBookmarkedStateProvider(modelManga: modelManga));
|
||||
ref.watch(chapterFilterBookmarkedStateProvider(mangaId: mangaId));
|
||||
return downloadFilterType == 0 &&
|
||||
unreadFilterType == 0 &&
|
||||
bookmarkedFilterType == 0;
|
||||
|
|
@ -522,16 +352,16 @@ class ChapterSetDownloadState extends _$ChapterSetDownloadState {
|
|||
@riverpod
|
||||
class SortByUploadDateState extends _$SortByUploadDateState {
|
||||
@override
|
||||
bool build({required ModelManga modelManga}) {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-sortByUploadDateChapter",
|
||||
defaultValue: false);
|
||||
bool build({required int mangaId}) {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("$mangaId-sortByUploadDateChapter", defaultValue: false);
|
||||
}
|
||||
|
||||
void update(bool value) {
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-sortByUploadDateChapter",
|
||||
value);
|
||||
ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.put("$mangaId-sortByUploadDateChapter", value);
|
||||
state = value;
|
||||
}
|
||||
}
|
||||
|
|
@ -539,15 +369,16 @@ class SortByUploadDateState extends _$SortByUploadDateState {
|
|||
@riverpod
|
||||
class SortBySourceState extends _$SortBySourceState {
|
||||
@override
|
||||
bool build({required ModelManga modelManga}) {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-sortBySourceChapter",
|
||||
defaultValue: false);
|
||||
bool build({required int mangaId}) {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("$mangaId-sortBySourceChapter", defaultValue: false);
|
||||
}
|
||||
|
||||
void update(bool value) {
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-sortBySourceChapter", value);
|
||||
ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.put("$mangaId-sortBySourceChapter", value);
|
||||
state = value;
|
||||
}
|
||||
}
|
||||
|
|
@ -555,16 +386,16 @@ class SortBySourceState extends _$SortBySourceState {
|
|||
@riverpod
|
||||
class SortByChapterNumberState extends _$SortByChapterNumberState {
|
||||
@override
|
||||
bool build({required ModelManga modelManga}) {
|
||||
return ref.watch(hiveBoxSettingsProvider).get(
|
||||
"${modelManga.source}/${modelManga.name}-sortByChapterNumberChapter",
|
||||
defaultValue: false);
|
||||
bool build({required int mangaId}) {
|
||||
return ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.get("$mangaId-sortByChapterNumberChapter", defaultValue: false);
|
||||
}
|
||||
|
||||
void update(bool value) {
|
||||
ref.watch(hiveBoxSettingsProvider).put(
|
||||
"${modelManga.source}/${modelManga.name}-sortByChapterNumberChapter",
|
||||
value);
|
||||
ref
|
||||
.watch(hiveBoxSettingsProvider)
|
||||
.put("$mangaId-sortByChapterNumberChapter", value);
|
||||
state = value;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ final isExtendedStateProvider =
|
|||
|
||||
typedef _$IsExtendedState = AutoDisposeNotifier<bool>;
|
||||
String _$reverseChapterStateHash() =>
|
||||
r'd7f4d869e7c4bbceaee361bf790d4e8bba7df30e';
|
||||
r'8e3db99ef54d27d37e9af35ef9d822a4f5dc6eaf';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
@ -98,10 +98,10 @@ class _SystemHash {
|
|||
|
||||
abstract class _$ReverseChapterState
|
||||
extends BuildlessAutoDisposeNotifier<dynamic> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
dynamic build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -116,10 +116,10 @@ class ReverseChapterStateFamily extends Family<dynamic> {
|
|||
|
||||
/// See also [ReverseChapterState].
|
||||
ReverseChapterStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return ReverseChapterStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -128,7 +128,7 @@ class ReverseChapterStateFamily extends Family<dynamic> {
|
|||
covariant ReverseChapterStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -152,9 +152,9 @@ class ReverseChapterStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<ReverseChapterState, dynamic> {
|
||||
/// See also [ReverseChapterState].
|
||||
ReverseChapterStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => ReverseChapterState()..modelManga = modelManga,
|
||||
() => ReverseChapterState()..mangaId = mangaId,
|
||||
from: reverseChapterStateProvider,
|
||||
name: r'reverseChapterStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -166,18 +166,17 @@ class ReverseChapterStateProvider
|
|||
ReverseChapterStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is ReverseChapterStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
return other is ReverseChapterStateProvider && other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -187,20 +186,20 @@ class ReverseChapterStateProvider
|
|||
covariant ReverseChapterState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$chapterFilterDownloadedStateHash() =>
|
||||
r'33e96291f58f4ddfb1271c44ab06032da80e7c58';
|
||||
r'a19a077ae1caa5bd5b4cdcded1c41960e6fa86f2';
|
||||
|
||||
abstract class _$ChapterFilterDownloadedState
|
||||
extends BuildlessAutoDisposeNotifier<int> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
int build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -216,10 +215,10 @@ class ChapterFilterDownloadedStateFamily extends Family<int> {
|
|||
|
||||
/// See also [ChapterFilterDownloadedState].
|
||||
ChapterFilterDownloadedStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return ChapterFilterDownloadedStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -228,7 +227,7 @@ class ChapterFilterDownloadedStateFamily extends Family<int> {
|
|||
covariant ChapterFilterDownloadedStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -252,9 +251,9 @@ class ChapterFilterDownloadedStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<ChapterFilterDownloadedState, int> {
|
||||
/// See also [ChapterFilterDownloadedState].
|
||||
ChapterFilterDownloadedStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => ChapterFilterDownloadedState()..modelManga = modelManga,
|
||||
() => ChapterFilterDownloadedState()..mangaId = mangaId,
|
||||
from: chapterFilterDownloadedStateProvider,
|
||||
name: r'chapterFilterDownloadedStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -266,18 +265,18 @@ class ChapterFilterDownloadedStateProvider
|
|||
ChapterFilterDownloadedStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is ChapterFilterDownloadedStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -287,20 +286,20 @@ class ChapterFilterDownloadedStateProvider
|
|||
covariant ChapterFilterDownloadedState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$chapterFilterUnreadStateHash() =>
|
||||
r'bcd0a645901a80401affe5bf08d92244e3324832';
|
||||
r'f7d0609cb5dd9809c0f9af1e7931ad02e34b7569';
|
||||
|
||||
abstract class _$ChapterFilterUnreadState
|
||||
extends BuildlessAutoDisposeNotifier<int> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
int build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -315,10 +314,10 @@ class ChapterFilterUnreadStateFamily extends Family<int> {
|
|||
|
||||
/// See also [ChapterFilterUnreadState].
|
||||
ChapterFilterUnreadStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return ChapterFilterUnreadStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -327,7 +326,7 @@ class ChapterFilterUnreadStateFamily extends Family<int> {
|
|||
covariant ChapterFilterUnreadStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -351,9 +350,9 @@ class ChapterFilterUnreadStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<ChapterFilterUnreadState, int> {
|
||||
/// See also [ChapterFilterUnreadState].
|
||||
ChapterFilterUnreadStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => ChapterFilterUnreadState()..modelManga = modelManga,
|
||||
() => ChapterFilterUnreadState()..mangaId = mangaId,
|
||||
from: chapterFilterUnreadStateProvider,
|
||||
name: r'chapterFilterUnreadStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -365,18 +364,18 @@ class ChapterFilterUnreadStateProvider
|
|||
ChapterFilterUnreadStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is ChapterFilterUnreadStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -386,20 +385,20 @@ class ChapterFilterUnreadStateProvider
|
|||
covariant ChapterFilterUnreadState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$chapterFilterBookmarkedStateHash() =>
|
||||
r'2f7d04afd075d55b6d7849ed312bc40fcfd35e05';
|
||||
r'b0b0865a5d093ad0da01ed6c2e374a05e460d14a';
|
||||
|
||||
abstract class _$ChapterFilterBookmarkedState
|
||||
extends BuildlessAutoDisposeNotifier<int> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
int build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -415,10 +414,10 @@ class ChapterFilterBookmarkedStateFamily extends Family<int> {
|
|||
|
||||
/// See also [ChapterFilterBookmarkedState].
|
||||
ChapterFilterBookmarkedStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return ChapterFilterBookmarkedStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -427,7 +426,7 @@ class ChapterFilterBookmarkedStateFamily extends Family<int> {
|
|||
covariant ChapterFilterBookmarkedStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -451,9 +450,9 @@ class ChapterFilterBookmarkedStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<ChapterFilterBookmarkedState, int> {
|
||||
/// See also [ChapterFilterBookmarkedState].
|
||||
ChapterFilterBookmarkedStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => ChapterFilterBookmarkedState()..modelManga = modelManga,
|
||||
() => ChapterFilterBookmarkedState()..mangaId = mangaId,
|
||||
from: chapterFilterBookmarkedStateProvider,
|
||||
name: r'chapterFilterBookmarkedStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -465,18 +464,18 @@ class ChapterFilterBookmarkedStateProvider
|
|||
ChapterFilterBookmarkedStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is ChapterFilterBookmarkedStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -486,20 +485,20 @@ class ChapterFilterBookmarkedStateProvider
|
|||
covariant ChapterFilterBookmarkedState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$chapterFilterResultStateHash() =>
|
||||
r'2efadc2a20b1b7ffde1ce95da77e52b9930a5543';
|
||||
r'0ccd5617e876a3002bb0e6b7293e4c67bf35b1bd';
|
||||
|
||||
abstract class _$ChapterFilterResultState
|
||||
extends BuildlessAutoDisposeNotifier<ModelManga> {
|
||||
late final ModelManga modelManga;
|
||||
extends BuildlessAutoDisposeNotifier<bool> {
|
||||
late final int mangaId;
|
||||
|
||||
ModelManga build({
|
||||
required ModelManga modelManga,
|
||||
bool build({
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -508,16 +507,16 @@ abstract class _$ChapterFilterResultState
|
|||
const chapterFilterResultStateProvider = ChapterFilterResultStateFamily();
|
||||
|
||||
/// See also [ChapterFilterResultState].
|
||||
class ChapterFilterResultStateFamily extends Family<ModelManga> {
|
||||
class ChapterFilterResultStateFamily extends Family<bool> {
|
||||
/// See also [ChapterFilterResultState].
|
||||
const ChapterFilterResultStateFamily();
|
||||
|
||||
/// See also [ChapterFilterResultState].
|
||||
ChapterFilterResultStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return ChapterFilterResultStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -526,7 +525,7 @@ class ChapterFilterResultStateFamily extends Family<ModelManga> {
|
|||
covariant ChapterFilterResultStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -546,13 +545,13 @@ class ChapterFilterResultStateFamily extends Family<ModelManga> {
|
|||
}
|
||||
|
||||
/// See also [ChapterFilterResultState].
|
||||
class ChapterFilterResultStateProvider extends AutoDisposeNotifierProviderImpl<
|
||||
ChapterFilterResultState, ModelManga> {
|
||||
class ChapterFilterResultStateProvider
|
||||
extends AutoDisposeNotifierProviderImpl<ChapterFilterResultState, bool> {
|
||||
/// See also [ChapterFilterResultState].
|
||||
ChapterFilterResultStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => ChapterFilterResultState()..modelManga = modelManga,
|
||||
() => ChapterFilterResultState()..mangaId = mangaId,
|
||||
from: chapterFilterResultStateProvider,
|
||||
name: r'chapterFilterResultStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -564,28 +563,28 @@ class ChapterFilterResultStateProvider extends AutoDisposeNotifierProviderImpl<
|
|||
ChapterFilterResultStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is ChapterFilterResultStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
||||
@override
|
||||
ModelManga runNotifierBuild(
|
||||
bool runNotifierBuild(
|
||||
covariant ChapterFilterResultState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -888,14 +887,14 @@ class ChapterSetDownloadStateProvider
|
|||
}
|
||||
|
||||
String _$sortByUploadDateStateHash() =>
|
||||
r'a86bc258687f71a0364874e8f6f0401f9fb1a1ee';
|
||||
r'5dd31fd2ee8fbaa5f3f5c8e2397842fa60af8b46';
|
||||
|
||||
abstract class _$SortByUploadDateState
|
||||
extends BuildlessAutoDisposeNotifier<bool> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
bool build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -910,10 +909,10 @@ class SortByUploadDateStateFamily extends Family<bool> {
|
|||
|
||||
/// See also [SortByUploadDateState].
|
||||
SortByUploadDateStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return SortByUploadDateStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -922,7 +921,7 @@ class SortByUploadDateStateFamily extends Family<bool> {
|
|||
covariant SortByUploadDateStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -946,9 +945,9 @@ class SortByUploadDateStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<SortByUploadDateState, bool> {
|
||||
/// See also [SortByUploadDateState].
|
||||
SortByUploadDateStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => SortByUploadDateState()..modelManga = modelManga,
|
||||
() => SortByUploadDateState()..mangaId = mangaId,
|
||||
from: sortByUploadDateStateProvider,
|
||||
name: r'sortByUploadDateStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -960,18 +959,17 @@ class SortByUploadDateStateProvider
|
|||
SortByUploadDateStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is SortByUploadDateStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
return other is SortByUploadDateStateProvider && other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -981,18 +979,18 @@ class SortByUploadDateStateProvider
|
|||
covariant SortByUploadDateState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$sortBySourceStateHash() => r'77181a7c4e07a7714a0e3230f84830e66e36a40f';
|
||||
String _$sortBySourceStateHash() => r'b254edd8c935aafd1cb41e4841134d177b58ba62';
|
||||
|
||||
abstract class _$SortBySourceState extends BuildlessAutoDisposeNotifier<bool> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
bool build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -1007,10 +1005,10 @@ class SortBySourceStateFamily extends Family<bool> {
|
|||
|
||||
/// See also [SortBySourceState].
|
||||
SortBySourceStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return SortBySourceStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -1019,7 +1017,7 @@ class SortBySourceStateFamily extends Family<bool> {
|
|||
covariant SortBySourceStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -1043,9 +1041,9 @@ class SortBySourceStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<SortBySourceState, bool> {
|
||||
/// See also [SortBySourceState].
|
||||
SortBySourceStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => SortBySourceState()..modelManga = modelManga,
|
||||
() => SortBySourceState()..mangaId = mangaId,
|
||||
from: sortBySourceStateProvider,
|
||||
name: r'sortBySourceStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -1057,17 +1055,17 @@ class SortBySourceStateProvider
|
|||
SortBySourceStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is SortBySourceStateProvider && other.modelManga == modelManga;
|
||||
return other is SortBySourceStateProvider && other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -1077,20 +1075,20 @@ class SortBySourceStateProvider
|
|||
covariant SortBySourceState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$sortByChapterNumberStateHash() =>
|
||||
r'68dc6bdf97aa6938fe2896d244aac3a77900ee2e';
|
||||
r'c3f088a3235a0c0305b8c33376fa430950902fc6';
|
||||
|
||||
abstract class _$SortByChapterNumberState
|
||||
extends BuildlessAutoDisposeNotifier<bool> {
|
||||
late final ModelManga modelManga;
|
||||
late final int mangaId;
|
||||
|
||||
bool build({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -1105,10 +1103,10 @@ class SortByChapterNumberStateFamily extends Family<bool> {
|
|||
|
||||
/// See also [SortByChapterNumberState].
|
||||
SortByChapterNumberStateProvider call({
|
||||
required ModelManga modelManga,
|
||||
required int mangaId,
|
||||
}) {
|
||||
return SortByChapterNumberStateProvider(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -1117,7 +1115,7 @@ class SortByChapterNumberStateFamily extends Family<bool> {
|
|||
covariant SortByChapterNumberStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
mangaId: provider.mangaId,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -1141,9 +1139,9 @@ class SortByChapterNumberStateProvider
|
|||
extends AutoDisposeNotifierProviderImpl<SortByChapterNumberState, bool> {
|
||||
/// See also [SortByChapterNumberState].
|
||||
SortByChapterNumberStateProvider({
|
||||
required this.modelManga,
|
||||
required this.mangaId,
|
||||
}) : super.internal(
|
||||
() => SortByChapterNumberState()..modelManga = modelManga,
|
||||
() => SortByChapterNumberState()..mangaId = mangaId,
|
||||
from: sortByChapterNumberStateProvider,
|
||||
name: r'sortByChapterNumberStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -1155,18 +1153,18 @@ class SortByChapterNumberStateProvider
|
|||
SortByChapterNumberStateFamily._allTransitiveDependencies,
|
||||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final int mangaId;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is SortByChapterNumberStateProvider &&
|
||||
other.modelManga == modelManga;
|
||||
other.mangaId == mangaId;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, mangaId.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -1176,7 +1174,7 @@ class SortByChapterNumberStateProvider
|
|||
covariant SortByChapterNumberState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
modelManga: modelManga,
|
||||
mangaId: mangaId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ class ChapterListTileWidget extends ConsumerWidget {
|
|||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final isLongPressed = ref.watch(isLongPressedStateProvider);
|
||||
|
||||
return Container(
|
||||
color: chapterNameList.contains(chapter)
|
||||
? primaryColor(context).withOpacity(0.4)
|
||||
|
|
@ -117,7 +118,8 @@ class ChapterListTileWidget extends ConsumerWidget {
|
|||
trailing: ref.watch(ChapterPageDownloadsProvider(
|
||||
chapterIndex: chapterIndex,
|
||||
modelManga: modelManga,
|
||||
chapterId: chapter.id!)),
|
||||
chapterId: chapter.id!,
|
||||
chapters: chapter)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,21 +18,25 @@ class ChapterPageDownloads extends _$ChapterPageDownloads {
|
|||
Widget build(
|
||||
{required ModelManga modelManga,
|
||||
required int chapterIndex,
|
||||
required int chapterId}) {
|
||||
required int chapterId,
|
||||
required ModelChapters chapters}) {
|
||||
return ChapterPageDownload(
|
||||
chapterId: chapterId,
|
||||
chapterIndex: chapterIndex,
|
||||
modelManga: modelManga,
|
||||
chapters: chapters,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ChapterPageDownload extends ConsumerStatefulWidget {
|
||||
final ModelManga modelManga;
|
||||
final ModelChapters chapters;
|
||||
final int chapterId;
|
||||
final int chapterIndex;
|
||||
const ChapterPageDownload(
|
||||
{super.key,
|
||||
required this.chapters,
|
||||
required this.modelManga,
|
||||
required this.chapterId,
|
||||
required this.chapterIndex});
|
||||
|
|
@ -50,7 +54,8 @@ class _ChapterPageDownloadState extends ConsumerState<ChapterPageDownload>
|
|||
final data = await ref.watch(downloadChapterProvider(
|
||||
modelManga: widget.modelManga,
|
||||
chapterId: widget.chapterId,
|
||||
chapterIndex: widget.chapterIndex)
|
||||
chapterIndex: widget.chapterIndex,
|
||||
chapters: widget.chapters)
|
||||
.future);
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
|
|
@ -66,11 +71,11 @@ class _ChapterPageDownloadState extends ConsumerState<ChapterPageDownload>
|
|||
try {
|
||||
path!.deleteSync(recursive: true);
|
||||
ref.watch(hiveBoxMangaDownloadsProvider).delete(
|
||||
widget.modelManga.chapters.toList()[widget.chapterIndex].name!,
|
||||
widget.chapters.name!,
|
||||
);
|
||||
} catch (e) {
|
||||
ref.watch(hiveBoxMangaDownloadsProvider).delete(
|
||||
widget.modelManga.chapters.toList()[widget.chapterIndex].name!,
|
||||
widget.chapters.name!,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -90,8 +95,8 @@ class _ChapterPageDownloadState extends ConsumerState<ChapterPageDownload>
|
|||
builder: (context, val, child) {
|
||||
final entries = val.values
|
||||
.where((element) =>
|
||||
"${element.chapterName}${element.chapterIndex}${element.chapterId}" ==
|
||||
"${widget.modelManga.chapters.toList()[widget.chapterIndex].name!}${widget.chapterIndex}${widget.chapterId}")
|
||||
"${element.mangaId}/${element.chapterId}" ==
|
||||
"${widget.modelManga.id}/${widget.chapterId}")
|
||||
.toList();
|
||||
|
||||
if (entries.isNotEmpty) {
|
||||
|
|
@ -224,7 +229,7 @@ class _ChapterPageDownloadState extends ConsumerState<ChapterPageDownload>
|
|||
.watch(
|
||||
hiveBoxMangaDownloadsProvider)
|
||||
.delete(
|
||||
"${widget.modelManga.chapters.toList()[widget.chapterIndex].name}${widget.chapterIndex}${widget.chapterId}",
|
||||
"${widget.modelManga.id}/${widget.chapterId}",
|
||||
);
|
||||
_startDownload();
|
||||
setState(() {
|
||||
|
|
@ -282,7 +287,7 @@ class _ChapterPageDownloadState extends ConsumerState<ChapterPageDownload>
|
|||
FileDownloader().cancelTasksWithIds(taskIds).then((value) async {
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
ref.watch(hiveBoxMangaDownloadsProvider).delete(
|
||||
"${widget.modelManga.chapters.toList()[widget.chapterIndex].name}${widget.chapterIndex}${widget.chapterId}",
|
||||
"${widget.modelManga.id}/${widget.chapterId}",
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'download_page_widget.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$chapterPageDownloadsHash() =>
|
||||
r'682bf480c3b8e3ccda792661746e5fba24755526';
|
||||
r'bfe13c0c9efee4c0caf6d2a399d9c74aaed78aba';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
@ -35,11 +35,13 @@ abstract class _$ChapterPageDownloads
|
|||
late final ModelManga modelManga;
|
||||
late final int chapterIndex;
|
||||
late final int chapterId;
|
||||
late final ModelChapters chapters;
|
||||
|
||||
Widget build({
|
||||
required ModelManga modelManga,
|
||||
required int chapterIndex,
|
||||
required int chapterId,
|
||||
required ModelChapters chapters,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -57,11 +59,13 @@ class ChapterPageDownloadsFamily extends Family<Widget> {
|
|||
required ModelManga modelManga,
|
||||
required int chapterIndex,
|
||||
required int chapterId,
|
||||
required ModelChapters chapters,
|
||||
}) {
|
||||
return ChapterPageDownloadsProvider(
|
||||
modelManga: modelManga,
|
||||
chapterIndex: chapterIndex,
|
||||
chapterId: chapterId,
|
||||
chapters: chapters,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -73,6 +77,7 @@ class ChapterPageDownloadsFamily extends Family<Widget> {
|
|||
modelManga: provider.modelManga,
|
||||
chapterIndex: provider.chapterIndex,
|
||||
chapterId: provider.chapterId,
|
||||
chapters: provider.chapters,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -99,11 +104,13 @@ class ChapterPageDownloadsProvider
|
|||
required this.modelManga,
|
||||
required this.chapterIndex,
|
||||
required this.chapterId,
|
||||
required this.chapters,
|
||||
}) : super.internal(
|
||||
() => ChapterPageDownloads()
|
||||
..modelManga = modelManga
|
||||
..chapterIndex = chapterIndex
|
||||
..chapterId = chapterId,
|
||||
..chapterId = chapterId
|
||||
..chapters = chapters,
|
||||
from: chapterPageDownloadsProvider,
|
||||
name: r'chapterPageDownloadsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
|
|
@ -118,13 +125,15 @@ class ChapterPageDownloadsProvider
|
|||
final ModelManga modelManga;
|
||||
final int chapterIndex;
|
||||
final int chapterId;
|
||||
final ModelChapters chapters;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is ChapterPageDownloadsProvider &&
|
||||
other.modelManga == modelManga &&
|
||||
other.chapterIndex == chapterIndex &&
|
||||
other.chapterId == chapterId;
|
||||
other.chapterId == chapterId &&
|
||||
other.chapters == chapters;
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
@ -133,6 +142,7 @@ class ChapterPageDownloadsProvider
|
|||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, chapterIndex.hashCode);
|
||||
hash = _SystemHash.combine(hash, chapterId.hashCode);
|
||||
hash = _SystemHash.combine(hash, chapters.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
|
|
@ -145,6 +155,7 @@ class ChapterPageDownloadsProvider
|
|||
modelManga: modelManga,
|
||||
chapterIndex: chapterIndex,
|
||||
chapterId: chapterId,
|
||||
chapters: chapters,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,17 +26,19 @@ class DownloadModel extends HiveObject {
|
|||
final String? chapterName;
|
||||
@HiveField(11)
|
||||
final String? mangaName;
|
||||
DownloadModel({
|
||||
required this.chapterId,
|
||||
required this.succeeded,
|
||||
required this.failed,
|
||||
required this.chapterIndex,
|
||||
required this.total,
|
||||
required this.isDownload,
|
||||
required this.taskIds,
|
||||
required this.isStartDownload,
|
||||
required this.mangaSource,
|
||||
required this.chapterName,
|
||||
required this.mangaName,
|
||||
});
|
||||
@HiveField(12)
|
||||
final int? mangaId;
|
||||
DownloadModel(
|
||||
{required this.chapterId,
|
||||
required this.succeeded,
|
||||
required this.failed,
|
||||
required this.chapterIndex,
|
||||
required this.total,
|
||||
required this.isDownload,
|
||||
required this.taskIds,
|
||||
required this.isStartDownload,
|
||||
required this.mangaSource,
|
||||
required this.chapterName,
|
||||
required this.mangaName,
|
||||
required this.mangaId});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,13 +28,14 @@ class DownloadModelAdapter extends TypeAdapter<DownloadModel> {
|
|||
mangaSource: fields[9] as String?,
|
||||
chapterName: fields[10] as String?,
|
||||
mangaName: fields[11] as String?,
|
||||
mangaId: fields[12] as int?,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, DownloadModel obj) {
|
||||
writer
|
||||
..writeByte(11)
|
||||
..writeByte(12)
|
||||
..writeByte(0)
|
||||
..write(obj.chapterIndex)
|
||||
..writeByte(1)
|
||||
|
|
@ -56,7 +57,9 @@ class DownloadModelAdapter extends TypeAdapter<DownloadModel> {
|
|||
..writeByte(10)
|
||||
..write(obj.chapterName)
|
||||
..writeByte(11)
|
||||
..write(obj.mangaName);
|
||||
..write(obj.mangaName)
|
||||
..writeByte(12)
|
||||
..write(obj.mangaId);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ part 'download_provider.g.dart';
|
|||
Future<List<dynamic>> downloadChapter(
|
||||
DownloadChapterRef ref, {
|
||||
required ModelManga modelManga,
|
||||
required ModelChapters chapters,
|
||||
required int chapterIndex,
|
||||
required int chapterId,
|
||||
}) async {
|
||||
|
|
@ -28,14 +29,11 @@ Future<List<dynamic>> downloadChapter(
|
|||
Directory? path;
|
||||
bool isOk = false;
|
||||
final path1 = await storageProvider.getDirectory();
|
||||
String scanlator = modelManga.chapters
|
||||
.toList()[chapterIndex]
|
||||
.scanlator!
|
||||
.isNotEmpty
|
||||
? "${modelManga.chapters.toList()[chapterIndex].scanlator!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}_"
|
||||
String scanlator = chapters.scanlator!.isNotEmpty
|
||||
? "${chapters.scanlator!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}_"
|
||||
: "";
|
||||
final finalPath =
|
||||
"downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/$scanlator${modelManga.chapters.toList()[chapterIndex].name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}";
|
||||
"downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/$scanlator${chapters.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}";
|
||||
path = Directory("${path1!.path}$finalPath/");
|
||||
log(scanlator);
|
||||
ref
|
||||
|
|
@ -134,16 +132,17 @@ Future<List<dynamic>> downloadChapter(
|
|||
chapterIndex: chapterIndex,
|
||||
succeeded: 0,
|
||||
failed: 0,
|
||||
chapterName: modelManga.chapters.toList()[chapterIndex].name!,
|
||||
chapterName: chapters.name!,
|
||||
mangaSource: modelManga.source,
|
||||
total: 0,
|
||||
isDownload: true,
|
||||
mangaId: modelManga.id!,
|
||||
taskIds: urll,
|
||||
isStartDownload: false);
|
||||
|
||||
ref.watch(hiveBoxMangaDownloadsProvider).put(
|
||||
"${modelManga.chapters.toList()[chapterIndex].name!}$chapterIndex$chapterId",
|
||||
model);
|
||||
ref
|
||||
.watch(hiveBoxMangaDownloadsProvider)
|
||||
.put("${modelManga.id}/$chapterId", model);
|
||||
} else {
|
||||
await FileDownloader().downloadBatch(
|
||||
tasks,
|
||||
|
|
@ -158,12 +157,12 @@ Future<List<dynamic>> downloadChapter(
|
|||
isDownload: (succeeded == tasks.length) ? true : false,
|
||||
taskIds: urll,
|
||||
isStartDownload: true,
|
||||
chapterName: modelManga.chapters.toList()[chapterIndex].name!,
|
||||
chapterName: chapters.name!,
|
||||
mangaSource: modelManga.source,
|
||||
mangaId: modelManga.id!,
|
||||
);
|
||||
Hive.box<DownloadModel>(HiveConstant.hiveBoxDownloads).put(
|
||||
"${modelManga.chapters.toList()[chapterIndex].name!}$chapterIndex$chapterId",
|
||||
model);
|
||||
Hive.box<DownloadModel>(HiveConstant.hiveBoxDownloads)
|
||||
.put("${modelManga.id}/$chapterId", model);
|
||||
},
|
||||
taskProgressCallback: (task, progress) async {
|
||||
if (progress == 1.0) {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'download_provider.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$downloadChapterHash() => r'19ec35b1bc0db5ebbc91f5ddb456dcac93b840ab';
|
||||
String _$downloadChapterHash() => r'0138ae85989eaf1bc8d6f28fee2bdd394fafd3ce';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
@ -43,11 +43,13 @@ class DownloadChapterFamily extends Family<AsyncValue<List<dynamic>>> {
|
|||
/// See also [downloadChapter].
|
||||
DownloadChapterProvider call({
|
||||
required ModelManga modelManga,
|
||||
required ModelChapters chapters,
|
||||
required int chapterIndex,
|
||||
required int chapterId,
|
||||
}) {
|
||||
return DownloadChapterProvider(
|
||||
modelManga: modelManga,
|
||||
chapters: chapters,
|
||||
chapterIndex: chapterIndex,
|
||||
chapterId: chapterId,
|
||||
);
|
||||
|
|
@ -59,6 +61,7 @@ class DownloadChapterFamily extends Family<AsyncValue<List<dynamic>>> {
|
|||
) {
|
||||
return call(
|
||||
modelManga: provider.modelManga,
|
||||
chapters: provider.chapters,
|
||||
chapterIndex: provider.chapterIndex,
|
||||
chapterId: provider.chapterId,
|
||||
);
|
||||
|
|
@ -84,12 +87,14 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<dynamic>> {
|
|||
/// See also [downloadChapter].
|
||||
DownloadChapterProvider({
|
||||
required this.modelManga,
|
||||
required this.chapters,
|
||||
required this.chapterIndex,
|
||||
required this.chapterId,
|
||||
}) : super.internal(
|
||||
(ref) => downloadChapter(
|
||||
ref,
|
||||
modelManga: modelManga,
|
||||
chapters: chapters,
|
||||
chapterIndex: chapterIndex,
|
||||
chapterId: chapterId,
|
||||
),
|
||||
|
|
@ -105,6 +110,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<dynamic>> {
|
|||
);
|
||||
|
||||
final ModelManga modelManga;
|
||||
final ModelChapters chapters;
|
||||
final int chapterIndex;
|
||||
final int chapterId;
|
||||
|
||||
|
|
@ -112,6 +118,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<dynamic>> {
|
|||
bool operator ==(Object other) {
|
||||
return other is DownloadChapterProvider &&
|
||||
other.modelManga == modelManga &&
|
||||
other.chapters == chapters &&
|
||||
other.chapterIndex == chapterIndex &&
|
||||
other.chapterId == chapterId;
|
||||
}
|
||||
|
|
@ -120,6 +127,7 @@ class DownloadChapterProvider extends AutoDisposeFutureProvider<List<dynamic>> {
|
|||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, modelManga.hashCode);
|
||||
hash = _SystemHash.combine(hash, chapters.hashCode);
|
||||
hash = _SystemHash.combine(hash, chapterIndex.hashCode);
|
||||
hash = _SystemHash.combine(hash, chapterId.hashCode);
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/categories.dart';
|
||||
import 'package:mangayomi/views/more/settings/categoties/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/views/more/settings/categoties/widgets/custom_textfield.dart';
|
||||
|
||||
class CategoriesScreen extends ConsumerStatefulWidget {
|
||||
|
|
@ -16,138 +17,145 @@ class _CategoriesScreenState extends ConsumerState<CategoriesScreen> {
|
|||
List<CategoriesModel> _entries = [];
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final categories = ref.watch(getMangaCategorieStreamProvider);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("Edit categories"),
|
||||
),
|
||||
body: StreamBuilder(
|
||||
stream: isar.categoriesModels
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
||||
_entries = snapshot.data!;
|
||||
return ListView.builder(
|
||||
itemCount: _entries.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||
child: Card(
|
||||
child: Column(
|
||||
children: [
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.transparent,
|
||||
elevation: 0,
|
||||
shadowColor: Colors.transparent,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(0),
|
||||
bottomRight: Radius.circular(0),
|
||||
topRight: Radius.circular(10),
|
||||
topLeft: Radius.circular(10)))),
|
||||
onPressed: () {
|
||||
_renameCategory(_entries[index]);
|
||||
},
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
const Icon(Icons.label_outline_rounded),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(child: Text(_entries[index].name!))
|
||||
],
|
||||
)),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: const [
|
||||
SizedBox(width: 10),
|
||||
Icon(Icons.arrow_drop_up_outlined),
|
||||
SizedBox(width: 10),
|
||||
Icon(Icons.arrow_drop_down_outlined)
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
_renameCategory(_entries[index]);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.mode_edit_outline_outlined)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return StatefulBuilder(
|
||||
builder: (context, setState) {
|
||||
return AlertDialog(
|
||||
title: const Text(
|
||||
"Delete category",
|
||||
),
|
||||
content: Text(
|
||||
"Do you wish to delete the category"
|
||||
' "${_entries[index].name}"?'),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(
|
||||
context);
|
||||
},
|
||||
child: const Text(
|
||||
"Cancel")),
|
||||
const SizedBox(
|
||||
width: 15,
|
||||
),
|
||||
TextButton(
|
||||
onPressed:
|
||||
() async {
|
||||
await isar
|
||||
.writeTxn(
|
||||
() async {
|
||||
await isar
|
||||
.categoriesModels
|
||||
.delete(_entries[
|
||||
index]
|
||||
.id!);
|
||||
});
|
||||
if (mounted) {
|
||||
Navigator.pop(
|
||||
context);
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
"OK",
|
||||
)),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
});
|
||||
},
|
||||
icon: const Icon(Icons.delete_outlined))
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
body: categories.when(
|
||||
data: (data) {
|
||||
if (data.isEmpty) {
|
||||
_entries = [];
|
||||
return const Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
"You have no categories. Tap the plus button to create one for organizing your library",
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
_entries = data;
|
||||
return ListView.builder(
|
||||
itemCount: _entries.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||
child: Card(
|
||||
child: Column(
|
||||
children: [
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.transparent,
|
||||
elevation: 0,
|
||||
shadowColor: Colors.transparent,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(0),
|
||||
bottomRight: Radius.circular(0),
|
||||
topRight: Radius.circular(10),
|
||||
topLeft: Radius.circular(10)))),
|
||||
onPressed: () {
|
||||
_renameCategory(_entries[index]);
|
||||
},
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
const Icon(Icons.label_outline_rounded),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(child: Text(_entries[index].name!))
|
||||
],
|
||||
)),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: const [
|
||||
SizedBox(width: 10),
|
||||
Icon(Icons.arrow_drop_up_outlined),
|
||||
SizedBox(width: 10),
|
||||
Icon(Icons.arrow_drop_down_outlined)
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
_renameCategory(_entries[index]);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.mode_edit_outline_outlined)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return StatefulBuilder(
|
||||
builder: (context, setState) {
|
||||
return AlertDialog(
|
||||
title: const Text(
|
||||
"Delete category",
|
||||
),
|
||||
content: Text(
|
||||
"Do you wish to delete the category"
|
||||
' "${_entries[index].name}"?'),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(
|
||||
context);
|
||||
},
|
||||
child: const Text(
|
||||
"Cancel")),
|
||||
const SizedBox(
|
||||
width: 15,
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
await isar.writeTxn(
|
||||
() async {
|
||||
await isar
|
||||
.categoriesModels
|
||||
.delete(_entries[
|
||||
index]
|
||||
.id!);
|
||||
});
|
||||
if (mounted) {
|
||||
Navigator.pop(
|
||||
context);
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
"OK",
|
||||
)),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
});
|
||||
},
|
||||
icon: const Icon(Icons.delete_outlined))
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
_entries = [];
|
||||
return const Center(
|
||||
child: Padding(
|
||||
|
|
@ -159,6 +167,11 @@ class _CategoriesScreenState extends ConsumerState<CategoriesScreen> {
|
|||
),
|
||||
);
|
||||
},
|
||||
loading: () {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
},
|
||||
),
|
||||
floatingActionButton: FloatingActionButton.extended(
|
||||
onPressed: () {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/categories.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'isar_providers.g.dart';
|
||||
|
||||
@riverpod
|
||||
Stream<List<CategoriesModel>> getMangaCategorieStream(
|
||||
GetMangaCategorieStreamRef ref,
|
||||
) async* {
|
||||
yield* isar.categoriesModels
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.watch(fireImmediately: true);
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'isar_providers.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getMangaCategorieStreamHash() =>
|
||||
r'e258e033c3948b7215162bfa9e90529b362d7a7c';
|
||||
|
||||
/// See also [getMangaCategorieStream].
|
||||
@ProviderFor(getMangaCategorieStream)
|
||||
final getMangaCategorieStreamProvider =
|
||||
AutoDisposeStreamProvider<List<CategoriesModel>>.internal(
|
||||
getMangaCategorieStream,
|
||||
name: r'getMangaCategorieStreamProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$getMangaCategorieStreamHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef GetMangaCategorieStreamRef
|
||||
= AutoDisposeStreamProviderRef<List<CategoriesModel>>;
|
||||
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions
|
||||
16
lib/views/widgets/error_text.dart
Normal file
16
lib/views/widgets/error_text.dart
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class ErrorText extends StatelessWidget {
|
||||
final dynamic errorText;
|
||||
const ErrorText(
|
||||
this.errorText, {
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Center(
|
||||
child: Text(errorText.toString()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -10,6 +10,7 @@ import 'package:mangayomi/providers/hive_provider.dart';
|
|||
import 'package:mangayomi/services/get_manga_detail.dart';
|
||||
import 'package:mangayomi/utils/cached_network.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/views/manga/detail/models/chapter_filter.dart';
|
||||
import 'package:mangayomi/views/widgets/bottom_text_widget.dart';
|
||||
import 'package:mangayomi/views/widgets/cover_view_widget.dart';
|
||||
|
||||
|
|
@ -68,6 +69,11 @@ class MangaImageCardWidget extends ConsumerWidget {
|
|||
..manga.value = modelManga;
|
||||
await isar.modelChapters.put(chapters);
|
||||
await chapters.manga.save();
|
||||
log(modelManga.id.toString());
|
||||
final chaptersFilters = ChaptersFilter()
|
||||
..manga.value = modelManga;
|
||||
await isar.chaptersFilters.put(chaptersFilters);
|
||||
// await chaptersFilters.manga.save();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
12
lib/views/widgets/progress_center.dart
Normal file
12
lib/views/widgets/progress_center.dart
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class ProgressCenter extends StatelessWidget {
|
||||
const ProgressCenter({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue