migration: hive to isar step 2

This commit is contained in:
kodjodevf 2023-05-06 01:57:34 +01:00
parent f0f1d3a6e2
commit 72b04bac2a
31 changed files with 2412 additions and 1393 deletions

Binary file not shown.

Binary file not shown.

View file

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

View file

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

View file

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

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

View 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

View file

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

View file

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

View file

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

View file

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

View file

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

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

View 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');
});
}
}

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

View 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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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

View file

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

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