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

* fix: add cover image using url issue

* chore: update editor
This commit is contained in:
Lucas.Xu 2023-06-08 08:34:11 +08:00 committed by GitHub
parent 3e3bdb59ae
commit f86a98cd51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 39 additions and 230 deletions

View File

@ -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,

View File

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

View File

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

View File

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

View File

@ -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';

View File

@ -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:

View File

@ -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