125 lines
3.6 KiB
Dart
Raw Normal View History

2021-07-21 17:05:51 +08:00
import 'dart:async';
2021-09-07 17:12:03 +08:00
import 'dart:typed_data';
2021-07-22 17:06:53 +08:00
import 'package:app_flowy/workspace/domain/i_app.dart';
2021-07-21 17:05:51 +08:00
import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart';
2021-07-21 17:05:51 +08:00
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-dart-notify/subject.pb.dart';
2021-07-21 17:05:51 +08:00
import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/app_query.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pbenum.dart';
import 'package:flowy_sdk/rust_stream.dart';
2021-09-07 17:12:03 +08:00
import 'helper.dart';
2021-07-21 17:05:51 +08:00
class AppRepository {
String appId;
AppRepository({
required this.appId,
});
Future<Either<App, WorkspaceError>> getAppDesc() {
final request = QueryAppRequest.create()
..appId = appId
..readBelongings = false;
2021-07-21 17:05:51 +08:00
2021-07-29 17:46:20 +08:00
return WorkspaceEventReadApp(request).send();
2021-07-21 17:05:51 +08:00
}
Future<Either<View, WorkspaceError>> createView(
2021-07-22 17:06:53 +08:00
String name, String desc, ViewType viewType) {
2021-07-21 17:05:51 +08:00
final request = CreateViewRequest.create()
2021-07-28 13:41:39 +08:00
..belongToId = appId
2021-07-21 17:05:51 +08:00
..name = name
..desc = desc
..viewType = viewType;
return WorkspaceEventCreateView(request).send();
}
2021-07-22 17:06:53 +08:00
Future<Either<List<View>, WorkspaceError>> getViews() {
2021-07-21 17:05:51 +08:00
final request = QueryAppRequest.create()
..appId = appId
..readBelongings = true;
2021-07-21 17:05:51 +08:00
2021-07-29 17:46:20 +08:00
return WorkspaceEventReadApp(request).send().then((result) {
2021-07-21 17:05:51 +08:00
return result.fold(
(app) => left(app.belongings.items),
2021-07-21 17:05:51 +08:00
(error) => right(error),
);
});
}
}
class AppWatchRepository {
StreamSubscription<ObservableSubject>? _subscription;
AppCreateViewCallback? _createView;
AppDeleteViewCallback? _deleteView;
AppUpdatedCallback? _update;
late WorkspaceObservableParser _extractor;
String appId;
2021-09-07 17:12:03 +08:00
AppWatchRepository({
required this.appId,
2021-09-07 17:12:03 +08:00
});
2021-07-21 17:05:51 +08:00
void startWatching(
{AppCreateViewCallback? createView,
AppDeleteViewCallback? deleteView,
AppUpdatedCallback? update}) {
_createView = createView;
_deleteView = deleteView;
_update = update;
_extractor =
WorkspaceObservableParser(id: appId, callback: _bservableCallback);
2021-09-07 17:12:03 +08:00
_subscription =
RustStreamReceiver.listen((observable) => _extractor.parse(observable));
2021-07-21 17:05:51 +08:00
}
void _bservableCallback(
2021-09-07 17:12:03 +08:00
WorkspaceObservable ty, Either<Uint8List, WorkspaceError> result) {
2021-07-21 17:05:51 +08:00
switch (ty) {
case WorkspaceObservable.AppCreateView:
2021-09-07 17:12:03 +08:00
if (_createView != null) {
2021-07-21 17:05:51 +08:00
result.fold(
2021-09-07 17:12:03 +08:00
(payload) {
final repeatedView = RepeatedView.fromBuffer(payload);
_createView!(left(repeatedView.items));
},
(error) => _createView!(right(error)),
2021-07-21 17:05:51 +08:00
);
2021-09-07 17:12:03 +08:00
}
2021-07-21 17:05:51 +08:00
break;
case WorkspaceObservable.AppDeleteView:
2021-09-07 17:12:03 +08:00
if (_deleteView != null) {
result.fold(
2021-09-07 17:12:03 +08:00
(payload) => _deleteView!(
left(RepeatedView.fromBuffer(payload).items),
),
(error) => _deleteView!(right(error)),
);
2021-09-07 17:12:03 +08:00
}
break;
case WorkspaceObservable.AppUpdated:
2021-09-07 17:12:03 +08:00
if (_update != null) {
2021-07-21 17:05:51 +08:00
result.fold(
2021-09-07 17:12:03 +08:00
(payload) {
final app = App.fromBuffer(payload);
_update!(app.name, app.desc);
},
2021-07-21 17:05:51 +08:00
(error) => Log.error(error),
);
2021-09-07 17:12:03 +08:00
}
2021-07-21 17:05:51 +08:00
break;
default:
break;
}
}
Future<void> close() async {
await _subscription?.cancel();
}
}