library flowy_plugin; import 'package:app_flowy/startup/plugin/plugin.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; import 'package:flowy_infra/notifier.dart'; import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart'; import 'package:flutter/widgets.dart'; export "./src/sandbox.dart"; enum PluginType { editor, blank, trash, grid, board, } // extension FlowyDefaultPluginExt on DefaultPlugin { // int type() { // switch (this) { // case DefaultPlugin.editor: // return 0; // case DefaultPlugin.blank: // return 1; // case DefaultPlugin.trash: // return 2; // case DefaultPlugin.grid: // return 3; // case DefaultPlugin.board: // return 4; // } // } // } // typedef PluginType = int; typedef PluginId = String; abstract class Plugin { PluginId get id; PluginDisplay get display; PluginType get ty; void dispose() {} } abstract class PluginBuilder { Plugin build(dynamic data); String get menuName; PluginType get pluginType; ViewDataTypePB get dataType => ViewDataTypePB.Text; ViewLayoutTypePB? get subDataType => ViewLayoutTypePB.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 PluginDisplay with NavigationItem { List get navigationItems; PublishNotifier? get notifier => null; Widget buildWidget(); } void registerPlugin({required PluginBuilder builder, PluginConfig? config}) { getIt() .registerPlugin(builder.pluginType, builder, config: config); } Plugin makePlugin({required PluginType pluginType, dynamic data}) { final plugin = getIt().buildPlugin(pluginType, data); return plugin; } List pluginBuilders() { final pluginBuilders = getIt().builders; final pluginConfigs = getIt().pluginConfigs; return pluginBuilders.where( (builder) { final config = pluginConfigs[builder.pluginType]?.creatable; return config ?? true; }, ).toList(); } enum FlowyPluginException { invalidData, }