2023-06-01 20:23:27 +08:00
|
|
|
import 'package:appflowy/startup/plugin/plugin.dart';
|
|
|
|
import 'package:appflowy/startup/startup.dart';
|
|
|
|
import 'package:appflowy/workspace/application/view/view_ext.dart';
|
|
|
|
import 'package:appflowy/workspace/application/view/view_listener.dart';
|
|
|
|
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
|
|
|
|
import '../../workspace/presentation/home/home_stack.dart';
|
|
|
|
|
|
|
|
/// [DatabaseViewPlugin] is used to build the grid, calendar, and board.
|
|
|
|
/// It is a wrapper of the [Plugin] class. The underlying [Plugin] is
|
|
|
|
/// determined by the [ViewPB.pluginType] field.
|
|
|
|
///
|
|
|
|
class DatabaseViewPlugin extends Plugin {
|
|
|
|
final ViewListener _viewListener;
|
|
|
|
ViewPB _view;
|
|
|
|
Plugin _innerPlugin;
|
|
|
|
|
|
|
|
DatabaseViewPlugin({
|
|
|
|
required ViewPB view,
|
|
|
|
}) : _view = view,
|
|
|
|
_innerPlugin = _makeInnerPlugin(view),
|
|
|
|
_viewListener = ViewListener(view: view) {
|
|
|
|
_listenOnLayoutChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
PluginId get id => _innerPlugin.id;
|
|
|
|
|
|
|
|
@override
|
|
|
|
PluginType get pluginType => _innerPlugin.pluginType;
|
|
|
|
|
|
|
|
@override
|
|
|
|
PluginWidgetBuilder get widgetBuilder => _innerPlugin.widgetBuilder;
|
|
|
|
|
|
|
|
void _listenOnLayoutChanged() {
|
|
|
|
_viewListener.start(
|
|
|
|
onViewUpdated: (result) {
|
|
|
|
result.fold(
|
|
|
|
(updatedView) {
|
|
|
|
if (_view.layout != updatedView.layout) {
|
|
|
|
_innerPlugin = _makeInnerPlugin(updatedView);
|
2023-06-03 13:40:12 +08:00
|
|
|
|
2023-06-01 20:23:27 +08:00
|
|
|
getIt<HomeStackManager>().setPlugin(_innerPlugin);
|
|
|
|
}
|
|
|
|
_view = updatedView;
|
|
|
|
},
|
|
|
|
(r) => null,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Plugin _makeInnerPlugin(ViewPB view) {
|
|
|
|
return makePlugin(pluginType: view.pluginType, data: view);
|
|
|
|
}
|