impl & fix

This commit is contained in:
kodjomoustapha 2023-05-10 13:29:59 +01:00
parent 766e2463ca
commit 48fb9371e4
11 changed files with 252 additions and 138 deletions

View file

@ -12,7 +12,7 @@ import 'package:mangayomi/views/browse/global_search_screen.dart';
import 'package:mangayomi/views/general/general_screen.dart';
import 'package:mangayomi/views/history/history_screen.dart';
import 'package:mangayomi/views/library/library_screen.dart';
import 'package:mangayomi/views/manga/detail/manga_reader_detail.dart';
import 'package:mangayomi/views/manga/detail/manga_detail_main.dart';
import 'package:mangayomi/views/manga/home/manga_home_screen.dart';
import 'package:mangayomi/views/manga/home/manga_search_screen.dart';
import 'package:mangayomi/views/manga/reader/manga_reader_view.dart';

View file

@ -111,7 +111,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
}
String _$getAllMangaWithoutCategoriesStreamHash() =>
r'6fc216e2a14edb3a0323b358ef3749a75007e8b5';
r'affd1fab4a6ab0e0bbc16b67384a0b17498fe209';
/// See also [getAllMangaWithoutCategoriesStream].
@ProviderFor(getAllMangaWithoutCategoriesStream)

View file

@ -1,15 +1,8 @@
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/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:mangayomi/views/manga/detail/providers/isar_providers.dart';

View file

@ -5,6 +5,7 @@ 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:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/providers/hive_provider.dart';
@ -19,6 +20,7 @@ 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';
class MangaDetailView extends ConsumerStatefulWidget {
@ -91,6 +93,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
filterBookmarked: filterBookmarked,
filterDownloaded: filterDownloaded,
sortChapter: sortChapter);
ref.read(chaptersListttStateProvider.notifier).set(chapters);
return _buildWidget(
chapters: chapters,
reverse: reverse,
@ -350,91 +353,193 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
);
})),
),
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,
shadowColor: Colors.transparent,
),
onPressed: () {
ref
.read(chapterSetIsBookmarkStateProvider(
manga: widget.manga!)
.notifier)
.set();
},
child: Icon(Icons.bookmark_add_outlined,
color: Theme.of(context)
.textTheme
.bodyLarge!
.color)),
bottomNavigationBar: Consumer(builder: (context, ref, child) {
final chap = ref.watch(chaptersListStateProvider);
bool getLength1 = chap.length == 1;
bool checkFirstBookmarked =
chap.isNotEmpty && chap.first.isBookmarked! && getLength1;
bool checkReadBookmarked =
chap.isNotEmpty && chap.first.isRead! && getLength1;
return 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,
shadowColor: Colors.transparent,
),
onPressed: () {
final chapters =
ref.watch(chaptersListStateProvider);
isar.writeTxnSync(() {
for (var chapter in chapters) {
chapter.isBookmarked = !chapter.isBookmarked!;
isar.chapters.putSync(
chapter..manga.value = widget.manga);
chapter.manga.saveSync();
}
});
ref
.read(isLongPressedStateProvider.notifier)
.update(false);
ref
.read(chaptersListStateProvider.notifier)
.clear();
},
child: Icon(
checkFirstBookmarked
? Icons.bookmark_remove_outlined
: Icons.bookmark_add_outlined,
color: Theme.of(context)
.textTheme
.bodyLarge!
.color)),
),
),
),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
ref
.read(chapterSetIsReadStateProvider(
manga: widget.manga!)
.notifier)
.set();
},
child: Icon(Icons.done_all_sharp,
color: Theme.of(context)
.textTheme
.bodyLarge!
.color!)),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
final chapters =
ref.watch(chaptersListStateProvider);
isar.writeTxnSync(() {
for (var chapter in chapters) {
chapter.isRead = !chapter.isRead!;
isar.chapters.putSync(
chapter..manga.value = widget.manga);
chapter.manga.saveSync();
}
});
ref
.read(isLongPressedStateProvider.notifier)
.update(false);
ref
.read(chaptersListStateProvider.notifier)
.clear();
},
child: Icon(
checkReadBookmarked
? Icons.remove_done_sharp
: Icons.done_all_sharp,
color: Theme.of(context)
.textTheme
.bodyLarge!
.color!)),
),
),
),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
ref
.read(chapterSetDownloadStateProvider(
manga: widget.manga!)
.notifier)
.set();
},
child: Icon(
Icons.download_outlined,
color:
Theme.of(context).textTheme.bodyLarge!.color!,
)),
),
)
],
),
)),
if (getLength1)
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
int index = chapters.indexOf(chap.first);
isar.writeTxnSync(() {
for (var i = index + 1;
i < chapters.length;
i++) {
chapters[i].isRead = true;
isar.chapters.putSync(chapters[i]
..manga.value = widget.manga);
chapters[i].manga.saveSync();
}
ref
.read(isLongPressedStateProvider.notifier)
.update(false);
ref
.read(chaptersListStateProvider.notifier)
.clear();
});
},
child: Stack(
children: [
Icon(Icons.done_outlined,
color: Theme.of(context)
.textTheme
.bodyLarge!
.color!),
Positioned(
bottom: 0,
right: 0,
child: Icon(Icons.arrow_downward_outlined,
size: 11,
color: Theme.of(context)
.textTheme
.bodyLarge!
.color!))
],
)),
),
),
Expanded(
child: SizedBox(
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
),
onPressed: () {
for (var chapter
in ref.watch(chaptersListStateProvider)) {
final entries = ref
.watch(hiveBoxMangaDownloadsProvider)
.values
.where((element) =>
"${element.mangaId}/${element.chapterId}" ==
"${widget.manga!.id}/${chapter.id}")
.toList();
if (entries.isEmpty ||
!entries.first.isDownload) {
ref.watch(downloadChapterProvider(
chapter: chapter));
}
}
ref
.read(isLongPressedStateProvider.notifier)
.update(false);
ref
.read(chaptersListStateProvider.notifier)
.clear();
},
child: Icon(
Icons.download_outlined,
color:
Theme.of(context).textTheme.bodyLarge!.color!,
)),
),
)
],
),
);
})),
],
);
}

