123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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<Either<FlowyError, T>> getWithFormat<T>(
- String key,
- T Function(String value) formatter,
- );
- 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<Either<FlowyError, T>> getWithFormat<T>(
- String key,
- T Function(String value) formatter,
- ) async {
- final value = await get(key);
- return value.fold(
- (l) => left(l),
- (r) => right(formatter(r)),
- );
- }
- @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<Either<FlowyError, T>> getWithFormat<T>(
- String key,
- T Function(String value) formatter,
- ) async {
- final value = await get(key);
- return value.fold(
- (l) => left(l),
- (r) => right(formatter(r)),
- );
- }
- @override
- Future<void> remove(String key) async {
- await ConfigEventRemoveKeyValue(
- KeyPB.create()..key = key,
- ).send();
- }
- @override
- Future<void> clear() async {
- // TODO(Lucas): implement clear
- }
- }
|