kv.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import 'package:appflowy_backend/dispatch/dispatch.dart';
  2. import 'package:appflowy_backend/protobuf/flowy-config/entities.pb.dart';
  3. import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
  4. import 'package:dartz/dartz.dart';
  5. import 'package:shared_preferences/shared_preferences.dart';
  6. abstract class KeyValueStorage {
  7. Future<void> set(String key, String value);
  8. Future<Either<FlowyError, String>> get(String key);
  9. Future<Either<FlowyError, T>> getWithFormat<T>(
  10. String key,
  11. T Function(String value) formatter,
  12. );
  13. Future<void> remove(String key);
  14. Future<void> clear();
  15. }
  16. class DartKeyValue implements KeyValueStorage {
  17. SharedPreferences? _sharedPreferences;
  18. SharedPreferences get sharedPreferences => _sharedPreferences!;
  19. @override
  20. Future<Either<FlowyError, String>> get(String key) async {
  21. await _initSharedPreferencesIfNeeded();
  22. final value = sharedPreferences.getString(key);
  23. if (value != null) {
  24. return Right(value);
  25. }
  26. return Left(FlowyError());
  27. }
  28. @override
  29. Future<Either<FlowyError, T>> getWithFormat<T>(
  30. String key,
  31. T Function(String value) formatter,
  32. ) async {
  33. final value = await get(key);
  34. return value.fold(
  35. (l) => left(l),
  36. (r) => right(formatter(r)),
  37. );
  38. }
  39. @override
  40. Future<void> remove(String key) async {
  41. await _initSharedPreferencesIfNeeded();
  42. await sharedPreferences.remove(key);
  43. }
  44. @override
  45. Future<void> set(String key, String value) async {
  46. await _initSharedPreferencesIfNeeded();
  47. await sharedPreferences.setString(key, value);
  48. }
  49. @override
  50. Future<void> clear() async {
  51. await _initSharedPreferencesIfNeeded();
  52. await sharedPreferences.clear();
  53. }
  54. Future<void> _initSharedPreferencesIfNeeded() async {
  55. _sharedPreferences ??= await SharedPreferences.getInstance();
  56. }
  57. }
  58. /// Key-value store
  59. /// The data is stored in the local storage of the device.
  60. class RustKeyValue implements KeyValueStorage {
  61. @override
  62. Future<void> set(String key, String value) async {
  63. await ConfigEventSetKeyValue(
  64. KeyValuePB.create()
  65. ..key = key
  66. ..value = value,
  67. ).send();
  68. }
  69. @override
  70. Future<Either<FlowyError, String>> get(String key) async {
  71. final payload = KeyPB.create()..key = key;
  72. final response = await ConfigEventGetKeyValue(payload).send();
  73. return response.swap().map((r) => r.value);
  74. }
  75. @override
  76. Future<Either<FlowyError, T>> getWithFormat<T>(
  77. String key,
  78. T Function(String value) formatter,
  79. ) async {
  80. final value = await get(key);
  81. return value.fold(
  82. (l) => left(l),
  83. (r) => right(formatter(r)),
  84. );
  85. }
  86. @override
  87. Future<void> remove(String key) async {
  88. await ConfigEventRemoveKeyValue(
  89. KeyPB.create()..key = key,
  90. ).send();
  91. }
  92. @override
  93. Future<void> clear() async {
  94. // TODO(Lucas): implement clear
  95. }
  96. }