diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart index 3cf4001f1f..1b955f051e 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart @@ -44,7 +44,6 @@ class _AppFlowyEditorPageState extends State { ]; late final slashMenuItems = [ - dividerMenuItem, inlineGridMenuItem(documentBloc), referenceGridMenuItem, inlineBoardMenuItem(documentBloc), @@ -59,9 +58,6 @@ class _AppFlowyEditorPageState extends State { late final Map blockComponentBuilders = _customAppFlowyBlockComponentBuilders(); late final List characterShortcutEvents = [ - // divider - convertMinusesToDivider, - // code block ...codeBlockCharacterEvents, diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/cover/cover_image_picker_bloc.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/cover/cover_image_picker_bloc.dart index 630ea61b90..093b61dd13 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/cover/cover_image_picker_bloc.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/cover/cover_image_picker_bloc.dart @@ -137,13 +137,13 @@ class CoverImagePickerBloc } String _networkImageName(String url) { - return 'IMG_${DateTime.now().millisecondsSinceEpoch.toString()}.${_getExtention( + return 'IMG_${DateTime.now().millisecondsSinceEpoch.toString()}.${_getExtension( url, fromNetwork: true, )}'; } - String? _getExtention( + String? _getExtension( String path, { bool fromNetwork = false, }) { @@ -153,15 +153,22 @@ class CoverImagePickerBloc if (extension.isEmpty) { return null; } - ext = extension.substring(1); + ext = extension; } else { final uri = Uri.parse(path); - final paramters = uri.queryParameters; - final dl = paramters['dl']; - if (dl != null) { - ext = p.extension(dl).substring(1); + final parameters = uri.queryParameters; + if (path.contains('unsplash')) { + final dl = parameters['dl']; + if (dl != null) { + ext = p.extension(dl); + } + } else { + ext = p.extension(path); } } + if (ext != null && ext.isNotEmpty) { + ext = ext.substring(1); + } if (allowedExtensions.contains(ext)) { return ext; } @@ -169,7 +176,7 @@ class CoverImagePickerBloc } Future _validateURL(String path) async { - final extension = _getExtention(path, fromNetwork: true); + final extension = _getExtension(path, fromNetwork: true); if (extension == null) { return false; } diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_character_shortcut_event.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_character_shortcut_event.dart deleted file mode 100644 index d0987eccf1..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_character_shortcut_event.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/divider/divider_node_widget.dart'; -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:flutter/material.dart'; - -/// insert divider into a document by typing three minuses(-). -/// -/// - support -/// - desktop -/// - web -/// - mobile -/// -final CharacterShortcutEvent convertMinusesToDivider = CharacterShortcutEvent( - key: 'insert a divider', - character: '-', - handler: _convertMinusesToDividerHandler, -); - -CharacterShortcutEventHandler _convertMinusesToDividerHandler = - (editorState) async { - final selection = editorState.selection; - if (selection == null || !selection.isCollapsed) { - return false; - } - final path = selection.end.path; - final node = editorState.getNodeAtPath(path); - final delta = node?.delta; - if (node == null || delta == null) { - return false; - } - if (delta.toPlainText() != '--') { - return false; - } - final transaction = editorState.transaction - ..insertNode(path, dividerNode()) - ..insertNode(path, paragraphNode()) - ..deleteNode(node) - ..afterSelection = Selection.collapse(path, 0); - editorState.apply(transaction); - return true; -}; - -SelectionMenuItem dividerMenuItem = SelectionMenuItem( - name: 'Divider', - icon: (editorState, onSelected, style) => SelectableIconWidget( - icon: Icons.horizontal_rule, - isSelected: onSelected, - style: style, - ), - keywords: ['horizontal rule', 'divider'], - handler: (editorState, _, __) { - final selection = editorState.selection; - if (selection == null || !selection.isCollapsed) { - return; - } - final path = selection.end.path; - final node = editorState.getNodeAtPath(path); - final delta = node?.delta; - if (node == null || delta == null) { - return; - } - final insertedPath = delta.isEmpty ? path : path.next; - final transaction = editorState.transaction - ..insertNode(insertedPath, dividerNode()) - ..insertNode(insertedPath, paragraphNode()) - ..afterSelection = Selection.collapse(insertedPath.next, 0); - editorState.apply(transaction); - }, -); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_node_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_node_widget.dart deleted file mode 100644 index 18ec16fa48..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_node_widget.dart +++ /dev/null @@ -1,128 +0,0 @@ -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:flutter/material.dart'; - -class DividerBlockKeys { - const DividerBlockKeys._(); - - static const String type = 'divider'; -} - -// creating a new callout node -Node dividerNode() { - return Node( - type: DividerBlockKeys.type, - ); -} - -class DividerBlockComponentBuilder extends BlockComponentBuilder { - DividerBlockComponentBuilder({ - this.padding = const EdgeInsets.symmetric(vertical: 8.0), - this.lineColor = Colors.grey, - }); - - final EdgeInsets padding; - final Color lineColor; - - @override - BlockComponentWidget build(BlockComponentContext blockComponentContext) { - final node = blockComponentContext.node; - return DividerBlockComponentWidget( - key: node.key, - node: node, - padding: padding, - lineColor: lineColor, - showActions: showActions(node), - actionBuilder: (context, state) => actionBuilder( - blockComponentContext, - state, - ), - ); - } - - @override - bool validate(Node node) => node.children.isEmpty; -} - -class DividerBlockComponentWidget extends BlockComponentStatefulWidget { - const DividerBlockComponentWidget({ - super.key, - required super.node, - super.showActions, - super.actionBuilder, - super.configuration = const BlockComponentConfiguration(), - this.padding = const EdgeInsets.symmetric(vertical: 8.0), - this.lineColor = Colors.grey, - }); - - final EdgeInsets padding; - final Color lineColor; - - @override - State createState() => - _DividerBlockComponentWidgetState(); -} - -class _DividerBlockComponentWidgetState - extends State with SelectableMixin { - RenderBox get _renderBox => context.findRenderObject() as RenderBox; - - @override - Widget build(BuildContext context) { - Widget child = Padding( - padding: widget.padding, - child: Container( - height: 10, - alignment: Alignment.center, - child: Divider( - color: widget.lineColor, - thickness: 1, - ), - ), - ); - - if (widget.actionBuilder != null) { - child = BlockComponentActionWrapper( - node: widget.node, - actionBuilder: widget.actionBuilder!, - child: child, - ); - } - - return child; - } - - @override - Position start() => Position(path: widget.node.path, offset: 0); - - @override - Position end() => Position(path: widget.node.path, offset: 1); - - @override - Position getPositionInOffset(Offset start) => end(); - - @override - bool get shouldCursorBlink => false; - - @override - CursorStyle get cursorStyle => CursorStyle.cover; - - @override - Rect? getCursorRectInPosition(Position position) { - final size = _renderBox.size; - return Rect.fromLTWH(-size.width / 2.0, 0, size.width, size.height); - } - - @override - List getRectsInSelection(Selection selection) => - [Offset.zero & _renderBox.size]; - - @override - Selection getSelectionInRange(Offset start, Offset end) => Selection.single( - path: widget.node.path, - startOffset: 0, - endOffset: 1, - ); - - @override - Offset localToGlobal(Offset offset) => _renderBox.localToGlobal(offset); -} diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart index 387eeed81b..68b27850be 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart @@ -7,8 +7,6 @@ export 'code_block/code_block_shortcut_event.dart'; export 'cover/change_cover_popover_bloc.dart'; export 'cover/cover_node_widget.dart'; export 'cover/cover_image_picker.dart'; -export 'divider/divider_node_widget.dart'; -export 'divider/divider_character_shortcut_event.dart'; export 'emoji_picker/emoji_menu_item.dart'; export 'extensions/flowy_tint_extension.dart'; export 'grid/grid_menu_item.dart'; diff --git a/frontend/appflowy_flutter/pubspec.lock b/frontend/appflowy_flutter/pubspec.lock index c575c40566..b30f0cfb8f 100644 --- a/frontend/appflowy_flutter/pubspec.lock +++ b/frontend/appflowy_flutter/pubspec.lock @@ -52,10 +52,11 @@ packages: appflowy_editor: dependency: "direct main" description: - name: appflowy_editor - sha256: "559906bc150994c433ceb312333629d0f9a551ad95b4ce577352d6a007343cdc" - url: "https://pub.dev" - source: hosted + path: "." + ref: "7fe5bb8" + resolved-ref: "7fe5bb85d455416ddbce4bbf2afed1c434466eeb" + url: "https://github.com/AppFlowy-IO/appflowy-editor.git" + source: git version: "1.0.0" appflowy_popover: dependency: "direct main" @@ -684,10 +685,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.18.0" intl_utils: dependency: transitive description: @@ -812,10 +813,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "586678f20e112219ed0f73215f01bcdf1d769824ba2ebae45ad918a9bfde9bdb" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.2.0" meta: dependency: transitive description: @@ -1329,10 +1330,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" stack_trace: dependency: transitive description: @@ -1425,26 +1426,26 @@ packages: dependency: transitive description: name: test - sha256: "4f92f103ef63b1bbac6f4bd1930624fca81b2574464482512c4f0896319be575" + sha256: "3dac9aecf2c3991d09b9cdde4f98ded7b30804a88a0d7e4e7e1678e78d6b97f4" url: "https://pub.dev" source: hosted - version: "1.24.2" + version: "1.24.1" test_api: dependency: transitive description: name: test_api - sha256: daadc9baabec998b062c9091525aa95786508b1c48e9c30f1f891b8bf6ff2e64 + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb url: "https://pub.dev" source: hosted - version: "0.5.2" + version: "0.5.1" test_core: dependency: transitive description: name: test_core - sha256: "3642b184882f79e76ca57a9230fb971e494c3c1fd09c21ae3083ce891bcc0aa1" + sha256: "5138dbffb77b2289ecb12b81c11ba46036590b72a64a7a90d6ffb880f1a29e93" url: "https://pub.dev" source: hosted - version: "0.5.2" + version: "0.5.1" textfield_tags: dependency: "direct main" description: @@ -1617,10 +1618,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "518254c0d3ee20667a1feef39eefe037df87439851e4b3cb277e5b3f37afa2f0" + sha256: f6deed8ed625c52864792459709183da231ebf66ff0cf09e69b573227c377efe url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "11.3.0" watcher: dependency: transitive description: diff --git a/frontend/appflowy_flutter/pubspec.yaml b/frontend/appflowy_flutter/pubspec.yaml index 2fdbd11a67..0f715e932e 100644 --- a/frontend/appflowy_flutter/pubspec.yaml +++ b/frontend/appflowy_flutter/pubspec.yaml @@ -42,7 +42,11 @@ dependencies: git: url: https://github.com/AppFlowy-IO/appflowy-board.git ref: a183c57 - appflowy_editor: ^1.0.0 + # appflowy_editor: ^1.0.0 + appflowy_editor: + git: + url: https://github.com/AppFlowy-IO/appflowy-editor.git + ref: 7fe5bb8 appflowy_popover: path: packages/appflowy_popover