mangayomi-mirror/lib/modules/novel/novel_reader_controller_provider.dart
2026-04-15 22:04:15 +02:00

46 lines
1.8 KiB
Dart

import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/modules/manga/reader/mixins/chapter_reader_settings_mixin.dart';
import 'package:mangayomi/modules/manga/reader/mixins/chapter_controller_mixin.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'novel_reader_controller_provider.g.dart';
@riverpod
class NovelReaderController extends _$NovelReaderController
with ChapterControllerMixin, ChapterReaderSettingsMixin {
@override
void build({required Chapter chapter}) {}
// Keep incognitoMode as a final field (read once, not on every access).
@override
final bool incognitoMode = isar.settings.getSync(227)!.incognitoMode!;
// Override getIsarSetting to add per-instance caching; callers that mutate
// settings must call _invalidateSettingsCache() afterwards.
Settings? _cachedSettings;
@override
void onSettingsMutated() => _cachedSettings = null;
@override
Settings getIsarSetting() => _cachedSettings ??= isar.settings.getSync(227)!;
// ---------------------------------------------------------------------------
// Scroll-position tracking
// ---------------------------------------------------------------------------
void setChapterOffset(double newOffset, double maxOffset, bool save) {
if (incognitoMode) return;
final isRead = (newOffset / (maxOffset != 0 ? maxOffset : 1)) >= 0.9;
if (isRead || save) {
final ch = chapter;
isar.writeTxnSync(() {
ch.isRead = isRead;
ch.lastPageRead = (maxOffset != 0 ? newOffset / maxOffset : 0)
.toString();
ch.updatedAt = DateTime.now().millisecondsSinceEpoch;
isar.chapters.putSync(ch);
});
}
}
}