浏览代码

fix: add cover image using url issue (#2733)

* fix: add cover image using url issue

* chore: update editor
Lucas.Xu 1 年之前
父节点
当前提交
f86a98cd51

+ 0 - 4
frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart

@@ -44,7 +44,6 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
   ];
 
   late final slashMenuItems = [
-    dividerMenuItem,
     inlineGridMenuItem(documentBloc),
     referenceGridMenuItem,
     inlineBoardMenuItem(documentBloc),
@@ -59,9 +58,6 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
   late final Map<String, BlockComponentBuilder> blockComponentBuilders =
       _customAppFlowyBlockComponentBuilders();
   late final List<CharacterShortcutEvent> characterShortcutEvents = [
-    // divider
-    convertMinusesToDivider,
-
     // code block
     ...codeBlockCharacterEvents,
 

+ 15 - 8
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<bool> _validateURL(String path) async {
-    final extension = _getExtention(path, fromNetwork: true);
+    final extension = _getExtension(path, fromNetwork: true);
     if (extension == null) {
       return false;
     }

+ 0 - 69
frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_character_shortcut_event.dart

@@ -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);
-  },
-);

+ 0 - 128
frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/divider/divider_node_widget.dart

@@ -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<DividerBlockComponentWidget> createState() =>
-      _DividerBlockComponentWidgetState();
-}
-
-class _DividerBlockComponentWidgetState
-    extends State<DividerBlockComponentWidget> 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<Rect> 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);
-}

+ 0 - 2
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';

+ 19 - 18
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:

+ 5 - 1
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