diff --git a/example/assets/sample_data.json b/example/assets/sample_data.json index 685b833a..99991e5b 100644 --- a/example/assets/sample_data.json +++ b/example/assets/sample_data.json @@ -19,7 +19,7 @@ }, { "insert": { - "video": "https://www.youtube.com/watch?v=V4hgdKhIqtc&list=PLbhaS_83B97s78HsDTtplRTEhcFsqSqIK&index=1" + "video": "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4" } }, { diff --git a/lib/src/models/documents/document.dart b/lib/src/models/documents/document.dart index 527d220b..b527551a 100644 --- a/lib/src/models/documents/document.dart +++ b/lib/src/models/documents/document.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'package:tuple/tuple.dart'; @@ -209,16 +210,19 @@ class Document { static void _autoAppendNewlineAfterImage( int i, List ops, Operation op, Delta res) { - final nextOpIsImage = - i + 1 < ops.length && ops[i + 1].isInsert && ops[i + 1].data is! String; + final nextOpIsImage = i + 1 < ops.length && + ops[i + 1].isInsert && + ops[i + 1].data is Map && + (ops[i + 1].data as Map).containsKey('image'); if (nextOpIsImage && op.data is String && (op.data as String).isNotEmpty && !(op.data as String).endsWith('\n')) { res.push(Operation.insert('\n')); } - // Currently embed is equivalent to image and hence `is! String` - final opInsertImage = op.isInsert && op.data is! String; + // embed could be image or video + final opInsertImage = + op.isInsert && op.data is Map && (op.data as Map).containsKey('image'); final nextOpIsLineBreak = i + 1 < ops.length && ops[i + 1].isInsert && ops[i + 1].data is String && diff --git a/lib/src/widgets/editor.dart b/lib/src/widgets/editor.dart index 59a031a0..68370e91 100644 --- a/lib/src/widgets/editor.dart +++ b/lib/src/widgets/editor.dart @@ -25,6 +25,7 @@ import 'delegate.dart'; import 'image.dart'; import 'raw_editor.dart'; import 'text_selection.dart'; +import 'video_app.dart'; const linkPrefixes = [ 'mailto:', // email @@ -105,6 +106,9 @@ Widget _defaultEmbedBuilder(BuildContext context, leaf.Embed node) { : isBase64(imageUrl) ? Image.memory(base64.decode(imageUrl)) : Image.file(io.File(imageUrl)); + case 'video': + final videoUrl = node.value.data; + return VideoApp(videoUrl: videoUrl); default: throw UnimplementedError( 'Embeddable type "${node.value.type}" is not supported by default '