| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | library flowy_plugin; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  | import 'package:app_flowy/startup/plugin/plugin.dart'; | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | import 'package:app_flowy/startup/startup.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-01 16:05:45 +08:00
										 |  |  | import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  | import 'package:flowy_infra/notifier.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-04 15:00:54 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart'; | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | import 'package:flutter/widgets.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export "./src/sandbox.dart"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-18 19:32:08 +08:00
										 |  |  | enum PluginType { | 
					
						
							| 
									
										
										
										
											2022-08-10 17:59:28 +08:00
										 |  |  |   editor, | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   blank, | 
					
						
							|  |  |  |   trash, | 
					
						
							| 
									
										
										
										
											2022-03-04 08:22:49 +08:00
										 |  |  |   grid, | 
					
						
							| 
									
										
										
										
											2022-06-11 15:51:53 +08:00
										 |  |  |   board, | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-18 19:32:08 +08:00
										 |  |  | // 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;
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:05:45 +08:00
										 |  |  | typedef PluginId = String; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | abstract class Plugin { | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   PluginId get id; | 
					
						
							| 
									
										
										
										
											2022-03-01 16:05:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   PluginDisplay get display; | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   PluginType get ty; | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   void dispose() {} | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | abstract class PluginBuilder { | 
					
						
							|  |  |  |   Plugin build(dynamic data); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:05:45 +08:00
										 |  |  |   String get menuName; | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   PluginType get pluginType; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-18 19:32:08 +08:00
										 |  |  |   ViewDataTypePB get dataType => ViewDataTypePB.Text; | 
					
						
							| 
									
										
										
										
											2022-08-10 17:59:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-23 13:13:01 +08:00
										 |  |  |   ViewLayoutTypePB? get subDataType => ViewLayoutTypePB.Document; | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 11:22:39 +08:00
										 |  |  | abstract class PluginConfig { | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   // Return false will disable the user to create it. For example, a trash plugin shouldn't be created by the user,
 | 
					
						
							| 
									
										
										
										
											2022-03-01 11:22:39 +08:00
										 |  |  |   bool get creatable => true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  | abstract class PluginDisplay<T> with NavigationItem { | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  |   List<NavigationItem> get navigationItems; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |   PublishNotifier<T>? get notifier => null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  |   Widget buildWidget(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 11:22:39 +08:00
										 |  |  | void registerPlugin({required PluginBuilder builder, PluginConfig? config}) { | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |   getIt<PluginSandbox>() | 
					
						
							|  |  |  |       .registerPlugin(builder.pluginType, builder, config: config); | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 10:25:21 +08:00
										 |  |  | Plugin makePlugin({required PluginType pluginType, dynamic data}) { | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  |   final plugin = getIt<PluginSandbox>().buildPlugin(pluginType, data); | 
					
						
							|  |  |  |   return plugin; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 11:22:39 +08:00
										 |  |  | 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(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | enum FlowyPluginException { | 
					
						
							|  |  |  |   invalidData, | 
					
						
							|  |  |  | } |