Merge `fetchMangaSourcesListProvider`, `fetchAnimeSourcesListProvider` and `fetchNovelSourcesListProvider` into a single Provider, `FetchItemSourcesListProvider`, reducing code duplication.
There was a bug when uninstalling an extension and trying to reinstall it, it didn't install.
You had to restart the app to reinstall the same extension again.
Now the provider is invalidated when reinstalling an uninstalled extension,
so the fetch logic is triggered correctly. Prevents stale cache issues from
Riverpod's keepAlive behavior.
The Button "Edit Categories" (now called "set Categories"), now opens the category select menu instead of the category edit menu.
This makes more sense in the library item detail view. For example you have the categories "Watching" and "Finished". You just finished an anime and you want to change its category directly in the detail view. Now you can.
Before you had to exit the detail view, go in to the library view, long press the item, tap the category button and then edit it there.
- Added VirtualMangaList widget for displaying manga pages in a virtual scrolling list.
- Introduced VirtualPageManager to handle page loading, caching, and memory optimization.
- Created VirtualReaderView to integrate virtual scrolling with PhotoView for enhanced reading experience.
- Implemented page loading states and memory cleanup mechanisms in VirtualPageManager.
- Added debug information overlay for monitoring virtual page manager statistics.
- Enhanced user experience with callbacks for chapter transitions and page changes.
- Introduced `TransitionViewPaged` and `TransitionViewVertical` widgets to handle chapter transitions.
- Created `ChapterTransitionPage` widget to display transition information between chapters.
- Updated reader view logic to incorporate transition pages when navigating chapters.
- Enhanced `UChapDataPreload` model to support transition states and next chapter information.
feat(localization): add chapter transition messages in multiple languages
fix(dependencies): update Dart SDK and dependencies
- Updated Dart SDK constraint to ^3.8.0.
- Changed `epubx` dependency to use the latest version from GitHub.
Extract `CustomMaterialPlayOrPauseButton` class from *mobile.dart* and `CustomMaterialDesktopPlayOrPauseButton` class from *desktop.dart* into *play_or_pause_button.dart* to eliminate code duplication and improve maintainability.
Prevent an AssertionError in the Slider widget when the skip duration
button causes the value to exceed the video's maximum duration.
Clamp the Slider's value to the range [0, max]
using `clamp(0.0, maxValue).toDouble()` to ensure it stays within bounds.
Exception example:
```
Exception has occurred.
_AssertionError ('package:flutter/src/material/slider.dart': Failed assertion: line 199 pos 10: 'value >= min && value <= max': Value 1410000.0 is not between minimum 0.0 and maximum 1409533.0)
```
Remove incorrect expiresIn calculation in `OAuth.fromJson`. The `login()`
function of the MyAnimeList class already sets expiresIn as an absolute timestamp in milliseconds.
Multiplying by 1000 and adding the current timestamp in fromJson caused
expiresIn to be inflated, making the expiration check in `_getAccessToken()`
always false, skipping token refresh and returning an invalid token.
Users can now add Mangas/Animes to a **manually** created Mangayomi/local folder.
Feature as described:
```
App Home Location/
local/
Manga Title/
cover.jpg (optional)
Chapter 1/
1.jpg
...
Chapter 2.cbz
...
Anime Title/
cover.png (optional)
Episode 1.mp4
Episode 2.mkv
```
The folder (if exist) will be scanned once per app start.
**Supported filetypes:** (taken from lib/modules/library/providers/local_archive.dart, line 98)
```
Videotypes: mp4, mov, avi, flv, wmv, mpeg, mkv
Imagetypes: jpg, jpeg, png, webp
Archivetypes: cbz, zip, cbt, tar
```
getMangaChapterDirectory() now accepts an optional mangaMainDirectory
to avoid calling getMangaMainDirectory() and thus getDirectory() twice in places where both methods are called successively.
- New SettingsSection class to remove code duplication
- Moved the big ListTile+Dialog blocks in their own private methods:
_buildLanguageTile(),
_buildFontTile(),
_buildRelativeTimestampTile(),
_buildDateFormatTile()
Show the FollowSystemThemeButton always on first positon, whether ON or OFF.
Before, the FollowSystemThemeButton was on first position if it was ON and in second position if it was OFF (DarkModeButton took the first position)
Added a checkbox "ignoreFiltersOnSearch" to the library search, so when checked, the whole library will be searched, not just the filtered library (Downloaded, Unwatched/Unread, Started, Bookmarked)
+ added some comments
- Add `ChapterWithPages` model and `MangaReaderController` (FamilyAsyncNotifier)
to load chapter + pages in a single provider (`mangaReaderProvider`)
- Replace synchronous Isar fetch in `MangaReaderView` with `ref.watch(mangaReaderProvider)`
- Unify loading, error, and data states using a shared `scaffoldWith` helper
- Remove duplicated `Scaffold`/`AppBar` boilerplate and inline SystemChrome restore logic
- Simplify error handling
At line 963, when scrolling too fast in manga reader and page didn't load before.
```
═══════ Exception caught by foundation library ════════════════════════════════
The following StateError was thrown while dispatching notifications for ValueNotifier<Iterable<ItemPosition>>:
Bad state: No element
```
```
════════ Exception caught by widgets library ═══════════════════════════════════
The following UnsupportedError was thrown building CircularProgressIndicator(100.0%, dependencies: [InheritedCupertinoTheme, _InheritedTheme, _LocalizationsScope-[GlobalKey#3b6da]], state: _CircularProgressIndicatorState#8c03b(ticker inactive)):
Unsupported operation: Infinity or NaN toInt
The relevant error-causing widget was:
CircularProgressIndicator CircularProgressIndicator (package:mangayomi/modules/manga/reader/widgets/circular_progress_indicator_animate_rotate.dart:56:27)
```
https://docs.flutter.dev/release/breaking-changes/flutter-generate-i10n-source
The flutter tool will no longer generate a synthetic package:flutter_gen or modify the package_config.json of the app.
Applications or tools that referenced package:flutter_gen should instead reference source files generated into the app's source directory directly.