View file

@ -32,10 +32,15 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
@override
Widget build(BuildContext context) {
final history = ref.watch(getAllHistoryStreamProvider);
final chaptersList = ref.watch(chaptersListttStateProvider);
return Scaffold(
floatingActionButton: ref.watch(isLongPressedStateProvider) == true
? null
: widget.manga.chapters.isNotEmpty
: chaptersList.isNotEmpty &&
chaptersList
.where((element) => !element.isRead!)
.toList()
.isNotEmpty
? history.when(
data: (data) {
final incognitoMode = ref.watch(incognitoModeStateProvider);

View file

@ -1,6 +1,5 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

View file

@ -293,3 +293,16 @@ class ChapterSetDownloadState extends _$ChapterSetDownloadState {
ref.read(chaptersListStateProvider.notifier).clear();
}
}
@riverpod
class ChaptersListttState extends _$ChaptersListttState {
@override
List<Chapter> build() {
return [];
}
set(List<Chapter> chapters) async {
await Future.delayed(const Duration(milliseconds: 10));
state = chapters;
}
}

View file

@ -864,4 +864,22 @@ class ChapterSetDownloadStateProvider
);
}
}
String _$chaptersListttStateHash() =>
r'2f81698d88c8087360e33c19884bfbb018604269';
/// See also [ChaptersListttState].
@ProviderFor(ChaptersListttState)
final chaptersListttStateProvider =
AutoDisposeNotifierProvider<ChaptersListttState, List<Chapter>>.internal(
ChaptersListttState.new,
name: r'chaptersListttStateProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$chaptersListttStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ChaptersListttState = AutoDisposeNotifier<List<Chapter>>;
// 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,4 +1,3 @@
// ignore_for_file: unnecessary_string_escapes, depend_on_referenced_packages
import 'dart:async';
import 'dart:math';
import 'dart:ui' as ui;
@ -20,7 +19,6 @@ import 'package:mangayomi/views/manga/reader/widgets/circular_progress_indicator
import 'package:photo_view/photo_view.dart';
import 'package:photo_view/photo_view_gallery.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:collection/collection.dart';
typedef DoubleClickAnimationListener = void Function();
@ -136,13 +134,9 @@ class _MangaChapterPageGalleryState
late bool _isBookmarked = widget.readerController.getChapterBookmarked();
@override
void dispose() {
widget.readerController.setMangaHistoryUpdate();
widget.readerController.setPageIndex(_currentIndex);
widget.readerController.setChapterPageLastRead(_currentIndex);
_rebuildDetail.close();
_doubleClickAnimationController.dispose();
clearGestureDetailsCache();
super.dispose();
}
@ -156,13 +150,23 @@ class _MangaChapterPageGalleryState
_animation = Tween(begin: 1.0, end: 2.0).animate(
CurvedAnimation(curve: Curves.ease, parent: _scaleAnimationController));
_animation.addListener(() => _photoViewController.scale = _animation.value);
_itemPositionsListener.itemPositions.addListener(_readProgressListener);
widget.readerController.setMangaHistoryUpdate();
_initCurrentIndex();
_itemPositionsListener.itemPositions.addListener(_readProgressListener);
super.initState();
}
_readProgressListener() {
var posIndex = _itemPositionsListener.itemPositions.value.first.index;
if (posIndex >= 0 && posIndex < widget.url.length) {
ref
.read(currentIndexProvider(widget.chapter).notifier)
.setCurrentIndex(posIndex, widget.readerController);
_currentIndex = posIndex;
}
}
_initCurrentIndex() async {
widget.readerController.setMangaHistoryUpdate();
await Future.delayed(const Duration(milliseconds: 1));
_selectedValue = widget.readerController.getReaderMode();
_axisHive(_selectedValue!, true);
@ -171,7 +175,7 @@ class _MangaChapterPageGalleryState
void _onPageChanged(int index) {
ref
.read(currentIndexProvider(widget.chapter).notifier)
.setCurrentIndex(index);
.setCurrentIndex(index, widget.readerController);
_currentIndex = index;
if (_imageDetailY != 0) {
_imageDetailY = 0;
@ -231,37 +235,6 @@ class _MangaChapterPageGalleryState
}
}
List<ItemPosition> _filterAndSortItems(Iterable<ItemPosition> positions) {
positions = positions
.where(
(item) => !(item.itemTrailingEdge < 0 || item.itemLeadingEdge > 1))
.toList();
(positions as List<ItemPosition>).sort((a, b) => a.index - b.index);
return positions;
}
List<ItemPosition> getCurrentVisibleItems() {
return _filterAndSortItems(_itemPositionsListener.itemPositions.value);
}
void _readProgressListener() {
int? firstImageIndex = getCurrentVisibleItems().firstOrNull?.index;
if (firstImageIndex == null) {
return;
}
if (_currentIndex != firstImageIndex) {
_recordReadProgress(firstImageIndex);
}
}
void _recordReadProgress(int index) {
ref
.read(currentIndexProvider(widget.chapter).notifier)
.setCurrentIndex(index);
_currentIndex = index;
}
ReaderMode? _selectedValue;
bool _isView = false;
double maxScale = 4.1;

View file

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
@ -36,7 +38,10 @@ class CurrentIndex extends _$CurrentIndex {
return 0;
}
setCurrentIndex(int currentIndex) {
setCurrentIndex(int currentIndex, ReaderController readerController) {
readerController.setMangaHistoryUpdate();
readerController.setPageIndex(currentIndex);
readerController.setChapterPageLastRead(currentIndex);
state = currentIndex;
}
}
@ -104,6 +109,7 @@ class ReaderController extends _$ReaderController {
}
void setMangaHistoryUpdate() {
// log("message");
final incognitoMode = ref.watch(incognitoModeStateProvider);
if (!incognitoMode) {
isar.writeTxnSync(() {
@ -126,6 +132,7 @@ class ReaderController extends _$ReaderController {
.filter()
.mangaIdEqualTo(getManga().id)
.findFirstSync())!
..chapter.value = chapter
..date = DateTime.now().millisecondsSinceEpoch.toString();
}
isar.writeTxnSync(() {
@ -135,7 +142,7 @@ class ReaderController extends _$ReaderController {
}
}
void setChapterPageLastRead(int pageIndex) async {
void setChapterPageLastRead(int pageIndex) {
final incognitoMode = ref.watch(incognitoModeStateProvider);
if (!incognitoMode) {
final chap = chapter;
@ -231,6 +238,7 @@ class ReaderController extends _$ReaderController {
}
void setPageIndex(int newIndex) {
// log(newIndex.toString());
final incognitoMode = ref.watch(incognitoModeStateProvider);
if (!incognitoMode) {
ref.watch(hiveBoxMangaProvider).put(

View file

@ -64,7 +64,7 @@ class ReaderModeAdapter extends TypeAdapter<ReaderMode> {
// RiverpodGenerator
// **************************************************************************
String _$currentIndexHash() => r'c2b912af925d9efd3e36e7a810914ef11393c1da';
String _$currentIndexHash() => r'eaabf2b9ecb9a1238da037e067a6a7759d4cbe27';
/// Copied from Dart SDK
class _SystemHash {
@ -181,7 +181,7 @@ class CurrentIndexProvider
}
}
String _$readerControllerHash() => r'cd0b65db9c027393d7b0f6cf1b7000847623364d';
String _$readerControllerHash() => r'b2d6282fa0374c4762dc175142b13515080c5512';
abstract class _$ReaderController extends BuildlessAutoDisposeNotifier<void> {
late final Chapter chapter;