Merge pull request #509 from NBA2K1/refactor-code

Refactor code
This commit is contained in:
Moustapha Kodjo Amadou 2025-07-08 10:01:10 +01:00 committed by GitHub
commit 29b8845869
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 114 additions and 153 deletions

View file

@ -58,7 +58,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
builder: (context, ref, child) {
final chaptersList = ref.watch(chaptersListttStateProvider);
final isExtended = ref.watch(isExtendedStateProvider);
return ref.watch(isLongPressedStateProvider) == true
return ref.watch(isLongPressedStateProvider)
? Container()
: chaptersList.isNotEmpty &&
chaptersList

View file

@ -298,15 +298,15 @@ class ChapterSetIsBookmarkState extends _$ChapterSetIsBookmarkState {
void build({required Manga manga}) {}
set() {
final allChapters = <Chapter>[];
final chapters = ref.watch(chaptersListStateProvider);
isar.writeTxnSync(() {
for (var chapter in chapters) {
chapter.isBookmarked = !chapter.isBookmarked!;
chapter.updatedAt = DateTime.now().millisecondsSinceEpoch;
isar.chapters.putSync(chapter..manga.value = manga);
chapter.manga.saveSync();
}
});
for (var chapter in chapters) {
chapter.isBookmarked = !chapter.isBookmarked!;
chapter.updatedAt = DateTime.now().millisecondsSinceEpoch;
chapter.manga.value = manga;
allChapters.add(chapter);
}
isar.writeTxnSync(() => isar.chapters.putAllSync(allChapters));
ref.read(isLongPressedStateProvider.notifier).update(false);
ref.read(chaptersListStateProvider.notifier).clear();
}
@ -318,15 +318,15 @@ class ChapterSetIsReadState extends _$ChapterSetIsReadState {
void build({required Manga manga}) {}
set() {
final allChapters = <Chapter>[];
final chapters = ref.watch(chaptersListStateProvider);
isar.writeTxnSync(() {
for (var chapter in chapters) {
chapter.isRead = !chapter.isRead!;
chapter.updatedAt = DateTime.now().millisecondsSinceEpoch;
isar.chapters.putSync(chapter..manga.value = manga);
chapter.manga.saveSync();
}
});
for (var chapter in chapters) {
chapter.isRead = !chapter.isRead!;
chapter.updatedAt = DateTime.now().millisecondsSinceEpoch;
chapter.manga.value = manga;
allChapters.add(chapter);
}
isar.writeTxnSync(() => isar.chapters.putAllSync(allChapters));
ref.read(isLongPressedStateProvider.notifier).update(false);
ref.read(chaptersListStateProvider.notifier).clear();
}

View file

@ -816,7 +816,7 @@ class _ChapterFilterResultStateProviderElement
}
String _$chapterSetIsBookmarkStateHash() =>
r'7879f0a8052b1e46d32d5aaad43d1efa14bcb19d';
r'091d86aebaef46d2e9f35ae9f98c12c3e423f5b3';
abstract class _$ChapterSetIsBookmarkState
extends BuildlessAutoDisposeNotifier<void> {
@ -963,7 +963,7 @@ class _ChapterSetIsBookmarkStateProviderElement
}
String _$chapterSetIsReadStateHash() =>
r'80eae3d196cf0932c1e61bae37aebe563d66d6de';
r'f5af852964964170905278d563fdb03eabed53b9';
abstract class _$ChapterSetIsReadState
extends BuildlessAutoDisposeNotifier<void> {

View file

@ -46,7 +46,7 @@ class _MigrationScreenScreenState extends ConsumerState<MigrationScreen> {
String _query = "";
final _textEditingController = TextEditingController();
late final List<Source> sourceList =
ref.watch(onlyIncludePinnedSourceStateProvider)
ref.read(onlyIncludePinnedSourceStateProvider)
? isar.sources
.filter()
.isPinnedEqualTo(true)

View file

@ -22,22 +22,42 @@ List<String> _convertToCBZ((String, String, String, List<String>) datas) {
final imagesPaths = pageList.where((path) => path.endsWith('.jpg')).toList()
..sort();
if (imagesPaths.isNotEmpty) {
final archive = Archive();
final cbzPath = path.join(mangaDir, "$chapterName.cbz");
if (imagesPaths.isEmpty) return imagesPaths;
for (var imagePath in imagesPaths) {
final file = File(imagePath);
if (file.existsSync()) {
final bytes = file.readAsBytesSync();
final fileName = path.basename(imagePath);
archive.add(ArchiveFile.bytes(fileName, bytes));
}
final archive = Archive();
final cbzPath = path.join(mangaDir, "$chapterName.cbz");
final List<String> missingFiles = [];
final List<String> includedFiles = [];
for (var imagePath in imagesPaths) {
final file = File(imagePath);
if (!file.existsSync()) {
missingFiles.add(imagePath);
continue;
}
final bytes = file.readAsBytesSync();
final fileName = path.basename(imagePath);
archive.add(ArchiveFile.bytes(fileName, bytes));
includedFiles.add(imagePath);
}
try {
final cbzData = ZipEncoder().encode(archive);
File(cbzPath).writeAsBytesSync(cbzData);
} catch (e) {
if (File(cbzPath).existsSync()) File(cbzPath).deleteSync();
throw FileSystemException("Failed to create/write CBZ file: $e", cbzPath);
}
try {
Directory(chapterDir).deleteSync(recursive: true);
} catch (e) {
throw FileSystemException("Failed to delete chapter directory", chapterDir);
}
if (missingFiles.isNotEmpty) {
final missingListStr = missingFiles.join(", ");
throw Exception(
"CBZ created, but the following pages were missing and not included: $missingListStr",
);
}
return imagesPaths;
return includedFiles;
}

View file

@ -55,7 +55,7 @@ Future<void> downloadChapter(
bool? useWifi,
VoidCallback? callback,
}) async {
bool onlyOnWifi = useWifi ?? ref.watch(onlyOnWifiStateProvider);
bool onlyOnWifi = useWifi ?? ref.read(onlyOnWifiStateProvider);
final connectivity = await Connectivity().checkConnectivity();
final isOnWifi =
connectivity.contains(ConnectivityResult.wifi) ||
@ -96,8 +96,9 @@ Future<void> downloadChapter(
M3u8Downloader? m3u8Downloader;
Future<void> processConvert() async {
if (ref.watch(saveAsCBZArchiveStateProvider)) {
await ref.watch(
if (!ref.read(saveAsCBZArchiveStateProvider)) return;
try {
await ref.read(
convertToCBZProvider(
chapterDirectory.path,
mangaMainDirectory!.path,
@ -105,6 +106,8 @@ Future<void> downloadChapter(
pages.map((e) => e.fileName!).toList(),
).future,
);
} catch (error) {
botToast("Failed to create CBZ: $error");
}
}
@ -213,11 +216,7 @@ Future<void> downloadChapter(
});
} else if (itemType == ItemType.novel && chapter.url != null) {
final cookie = MClient.getCookiesPref(chapter.url!);
final headers = itemType == ItemType.manga
? ref.watch(headersProvider(source: manga.source!, lang: manga.lang!))
: itemType == ItemType.anime
? videoHeader
: htmlHeader;
final headers = htmlHeader;
if (cookie.isNotEmpty) {
final userAgent = isar.settings.getSync(227)!.userAgent!;
headers.addAll(cookie);
@ -245,7 +244,7 @@ Future<void> downloadChapter(
await File(
p.join(mangaMainDirectory!.path, "${chapter.name}.cbz"),
).exists() &&
ref.watch(saveAsCBZArchiveStateProvider);
ref.read(saveAsCBZArchiveStateProvider);
bool mp4FileExist = await File(
p.join(mangaMainDirectory.path, "$chapterName.mp4"),
).exists();
@ -265,7 +264,7 @@ Future<void> downloadChapter(
final page = pageUrls[index];
final cookie = MClient.getCookiesPref(page.url);
final headers = itemType == ItemType.manga
? ref.watch(
? ref.read(
headersProvider(source: manga.source!, lang: manga.lang!),
)
: itemType == ItemType.anime

View file

@ -158,7 +158,7 @@ class _AddDownloadToQueueProviderElement
Chapter get chapter => (origin as AddDownloadToQueueProvider).chapter;
}
String _$downloadChapterHash() => r'199d0cba47ae8839c23def9c0b012f92472193e9';
String _$downloadChapterHash() => r'e712508a81c414f66b12adeae23c3dc70380a920';
/// See also [downloadChapter].
@ProviderFor(downloadChapter)

View file

@ -205,7 +205,7 @@ class _MangaChapterPageGalleryState
final double _horizontalScaleValue = 1.0;
late int pagePreloadAmount = ref.watch(pagePreloadAmountStateProvider);
late int pagePreloadAmount = ref.read(pagePreloadAmountStateProvider);
late bool _isBookmarked = _readerController.getChapterBookmarked();
final _currentReaderMode = StateProvider<ReaderMode?>((ref) => null);

View file

@ -233,16 +233,10 @@ void restoreBackup(Ref ref, Map<String, dynamic> backup, {bool full = true}) {
isar.trackPreferences.clearSync();
isar.trackPreferences.putAllSync(trackPreferences);
}
}
if (full) {
isar.sources.clearSync();
if (extensions != null) {
isar.sources.putAllSync(extensions);
}
}
if (full) {
isar.sourcePreferences.clearSync();
if (sourcesPrefs != null) {
isar.sourcePreferences.putAllSync(sourcesPrefs);
@ -251,22 +245,7 @@ void restoreBackup(Ref ref, Map<String, dynamic> backup, {bool full = true}) {
if (settings != null) {
isar.settings.putAllSync(settings);
}
}
if (full) {
ref
.read(synchingProvider(syncId: 1).notifier)
.clearAllChangedParts(false);
ref.invalidate(followSystemThemeStateProvider);
ref.invalidate(themeModeStateProvider);
ref.invalidate(blendLevelStateProvider);
ref.invalidate(flexSchemeColorStateProvider);
ref.invalidate(pureBlackDarkModeStateProvider);
ref.invalidate(l10nLocaleStateProvider);
ref.invalidate(navigationOrderStateProvider);
ref.invalidate(hideItemsStateProvider);
ref.invalidate(extensionsRepoStateProvider(ItemType.manga));
ref.invalidate(extensionsRepoStateProvider(ItemType.anime));
ref.invalidate(extensionsRepoStateProvider(ItemType.novel));
_invalidateCommonState(ref);
ref.read(routerCurrentLocationStateProvider.notifier).refresh();
}
});
@ -361,19 +340,7 @@ void restoreKotatsuBackup(Ref ref, Archive archive) {
isar.updates.clearSync();
isar.tracks.clearSync();
isar.trackPreferences.clearSync();
ref
.read(synchingProvider(syncId: 1).notifier)
.clearAllChangedParts(false);
ref.invalidate(themeModeStateProvider);
ref.invalidate(blendLevelStateProvider);
ref.invalidate(flexSchemeColorStateProvider);
ref.invalidate(pureBlackDarkModeStateProvider);
ref.invalidate(l10nLocaleStateProvider);
ref.invalidate(navigationOrderStateProvider);
ref.invalidate(hideItemsStateProvider);
ref.invalidate(extensionsRepoStateProvider(ItemType.manga));
ref.invalidate(extensionsRepoStateProvider(ItemType.anime));
ref.invalidate(extensionsRepoStateProvider(ItemType.novel));
_invalidateCommonState(ref);
});
} catch (e) {
rethrow;
@ -548,20 +515,25 @@ void restoreTachiBkBackup(Ref ref, String path, BackupType bkType) {
isar.updates.clearSync();
isar.tracks.clearSync();
isar.trackPreferences.clearSync();
ref.read(synchingProvider(syncId: 1).notifier).clearAllChangedParts(false);
ref.invalidate(themeModeStateProvider);
ref.invalidate(blendLevelStateProvider);
ref.invalidate(flexSchemeColorStateProvider);
ref.invalidate(pureBlackDarkModeStateProvider);
ref.invalidate(l10nLocaleStateProvider);
ref.invalidate(navigationOrderStateProvider);
ref.invalidate(hideItemsStateProvider);
ref.invalidate(extensionsRepoStateProvider(ItemType.manga));
ref.invalidate(extensionsRepoStateProvider(ItemType.anime));
ref.invalidate(extensionsRepoStateProvider(ItemType.novel));
_invalidateCommonState(ref);
});
}
void _invalidateCommonState(Ref ref) {
ref.read(synchingProvider(syncId: 1).notifier).clearAllChangedParts(false);
ref.invalidate(followSystemThemeStateProvider);
ref.invalidate(themeModeStateProvider);
ref.invalidate(blendLevelStateProvider);
ref.invalidate(flexSchemeColorStateProvider);
ref.invalidate(pureBlackDarkModeStateProvider);
ref.invalidate(l10nLocaleStateProvider);
ref.invalidate(navigationOrderStateProvider);
ref.invalidate(hideItemsStateProvider);
ref.invalidate(extensionsRepoStateProvider(ItemType.manga));
ref.invalidate(extensionsRepoStateProvider(ItemType.anime));
ref.invalidate(extensionsRepoStateProvider(ItemType.novel));
}
Status _convertStatusFromTachiBk(int idx) {
switch (idx) {
case 1:

View file

@ -173,7 +173,7 @@ class _DoRestoreProviderElement extends AutoDisposeProviderElement<void>
BuildContext get context => (origin as DoRestoreProvider).context;
}
String _$restoreBackupHash() => r'd4226539077680dac8826ee9b36efff9b07e2ed8';
String _$restoreBackupHash() => r'2f440cfc5359e15bfd3887d27b38ecaf881404c6';
/// See also [restoreBackup].
@ProviderFor(restoreBackup)
@ -321,7 +321,7 @@ class _RestoreBackupProviderElement extends AutoDisposeProviderElement<void>
}
String _$restoreKotatsuBackupHash() =>
r'e2c10fb6d17ab8f44ee429712cce4aa5a9298bc0';
r'e927f6a196a0349285fecbd84f30c2a9125998b2';
/// See also [restoreKotatsuBackup].
@ProviderFor(restoreKotatsuBackup)
@ -452,7 +452,7 @@ class _RestoreKotatsuBackupProviderElement
}
String _$restoreTachiBkBackupHash() =>
r'8d3228c7bf7e1e33b3cebea6bd769f39fcbe2b30';
r'ae971c2630393df773eb1d64214b4daefb080b95';
/// See also [restoreTachiBkBackup].
@ProviderFor(restoreTachiBkBackup)

View file

@ -103,26 +103,7 @@ class Synching extends _$Synching {
.actionTypeEqualTo(action)
.isarIdEqualTo(isarId)
.findFirstSync();
if (writeTxn) {
isar.writeTxnSync(() {
if (changedPart != null) {
isar.changedParts.putSync(
changedPart
..data = jsonEncode(data)
..clientDate = DateTime.now().millisecondsSinceEpoch,
);
} else {
isar.changedParts.putSync(
ChangedPart(
actionType: action,
isarId: isarId,
data: jsonEncode(data),
clientDate: DateTime.now().millisecondsSinceEpoch,
),
);
}
});
} else {
void putChangedPart() {
if (changedPart != null) {
isar.changedParts.putSync(
changedPart
@ -140,6 +121,12 @@ class Synching extends _$Synching {
);
}
}
if (writeTxn) {
isar.writeTxnSync(putChangedPart);
} else {
putChangedPart();
}
}
Future<void> addChangedPartAsync(
@ -156,26 +143,7 @@ class Synching extends _$Synching {
.actionTypeEqualTo(action)
.isarIdEqualTo(isarId)
.findFirstSync();
if (writeTxn) {
await isar.writeTxn(() async {
if (changedPart != null) {
await isar.changedParts.put(
changedPart
..data = jsonEncode(data)
..clientDate = DateTime.now().millisecondsSinceEpoch,
);
} else {
await isar.changedParts.put(
ChangedPart(
actionType: action,
isarId: isarId,
data: jsonEncode(data),
clientDate: DateTime.now().millisecondsSinceEpoch,
),
);
}
});
} else {
Future<void> putChangedPart() async {
if (changedPart != null) {
await isar.changedParts.put(
changedPart
@ -193,6 +161,12 @@ class Synching extends _$Synching {
);
}
}
if (writeTxn) {
await isar.writeTxn(putChangedPart);
} else {
await putChangedPart();
}
}
Future<void> clearChangedParts(List<ActionType> actions, bool txn) async {
@ -216,9 +190,7 @@ class Synching extends _$Synching {
void clearAllChangedParts(bool txn) {
if (txn) {
isar.writeTxnSync(() {
isar.changedParts.clearSync();
});
isar.writeTxnSync(() => isar.changedParts.clearSync());
} else {
isar.changedParts.clearSync();
}

View file

@ -6,7 +6,7 @@ part of 'sync_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$synchingHash() => r'adaa8bb0e4ef948ace05281c5be3b3f3cb683044';
String _$synchingHash() => r'5d138375c0be625ec3ca62123520d6f1d5f37018';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -15,7 +15,7 @@ class StatisticsScreen extends ConsumerStatefulWidget {
class _StatisticsScreenState extends ConsumerState<StatisticsScreen>
with SingleTickerProviderStateMixin {
late final hideItems = ref.watch(hideItemsStateProvider);
late final hideItems = ref.read(hideItemsStateProvider);
late TabController _tabController;
late final _tabList = [

View file

@ -48,7 +48,7 @@ Future<GetChapterPagesModel> getChapterPages(
final isarPageUrls = chapterPageUrlsList
.where((element) => element.chapterId == chapter.id)
.firstOrNull;
final incognitoMode = ref.watch(incognitoModeStateProvider);
final incognitoMode = ref.read(incognitoModeStateProvider);
final storageProvider = StorageProvider();
final mangaDirectory = await storageProvider.getMangaMainDirectory(chapter);
path = await storageProvider.getMangaChapterDirectory(
@ -86,7 +86,7 @@ Future<GetChapterPagesModel> getChapterPages(
final path = isLocalArchive
? chapter.archivePath
: p.join(mangaDirectory.path, "${chapter.name}.cbz");
final local = await ref.watch(
final local = await ref.read(
getArchiveDataFromFileProvider(path!).future,
);
for (var image in local.images!) {
@ -127,11 +127,9 @@ Future<GetChapterPagesModel> getChapterPages(
? chapterPageHeaders.map((e) => e.toString()).toList()
: null,
);
isar.writeTxnSync(
() => isar.settings.putSync(
settings..chapterPageUrlsList = chapterPageUrls,
),
);
isar.writeTxnSync(() {
isar.settings.putSync(settings..chapterPageUrlsList = chapterPageUrls);
});
}
for (var i = 0; i < pageUrls.length; i++) {
uChapDataPreloadp.add(

View file

@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart';
// RiverpodGenerator
// **************************************************************************
String _$getChapterPagesHash() => r'69bdb90a1ec142dbdb069a675cfb13ad69e18998';
String _$getChapterPagesHash() => r'7cf8c373e081959a8871a96eb8f9c9317bc65321';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -171,7 +171,7 @@ class Anilist extends _$Anilist {
Future<Track?> findLibItem(Track track, bool isManga) async {
final userId = int.parse(
ref.watch(tracksProvider(syncId: syncId))!.username!,
ref.read(tracksProvider(syncId: syncId))!.username!,
);
final type = isManga ? "MANGA" : "ANIME";
final typeVar = isManga ? "manga_id" : "anime_id";
@ -286,7 +286,7 @@ class Anilist extends _$Anilist {
Future<List<TrackSearch>> fetchUserData({bool isManga = true}) async {
final userId = int.parse(
ref.watch(tracksProvider(syncId: syncId))!.username!,
ref.read(tracksProvider(syncId: syncId))!.username!,
);
final type = isManga ? "MANGA" : "ANIME";
final contentUnit = isManga ? "chapters" : "episodes";
@ -405,7 +405,7 @@ class Anilist extends _$Anilist {
}
Future<String> _getAccessToken() async {
final track = ref.watch(tracksProvider(syncId: syncId));
final track = ref.read(tracksProvider(syncId: syncId));
final mALOAuth = OAuth.fromJson(
jsonDecode(track!.oAuth!) as Map<String, dynamic>,
);

View file

@ -345,7 +345,7 @@ class Kitsu extends _$Kitsu {
}
String _getAccessToken() {
final track = ref.watch(tracksProvider(syncId: syncId));
final track = ref.read(tracksProvider(syncId: syncId));
final mAKOAuth = OAuth.fromJson(
jsonDecode(track!.oAuth!) as Map<String, dynamic>,
);
@ -359,7 +359,7 @@ class Kitsu extends _$Kitsu {
}
String _getUserId() {
final track = ref.watch(tracksProvider(syncId: syncId));
final track = ref.read(tracksProvider(syncId: syncId));
return track!.username!;
}

View file

@ -65,7 +65,7 @@ class MyAnimeList extends _$MyAnimeList {
}
Future<String> _getAccessToken() async {
final track = ref.watch(tracksProvider(syncId: syncId));
final track = ref.read(tracksProvider(syncId: syncId));
final mALOAuth = OAuth.fromJson(
jsonDecode(track!.oAuth!) as Map<String, dynamic>,
);

View file

@ -16,8 +16,8 @@ String dateFormat(
}) {
final l10n = l10nLocalizations(context)!;
final locale = currentLocale(context);
final relativeTimestamps = ref.watch(relativeTimesTampsStateProvider);
final dateFrmt = ref.watch(dateFormatStateProvider);
final relativeTimestamps = ref.read(relativeTimesTampsStateProvider);
final dateFrmt = ref.read(dateFormatStateProvider);
final dateTime = stringDate != null
? DateTime.parse(stringDate)
: DateTime.fromMillisecondsSinceEpoch(int.parse(timestamp!));