156 lines
4.5 KiB
Dart
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');
|
|
}
|
|
}
|
|
}
|