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