worldhopper/lib/providers/reading_mode_provider.dart
Felipe M. da7d11b33a
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
feat: reading direction per series
2026-02-12 09:15:28 +01:00

69 lines
2 KiB
Dart

import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:worldhopper/repositories/series_reading_mode_repository.dart';
part 'reading_mode_provider.g.dart';
/// Reading direction modes for the image reader
enum ReadingMode {
ltr,
rtl,
verticalContinuous,
}
/// Key for storing reading mode preference in SharedPreferences
const String _readingModeKey = 'image_reader_reading_mode';
/// Provider for image reader reading mode state management
@riverpod
class ReadingModeNotifier extends _$ReadingModeNotifier {
@override
ReadingMode build() {
_loadReadingMode();
return ReadingMode.ltr; // Default value until loaded
}
/// Load reading mode from SharedPreferences
Future<void> _loadReadingMode() async {
final prefs = await SharedPreferences.getInstance();
final readingModeString = prefs.getString(_readingModeKey);
if (readingModeString != null) {
final readingMode = ReadingMode.values.firstWhere(
(m) => m.name == readingModeString,
orElse: () => ReadingMode.ltr,
);
state = readingMode;
}
}
/// Set reading mode and persist to SharedPreferences
Future<void> setReadingMode(ReadingMode mode) async {
state = mode;
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_readingModeKey, mode.name);
}
}
/// Provider for per-series reading mode overrides.
/// Parameterized by seriesFeedUrl. Returns null when no override is set.
@riverpod
class SeriesReadingModeNotifier extends _$SeriesReadingModeNotifier {
@override
ReadingMode? build(String seriesFeedUrl) {
_load(seriesFeedUrl);
return null;
}
Future<void> _load(String seriesFeedUrl) async {
final repo = SeriesReadingModeRepository();
final mode = await repo.getReadingMode(seriesFeedUrl);
state = mode;
}
Future<void> setReadingMode(ReadingMode mode) async {
state = mode;
final repo = SeriesReadingModeRepository();
await repo.setReadingMode(seriesFeedUrl, mode);
}
}