4
0

settings_store.dart 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import 'dart:convert';
  2. import 'key_value_storage.dart';
  3. /// Server connection details and offline inventory are kept in the device
  4. /// keychain/keystore.
  5. class SettingsStore {
  6. SettingsStore({KeyValueStorage? storage})
  7. : _storage = storage ?? SecureKeyValueStorage();
  8. final KeyValueStorage _storage;
  9. static const _baseUrlKey = 'serverBaseUrl';
  10. static const _apiKeyKey = 'serverApiKey';
  11. static const _localModeKey = 'localMode';
  12. static const _inventoryKey = 'offlineInventoryState';
  13. Future<({String baseUrl, String apiKey})?> load() async {
  14. final baseUrl = await _storage.read(_baseUrlKey);
  15. final apiKey = await _storage.read(_apiKeyKey);
  16. if (baseUrl == null ||
  17. baseUrl.isEmpty ||
  18. apiKey == null ||
  19. apiKey.isEmpty) {
  20. return null;
  21. }
  22. return (baseUrl: baseUrl, apiKey: apiKey);
  23. }
  24. Future<bool> isLocalMode() async =>
  25. await _storage.read(_localModeKey) == 'true';
  26. Future<void> save(String baseUrl, String apiKey) async {
  27. await _storage.write(_baseUrlKey, baseUrl.trim());
  28. await _storage.write(_apiKeyKey, apiKey.trim());
  29. await _storage.delete(_localModeKey);
  30. }
  31. Future<void> useLocalMode() async {
  32. await _storage.delete(_baseUrlKey);
  33. await _storage.delete(_apiKeyKey);
  34. await _storage.write(_localModeKey, 'true');
  35. }
  36. Future<Map<String, dynamic>?> loadOfflineState() async {
  37. final encoded = await _storage.read(_inventoryKey);
  38. if (encoded == null) return null;
  39. try {
  40. final decoded = jsonDecode(encoded);
  41. return decoded is Map<String, dynamic> ? decoded : null;
  42. } on FormatException {
  43. return null;
  44. }
  45. }
  46. Future<void> saveOfflineState(Map<String, dynamic> state) =>
  47. _storage.write(_inventoryKey, jsonEncode(state));
  48. Future<void> clearOfflineState() => _storage.delete(_inventoryKey);
  49. Future<bool> hasPendingLocalChanges() async {
  50. final state = await loadOfflineState();
  51. final pending = state?['pendingChanges'];
  52. return pending is List && pending.isNotEmpty;
  53. }
  54. Future<void> clear() async {
  55. await _storage.delete(_baseUrlKey);
  56. await _storage.delete(_apiKeyKey);
  57. await _storage.delete(_localModeKey);
  58. }
  59. }