Vaani/lib/features/per_book_settings/providers/book_settings_provider.dart
2025-12-01 15:34:12 +08:00

73 lines
2.1 KiB
Dart

import 'package:logging/logging.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:vaani/db/available_boxes.dart';
import 'package:vaani/features/per_book_settings/models/book_settings.dart'
as model;
import 'package:vaani/features/per_book_settings/models/nullable_player_settings.dart';
part 'book_settings_provider.g.dart';
final _box = AvailableHiveBoxes.individualBookSettingsBox;
final _logger = Logger('BookSettingsProvider');
model.BookSettings readFromBoxOrCreate(String bookId) {
final foundSettings = _box.get(bookId);
if (foundSettings != null) {
_logger.fine('found book settings for $bookId in box: $foundSettings');
return foundSettings;
} else {
// create a new settings object
final settings = model.BookSettings(
bookId: bookId,
playerSettings: const NullablePlayerSettings(),
progress: model.BookProgress(lastUpdate: DateTime.now()));
_logger.fine('created new book settings for $bookId: $settings');
writeToBox(settings);
return settings;
}
}
void writeToBox(model.BookSettings newSettings) {
_box.put(newSettings.bookId, newSettings);
_logger.fine(
'wrote book settings for ${newSettings.bookId} to box: $newSettings',
);
}
void updateState(model.BookSettings newSettings, {bool force = false}) {
// check if the settings are different
final foundSettings = _box.get(newSettings.bookId);
if (foundSettings == newSettings && !force) {
return;
}
writeToBox(newSettings);
}
@riverpod
class BookSettings extends _$BookSettings {
@override
model.BookSettings build(String bookId) {
return readFromBoxOrCreate(bookId);
}
void update(model.BookSettings newSettings, {bool force = false}) {
state = newSettings;
updateState(newSettings, force: force);
}
}
@riverpod
class BookProgressSettings extends _$BookProgressSettings {
@override
model.BookProgress build(String bookId) {
final progress =
ref.read(bookSettingsProvider(bookId).select((v) => v.progress));
if (progress == null) {
return model.BookProgress(
lastUpdate: DateTime.now(),
);
}
return progress;
}
}