kv.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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<void> remove(String key);
  10. Future<void> clear();
  11. }
  12. class DartKeyValue implements KeyValueStorage {
  13. SharedPreferences? _sharedPreferences;
  14. SharedPreferences get sharedPreferences => _sharedPreferences!;
  15. @override
  16. Future<Either<FlowyError, String>> get(String key) async {
  17. await _initSharedPreferencesIfNeeded();
  18. final value = sharedPreferences.getString(key);
  19. if (value != null) {
  20. return Right(value);
  21. }
  22. return Left(FlowyError());
  23. }
  24. @override
  25. Future<void> remove(String key) async {
  26. await _initSharedPreferencesIfNeeded();
  27. await sharedPreferences.remove(key);
  28. }
  29. @override
  30. Future<void> set(String key, String value) async {
  31. await _initSharedPreferencesIfNeeded();
  32. await sharedPreferences.setString(key, value);
  33. }
  34. @override
  35. Future<void> clear() async {
  36. await _initSharedPreferencesIfNeeded();
  37. await sharedPreferences.clear();
  38. }
  39. Future<void> _initSharedPreferencesIfNeeded() async {
  40. _sharedPreferences ??= await SharedPreferences.getInstance();
  41. }
  42. }
  43. /// Key-value store
  44. /// The data is stored in the local storage of the device.
  45. class RustKeyValue implements KeyValueStorage {
  46. @override
  47. Future<void> set(String key, String value) async {
  48. await ConfigEventSetKeyValue(
  49. KeyValuePB.create()
  50. ..key = key
  51. ..value = value,
  52. ).send();
  53. }
  54. @override
  55. Future<Either<FlowyError, String>> get(String key) async {
  56. final payload = KeyPB.create()..key = key;
  57. final response = await ConfigEventGetKeyValue(payload).send();
  58. return response.swap().map((r) => r.value);
  59. }
  60. @override
  61. Future<void> remove(String key) async {
  62. await ConfigEventRemoveKeyValue(
  63. KeyPB.create()..key = key,
  64. ).send();
  65. }
  66. @override
  67. Future<void> clear() {
  68. // TODO: implement clear
  69. throw UnimplementedError();
  70. }
  71. }