123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- library flowy_plugin;
- import 'package:appflowy/startup/plugin/plugin.dart';
- import 'package:appflowy/startup/startup.dart';
- import 'package:appflowy/workspace/presentation/home/home_stack.dart';
- import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
- import 'package:flutter/widgets.dart';
- export "./src/sandbox.dart";
- enum PluginType {
- editor,
- blank,
- trash,
- grid,
- board,
- calendar,
- }
- typedef PluginId = String;
- abstract class Plugin<T> {
- PluginId get id;
- PluginWidgetBuilder get widgetBuilder;
- PluginNotifier? get notifier => null;
- PluginType get pluginType;
- void dispose() {
- notifier?.dispose();
- }
- }
- abstract class PluginNotifier<T> {
- /// Notify if the plugin get deleted
- ValueNotifier<T> get isDeleted;
- void dispose() {}
- }
- abstract class PluginBuilder {
- Plugin build(dynamic data);
- String get menuName;
- String get menuIcon;
- /// The type of this [Plugin]. Each [Plugin] should have a unique [PluginType]
- PluginType get pluginType;
- /// The layoutType is used in the backend to determine the layout of the view.
- /// Currrently, AppFlowy supports 4 layout types: Document, Grid, Board, Calendar.
- ViewLayoutPB? get layoutType => ViewLayoutPB.Document;
- }
- abstract class PluginConfig {
- // Return false will disable the user to create it. For example, a trash plugin shouldn't be created by the user,
- bool get creatable => true;
- }
- abstract class PluginWidgetBuilder with NavigationItem {
- List<NavigationItem> get navigationItems;
- EdgeInsets get contentPadding =>
- const EdgeInsets.symmetric(horizontal: 40, vertical: 28);
- Widget buildWidget({PluginContext? context});
- }
- class PluginContext {
- // calls when widget of the plugin get deleted
- final Function(ViewPB, int?) onDeleted;
- PluginContext({required this.onDeleted});
- }
- void registerPlugin({required PluginBuilder builder, PluginConfig? config}) {
- getIt<PluginSandbox>()
- .registerPlugin(builder.pluginType, builder, config: config);
- }
- /// Make the correct plugin from the [pluginType] and [data]. If the plugin
- /// is not registered, it will return a blank plugin.
- Plugin makePlugin({required PluginType pluginType, dynamic data}) {
- final plugin = getIt<PluginSandbox>().buildPlugin(pluginType, data);
- return plugin;
- }
- List<PluginBuilder> pluginBuilders() {
- final pluginBuilders = getIt<PluginSandbox>().builders;
- final pluginConfigs = getIt<PluginSandbox>().pluginConfigs;
- return pluginBuilders.where(
- (builder) {
- final config = pluginConfigs[builder.pluginType]?.creatable;
- return config ?? true;
- },
- ).toList();
- }
- enum FlowyPluginException {
- invalidData,
- }
|