Files
kooltab/lib/services/settings_service.dart
T

60 lines
1.6 KiB
Dart

import 'package:drift/drift.dart';
import '../database/app_database.dart';
import '../models/settings.dart';
abstract class SettingsService {
Future<AppSettings> getSettings();
Future<void> saveSettings(AppSettings settings);
}
class DriftSettingsService implements SettingsService {
final AppDatabase database;
static const _settingsId = 'app_settings';
DriftSettingsService({required this.database});
AppSettings _mapRowToSettings(AppSettingsRow row) {
return AppSettings(
pinRequired: row.pinRequired,
themeMode: AppThemeMode.values.firstWhere(
(mode) => mode.name == row.themeMode,
orElse: () => AppThemeMode.system,
),
language: AppLanguage.values.firstWhere(
(language) => language.name == row.language,
orElse: () => AppLanguage.system,
),
barGridRows: row.barGridRows.clamp(2, 6).toInt(),
);
}
@override
Future<AppSettings> getSettings() async {
final query = database.select(database.appSettingsTable)
..where((s) => s.id.equals(_settingsId));
final row = await query.getSingleOrNull();
if (row == null) return AppSettings.defaults;
return _mapRowToSettings(row);
}
@override
Future<void> saveSettings(AppSettings settings) async {
await database
.into(database.appSettingsTable)
.insertOnConflictUpdate(
AppSettingsTableCompanion.insert(
id: _settingsId,
pinRequired: Value(settings.pinRequired),
themeMode: Value(settings.themeMode.name),
language: Value(settings.language.name),
barGridRows: Value(settings.barGridRows),
),
);
}
}