| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | import 'package:appflowy_backend/dispatch/dispatch.dart';import 'package:appflowy_backend/protobuf/flowy-config/entities.pb.dart';import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';import 'package:dartz/dartz.dart';import 'package:shared_preferences/shared_preferences.dart';abstract class KeyValueStorage {  Future<void> set(String key, String value);  Future<Either<FlowyError, String>> get(String key);  Future<void> remove(String key);  Future<void> clear();}class DartKeyValue implements KeyValueStorage {  SharedPreferences? _sharedPreferences;  SharedPreferences get sharedPreferences => _sharedPreferences!;  @override  Future<Either<FlowyError, String>> get(String key) async {    await _initSharedPreferencesIfNeeded();    final value = sharedPreferences.getString(key);    if (value != null) {      return Right(value);    }    return Left(FlowyError());  }  @override  Future<void> remove(String key) async {    await _initSharedPreferencesIfNeeded();    await sharedPreferences.remove(key);  }  @override  Future<void> set(String key, String value) async {    await _initSharedPreferencesIfNeeded();    await sharedPreferences.setString(key, value);  }  @override  Future<void> clear() async {    await _initSharedPreferencesIfNeeded();    await sharedPreferences.clear();  }  Future<void> _initSharedPreferencesIfNeeded() async {    _sharedPreferences ??= await SharedPreferences.getInstance();  }}/// Key-value store/// The data is stored in the local storage of the device.class RustKeyValue implements KeyValueStorage {  @override  Future<void> set(String key, String value) async {    await ConfigEventSetKeyValue(      KeyValuePB.create()        ..key = key        ..value = value,    ).send();  }  @override  Future<Either<FlowyError, String>> get(String key) async {    final payload = KeyPB.create()..key = key;    final response = await ConfigEventGetKeyValue(payload).send();    return response.swap().map((r) => r.value);  }  @override  Future<void> remove(String key) async {    await ConfigEventRemoveKeyValue(      KeyPB.create()..key = key,    ).send();  }  @override  Future<void> clear() async {    // TODO(Lucas): implement clear  }}
 |