From 9b86e0637722fae0b42504825ce203cc4359aaa0 Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 5 Aug 2022 19:42:39 +0800 Subject: [PATCH] feat: implement video plugin --- .../flowy_editor/example/assets/example.json | 6 + .../flowy_editor/example/lib/main.dart | 2 + .../lib/plugin/youtube_link_node_widget.dart | 105 ++++++++++++ .../Flutter/GeneratedPluginRegistrant.swift | 2 + .../flowy_editor/example/macos/Podfile.lock | 6 + .../flowy_editor/example/pubspec.lock | 161 ++++++++++++++++++ .../flowy_editor/example/pubspec.yaml | 2 + 7 files changed, 284 insertions(+) create mode 100644 frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart diff --git a/frontend/app_flowy/packages/flowy_editor/example/assets/example.json b/frontend/app_flowy/packages/flowy_editor/example/assets/example.json index b6fc3467dc..e7d1d86eac 100644 --- a/frontend/app_flowy/packages/flowy_editor/example/assets/example.json +++ b/frontend/app_flowy/packages/flowy_editor/example/assets/example.json @@ -9,6 +9,12 @@ "image_src": "https://s1.ax1x.com/2022/07/28/vCgz1x.png" } }, + { + "type": "youtube_link", + "attributes": { + "youtube_link": "https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4" + } + }, { "type": "text", "delta": [ diff --git a/frontend/app_flowy/packages/flowy_editor/example/lib/main.dart b/frontend/app_flowy/packages/flowy_editor/example/lib/main.dart index 856c07e900..575bd83fbe 100644 --- a/frontend/app_flowy/packages/flowy_editor/example/lib/main.dart +++ b/frontend/app_flowy/packages/flowy_editor/example/lib/main.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:example/expandable_floating_action_button.dart'; import 'package:example/plugin/image_node_widget.dart'; +import 'package:example/plugin/youtube_link_node_widget.dart'; import 'package:flutter/material.dart'; import 'package:flowy_editor/flowy_editor.dart'; import 'package:flutter/services.dart'; @@ -164,6 +165,7 @@ class _MyHomePageState extends State { keyEventHandlers: const [], customBuilders: { 'image': ImageNodeBuilder(), + 'youtube_link': YouTubeLinkNodeBuilder() }, ), // shortcuts: [ diff --git a/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart b/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart new file mode 100644 index 0000000000..10787db2a7 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart @@ -0,0 +1,105 @@ +import 'package:flowy_editor/flowy_editor.dart'; +import 'package:flutter/material.dart'; +import 'package:pod_player/pod_player.dart'; + +class YouTubeLinkNodeBuilder extends NodeWidgetBuilder { + @override + Widget build(NodeWidgetContext context) { + return LinkNodeWidget( + key: context.node.key, + node: context.node, + editorState: context.editorState, + ); + } + + @override + NodeValidator get nodeValidator => ((node) { + return node.type == 'youtube_link'; + }); +} + +class LinkNodeWidget extends StatefulWidget { + final Node node; + final EditorState editorState; + + const LinkNodeWidget({ + Key? key, + required this.node, + required this.editorState, + }) : super(key: key); + + @override + State createState() => _YouTubeLinkNodeWidgetState(); +} + +class _YouTubeLinkNodeWidgetState extends State with Selectable { + Node get node => widget.node; + EditorState get editorState => widget.editorState; + String get src => widget.node.attributes['youtube_link'] as String; + + @override + Position end() { + // TODO: implement end + throw UnimplementedError(); + } + + @override + Position start() { + // TODO: implement start + throw UnimplementedError(); + } + + @override + List getRectsInSelection(Selection selection) { + // TODO: implement getRectsInSelection + throw UnimplementedError(); + } + + @override + Selection getSelectionInRange(Offset start, Offset end) { + // TODO: implement getSelectionInRange + throw UnimplementedError(); + } + + @override + Offset localToGlobal(Offset offset) { + throw UnimplementedError(); + } + + @override + Rect getCursorRectInPosition(Position position) { + // TODO: implement getCursorRectInPosition + throw UnimplementedError(); + } + + @override + Position getPositionInOffset(Offset start) { + // TODO: implement getPositionInOffset + throw UnimplementedError(); + } + + @override + Widget build(BuildContext context) { + return _build(context); + } + + late final PodPlayerController controller; + +@override + void initState() { + controller = PodPlayerController( + playVideoFrom: PlayVideoFrom.network( + src, + ), + )..initialise(); + super.initState(); + } + + Widget _build(BuildContext context) { + return Column( + children: [ + PodVideoPlayer(controller: controller), + ], + ); + } +} diff --git a/frontend/app_flowy/packages/flowy_editor/example/macos/Flutter/GeneratedPluginRegistrant.swift b/frontend/app_flowy/packages/flowy_editor/example/macos/Flutter/GeneratedPluginRegistrant.swift index 0dc858f3c7..cc167443dc 100644 --- a/frontend/app_flowy/packages/flowy_editor/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/frontend/app_flowy/packages/flowy_editor/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,8 +7,10 @@ import Foundation import rich_clipboard_macos import url_launcher_macos +import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { RichClipboardPlugin.register(with: registry.registrar(forPlugin: "RichClipboardPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/frontend/app_flowy/packages/flowy_editor/example/macos/Podfile.lock b/frontend/app_flowy/packages/flowy_editor/example/macos/Podfile.lock index 93389ef3ec..d3a1dd3611 100644 --- a/frontend/app_flowy/packages/flowy_editor/example/macos/Podfile.lock +++ b/frontend/app_flowy/packages/flowy_editor/example/macos/Podfile.lock @@ -4,11 +4,14 @@ PODS: - FlutterMacOS - url_launcher_macos (0.0.1): - FlutterMacOS + - wakelock_macos (0.0.1): + - FlutterMacOS DEPENDENCIES: - FlutterMacOS (from `Flutter/ephemeral`) - rich_clipboard_macos (from `Flutter/ephemeral/.symlinks/plugins/rich_clipboard_macos/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) EXTERNAL SOURCES: FlutterMacOS: @@ -17,11 +20,14 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/rich_clipboard_macos/macos url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + wakelock_macos: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos SPEC CHECKSUMS: FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 rich_clipboard_macos: 43364b66b9dc69d203eb8dd6d758e2d12e02723c url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 + wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c diff --git a/frontend/app_flowy/packages/flowy_editor/example/pubspec.lock b/frontend/app_flowy/packages/flowy_editor/example/pubspec.lock index a7eb6e1446..f86e34c312 100644 --- a/frontend/app_flowy/packages/flowy_editor/example/pubspec.lock +++ b/frontend/app_flowy/packages/flowy_editor/example/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.1" async: dependency: transitive description: @@ -43,6 +50,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" csslib: dependency: transitive description: @@ -114,6 +128,20 @@ packages: description: flutter source: sdk version: "0.0.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + get: + dependency: transitive + description: + name: get + url: "https://pub.dartlang.org" + source: hosted + version: "4.6.5" html: dependency: transitive description: @@ -121,6 +149,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.15.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.5" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1" js: dependency: transitive description: @@ -128,6 +170,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.4" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.6.0" lints: dependency: transitive description: @@ -135,6 +184,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + lottie: + dependency: transitive + description: + name: lottie + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.1" matcher: dependency: transitive description: @@ -198,6 +254,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + pod_player: + dependency: "direct main" + description: + name: pod_player + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.8" provider: dependency: "direct main" description: @@ -308,6 +371,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.9" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + universal_html: + dependency: transitive + description: + name: universal_html + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + universal_io: + dependency: transitive + description: + name: universal_io + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" url_launcher: dependency: "direct main" description: @@ -371,6 +455,76 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + video_player: + dependency: "direct main" + description: + name: video_player + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.5" + video_player_android: + dependency: transitive + description: + name: video_player_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.8" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.5" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.3" + video_player_web: + dependency: transitive + description: + name: video_player_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.12" + wakelock: + dependency: transitive + description: + name: wakelock + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.2" + wakelock_macos: + dependency: transitive + description: + name: wakelock_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" + wakelock_platform_interface: + dependency: transitive + description: + name: wakelock_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.0" + wakelock_web: + dependency: transitive + description: + name: wakelock_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" + wakelock_windows: + dependency: transitive + description: + name: wakelock_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" win32: dependency: transitive description: @@ -385,6 +539,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.0" + youtube_explode_dart: + dependency: transitive + description: + name: youtube_explode_dart + url: "https://pub.dartlang.org" + source: hosted + version: "1.12.0" sdks: dart: ">=2.17.0 <3.0.0" flutter: ">=3.0.0" diff --git a/frontend/app_flowy/packages/flowy_editor/example/pubspec.yaml b/frontend/app_flowy/packages/flowy_editor/example/pubspec.yaml index 0c58de8b7d..cb66541a86 100644 --- a/frontend/app_flowy/packages/flowy_editor/example/pubspec.yaml +++ b/frontend/app_flowy/packages/flowy_editor/example/pubspec.yaml @@ -38,6 +38,8 @@ dependencies: path: ../ provider: ^6.0.3 url_launcher: ^6.1.5 + video_player: ^2.4.5 + pod_player: 0.0.8 flutter_inappwebview: ^5.4.3+7 dev_dependencies: