mangayomi/lib/modules/more/settings/sync/providers/sync_providers.dart
2024-09-08 03:13:58 +02:00

283 lines
8.5 KiB
Dart

import 'dart:convert';
import 'dart:developer';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/changed_items.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/sync_preference.dart';
import 'package:mangayomi/services/sync_server.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'sync_providers.g.dart';
@riverpod
void addUpdatedChapterIndependent(AddUpdatedChapterIndependentRef ref,
Chapter chapter, bool deleted, bool txn) {
final changedItems = isar.changedItems.getSync(1) ?? ChangedItems();
bool updated = false;
changedItems.updatedChapters = changedItems.updatedChapters?.map((e) {
if (e.chapterId == chapter.id) {
e.isBookmarked = chapter.isBookmarked;
e.isRead = chapter.isRead;
e.lastPageRead = chapter.lastPageRead;
e.deleted = deleted;
updated = true;
}
return e;
}).toList();
if (!updated) {
final updatedChapter = UpdatedChapter(
chapterId: chapter.id,
isBookmarked: chapter.isBookmarked,
isRead: chapter.isRead,
lastPageRead: chapter.lastPageRead,
deleted: deleted);
changedItems.updatedChapters = changedItems.updatedChapters?.toList()
?..add(updatedChapter);
}
if (!txn) {
isar.changedItems.putSync(changedItems);
} else {
isar.writeTxnSync(() {
isar.changedItems.putSync(changedItems);
});
}
}
@riverpod
void checkForSyncIndependent(CheckForSyncIndependentRef ref, bool silent) {
ref.read(SyncServerProvider(syncId: 1).notifier).checkForSync(silent);
}
@riverpod
class ChangedItemsManager extends _$ChangedItemsManager {
@override
ChangedItems? build({required int? managerId}) {
return isar.changedItems.getSync(managerId!);
}
void cleanChangedItems(bool txn) {
final changedItems =
isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId);
changedItems.deletedMangas = [];
changedItems.updatedChapters = [];
changedItems.deletedCategories = [];
if (!txn) {
isar.changedItems.putSync(changedItems);
} else {
isar.writeTxnSync(() {
isar.changedItems.putSync(changedItems);
});
}
}
void addDeletedManga(Manga manga, bool txn) {
final changedItems =
isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId);
log("DEBUG");
log(jsonEncode(changedItems));
final deletedManga = DeletedManga(mangaId: manga.id);
changedItems.deletedMangas = changedItems.deletedMangas?.toList()
?..add(deletedManga);
if (!txn) {
isar.changedItems.putSync(changedItems);
} else {
isar.writeTxnSync(() {
isar.changedItems.putSync(changedItems);
});
}
}
Future addDeletedMangaAsync(Manga manga, bool txn) async {
final changedItems =
await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId);
final deletedManga = DeletedManga(mangaId: manga.id);
changedItems.deletedMangas = changedItems.deletedMangas?.toList()
?..add(deletedManga);
if (!txn) {
await isar.changedItems.put(changedItems);
} else {
await isar.writeTxn(() async {
await isar.changedItems.put(changedItems);
});
}
}
void addUpdatedChapter(Chapter chapter, bool deleted, bool txn) {
final changedItems =
isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId);
bool updated = false;
changedItems.updatedChapters = changedItems.updatedChapters?.map((e) {
if (e.chapterId == chapter.id && e.mangaId == chapter.mangaId) {
e.isBookmarked = chapter.isBookmarked;
e.isRead = chapter.isRead;
e.lastPageRead = chapter.lastPageRead;
e.deleted = deleted;
updated = true;
}
return e;
}).toList();
if (!updated) {
final updatedChapter = UpdatedChapter(
chapterId: chapter.id,
mangaId: chapter.mangaId,
isBookmarked: chapter.isBookmarked,
isRead: chapter.isRead,
lastPageRead: chapter.lastPageRead,
deleted: deleted);
changedItems.updatedChapters = changedItems.updatedChapters?.toList()
?..add(updatedChapter);
}
if (!txn) {
isar.changedItems.putSync(changedItems);
} else {
isar.writeTxnSync(() {
isar.changedItems.putSync(changedItems);
});
}
}
Future addUpdatedChapterAsync(Chapter chapter, bool deleted, bool txn) async {
final changedItems =
await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId);
bool updated = false;
changedItems.updatedChapters = changedItems.updatedChapters?.map((e) {
if (e.chapterId == chapter.id && e.mangaId == chapter.mangaId) {
e.isBookmarked = chapter.isBookmarked;
e.isRead = chapter.isRead;
e.lastPageRead = chapter.lastPageRead;
e.deleted = deleted;
updated = true;
}
return e;
}).toList();
if (!updated) {
final updatedChapter = UpdatedChapter(
chapterId: chapter.id,
mangaId: chapter.mangaId,
isBookmarked: chapter.isBookmarked,
isRead: chapter.isRead,
lastPageRead: chapter.lastPageRead,
deleted: deleted);
changedItems.updatedChapters = changedItems.updatedChapters?.toList()
?..add(updatedChapter);
}
if (!txn) {
await isar.changedItems.put(changedItems);
} else {
await isar.writeTxn(() async {
await isar.changedItems.put(changedItems);
});
}
}
void addDeletedCategory(Category category, bool txn) {
final changedItems =
isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId);
final deletedCategory = DeletedCategory(categoryId: category.id);
changedItems.deletedCategories = changedItems.deletedCategories?.toList()
?..add(deletedCategory);
if (!txn) {
isar.changedItems.putSync(changedItems);
} else {
isar.writeTxnSync(() {
isar.changedItems.putSync(changedItems);
});
}
}
Future addDeletedCategoryAsync(Category category, bool txn) async {
final changedItems =
await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId);
final deletedCategory = DeletedCategory(categoryId: category.id);
changedItems.deletedCategories = changedItems.deletedCategories?.toList()
?..add(deletedCategory);
if (!txn) {
await isar.changedItems.put(changedItems);
} else {
await isar.writeTxn(() async {
await isar.changedItems.put(changedItems);
});
}
}
}
@riverpod
class Synching extends _$Synching {
@override
SyncPreference? build({required int? syncId}) {
return isar.syncPreferences.getSync(syncId!);
}
void login(SyncPreference syncPreference) {
isar.writeTxnSync(() {
isar.syncPreferences.putSync(syncPreference);
});
}
void logout() {
isar.writeTxnSync(() {
isar.syncPreferences.deleteSync(syncId!);
});
}
void setLastSync(int timestamp) {
isar.writeTxnSync(() {
isar.syncPreferences.putSync(
isar.syncPreferences.getSync(syncId!)!..lastSync = timestamp);
});
}
void setLastUpload(int timestamp) {
isar.writeTxnSync(() {
isar.syncPreferences.putSync(
isar.syncPreferences.getSync(syncId!)!..lastUpload = timestamp);
});
}
void setLastDownload(int timestamp) {
isar.writeTxnSync(() {
isar.syncPreferences.putSync(
isar.syncPreferences.getSync(syncId!)!..lastDownload = timestamp);
});
}
void setServer(String? server) {
isar.writeTxnSync(() {
isar.syncPreferences
.putSync(isar.syncPreferences.getSync(syncId!)!..server = server);
});
}
}
@riverpod
class SyncOnAppLaunchState extends _$SyncOnAppLaunchState {
@override
bool build() {
return isar.settings.getSync(227)!.syncOnAppLaunch ?? false;
}
void set(bool value) {
final settings = isar.settings.getSync(227);
state = value;
isar.writeTxnSync(
() => isar.settings.putSync(settings!..syncOnAppLaunch = value));
}
}
@riverpod
class SyncAfterReadingState extends _$SyncAfterReadingState {
@override
bool build() {
return isar.settings.getSync(227)!.syncAfterReading ?? false;
}
void set(bool value) {
final settings = isar.settings.getSync(227);
state = value;
isar.writeTxnSync(
() => isar.settings.putSync(settings!..syncAfterReading = value));
}
}