Files
retail/.archive/settings_local_datasource_hive.dart
Phuoc Nguyen b94c158004 runable
2025-10-10 16:38:07 +07:00

156 lines
4.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:hive_ce/hive.dart';
import 'package:retail/core/database/hive_database.dart';
import 'package:retail/features/settings/data/models/app_settings_model.dart';
import 'package:retail/features/settings/data/datasources/settings_local_datasource.dart';
import 'package:retail/features/settings/domain/entities/app_settings.dart';
/// Hive implementation of SettingsLocalDataSource
class SettingsLocalDataSourceHive implements SettingsLocalDataSource {
final HiveDatabase _database;
static const String _settingsKey = 'app_settings';
SettingsLocalDataSourceHive(this._database);
Box<AppSettingsModel> get _box => _database.settingsBox;
/// Convert AppSettingsModel to AppSettings entity
AppSettings _toEntity(AppSettingsModel model) {
return AppSettings(
themeMode: model.themeMode,
language: model.language,
currency: model.currency,
taxRate: model.taxRate,
storeName: model.storeName,
enableSync: model.enableSync,
lastSyncAt: model.lastSyncAt,
);
}
/// Convert AppSettings entity to AppSettingsModel
AppSettingsModel _toModel(AppSettings entity) {
return AppSettingsModel.fromThemeMode(
themeMode: entity.themeMode,
language: entity.language,
currency: entity.currency,
taxRate: entity.taxRate,
storeName: entity.storeName,
enableSync: entity.enableSync,
lastSyncAt: entity.lastSyncAt,
);
}
@override
Future<AppSettings> getSettings() async {
try {
final model = _box.get(_settingsKey);
if (model != null) {
return _toEntity(model);
}
// Return default settings if not found
return AppSettings.defaultSettings();
} catch (e) {
throw Exception('Failed to get settings: $e');
}
}
@override
Future<void> saveSettings(AppSettings settings) async {
try {
final model = _toModel(settings);
await _box.put(_settingsKey, model);
} catch (e) {
throw Exception('Failed to save settings: $e');
}
}
@override
Future<void> updateThemeMode(ThemeMode mode) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(themeMode: mode);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to update theme mode: $e');
}
}
@override
Future<void> updateLanguage(String language) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(language: language);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to update language: $e');
}
}
@override
Future<void> updateLastSyncTime(DateTime time) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(lastSyncAt: time);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to update last sync time: $e');
}
}
/// Additional Hive-specific methods
/// Update currency
Future<void> updateCurrency(String currency) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(currency: currency);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to update currency: $e');
}
}
/// Update tax rate
Future<void> updateTaxRate(double taxRate) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(taxRate: taxRate);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to update tax rate: $e');
}
}
/// Update store name
Future<void> updateStoreName(String storeName) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(storeName: storeName);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to update store name: $e');
}
}
/// Toggle sync
Future<void> toggleSync(bool enable) async {
try {
final currentSettings = await getSettings();
final updated = currentSettings.copyWith(enableSync: enable);
await saveSettings(updated);
} catch (e) {
throw Exception('Failed to toggle sync: $e');
}
}
/// Reset to default settings
Future<void> resetSettings() async {
try {
final defaultSettings = AppSettings.defaultSettings();
await saveSettings(defaultSettings);
} catch (e) {
throw Exception('Failed to reset settings: $e');
}
}
}