| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | library flowy_plugin; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'package:app_flowy/plugin/plugin.dart'; | 
					
						
							|  |  |  | 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-03-02 11:38:22 +08:00
										 |  |  | enum DefaultPlugin { | 
					
						
							| 
									
										
										
										
											2022-03-05 10:59:44 +08:00
										 |  |  |   quill, | 
					
						
							| 
									
										
										
										
											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-03-02 11:38:22 +08:00
										 |  |  | extension FlowyDefaultPluginExt on DefaultPlugin { | 
					
						
							|  |  |  |   int type() { | 
					
						
							|  |  |  |     switch (this) { | 
					
						
							| 
									
										
										
										
											2022-03-05 10:59:44 +08:00
										 |  |  |       case DefaultPlugin.quill: | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |       case DefaultPlugin.blank: | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |       case DefaultPlugin.trash: | 
					
						
							|  |  |  |         return 2; | 
					
						
							| 
									
										
										
										
											2022-03-04 08:22:49 +08:00
										 |  |  |       case DefaultPlugin.grid: | 
					
						
							|  |  |  |         return 3; | 
					
						
							| 
									
										
										
										
											2022-06-11 15:51:53 +08:00
										 |  |  |       case DefaultPlugin.board: | 
					
						
							|  |  |  |         return 4; | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-02-28 22:38:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-02 11:38:22 +08:00
										 |  |  | typedef PluginType = int; | 
					
						
							|  |  |  | typedef PluginDataType = ViewDataType; | 
					
						
							| 
									
										
										
										
											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-03-14 17:24:25 +08:00
										 |  |  |   ViewDataType get dataType => ViewDataType.TextBlock; | 
					
						
							| 
									
										
										
										
											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}) { | 
					
						
							|  |  |  |   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, | 
					
						
							|  |  |  | } |