Refactor code

pull/593/head
X Code 3 years ago
parent a399b529e9
commit 8d04a8ed3e
  1. 1076
      example/assets/sample_data.json
  2. 3
      lib/src/utils/simple_dialog_item.dart
  3. 87
      lib/src/widgets/editor.dart
  4. 39
      lib/src/widgets/embeds/image.dart

File diff suppressed because one or more lines are too long

@ -23,7 +23,8 @@ class SimpleDialogItem extends StatelessWidget {
Icon(icon, size: 36, color: color), Icon(icon, size: 36, color: color),
Padding( Padding(
padding: const EdgeInsetsDirectional.only(start: 16), padding: const EdgeInsetsDirectional.only(start: 16),
child: Text(text), child:
Text(text, style: const TextStyle(fontWeight: FontWeight.bold)),
), ),
], ],
), ),

@ -1,5 +1,3 @@
import 'dart:convert';
import 'dart:io' as io;
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -9,7 +7,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gallery_saver/gallery_saver.dart'; import 'package:gallery_saver/gallery_saver.dart';
import 'package:string_validator/string_validator.dart';
import '../models/documents/document.dart'; import '../models/documents/document.dart';
import '../models/documents/nodes/container.dart' as container_node; import '../models/documents/nodes/container.dart' as container_node;
@ -189,63 +186,53 @@ Widget defaultEmbedBuilder(
final a = getAlignment(_attrs['mobileAlignment']); final a = getAlignment(_attrs['mobileAlignment']);
image = Padding( image = Padding(
padding: EdgeInsets.all(m), padding: EdgeInsets.all(m),
child: imageUrl.startsWith('http') child: imageByUrl(imageUrl, width: w, height: h, alignment: a));
? Image.network(imageUrl, width: w, height: h, alignment: a)
: isBase64(imageUrl)
? Image.memory(base64.decode(imageUrl),
width: w, height: h, alignment: a)
: Image.file(io.File(imageUrl),
width: w, height: h, alignment: a));
} }
} }
image ??= imageUrl.startsWith('http') image ??= imageByUrl(imageUrl);
? Image.network(imageUrl)
: isBase64(imageUrl)
? Image.memory(base64.decode(imageUrl))
: Image.file(io.File(imageUrl));
if (!readOnly || !isMobile()) { if (!readOnly || !isMobile() || isImageBase64(imageUrl)) {
return image; return image;
} }
/// We provide these option menu only for mobile platform /// We provide option menu only for mobile platform excluding base64
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
showDialog( showDialog(
context: context, context: context,
builder: (context) => SimpleDialog(children: [ builder: (context) => Padding(
SimpleDialogItem( padding: const EdgeInsets.fromLTRB(50, 0, 50, 0),
icon: Icons.save, child: SimpleDialog(
color: Colors.greenAccent, shape: const RoundedRectangleBorder(
text: 'Save', borderRadius:
onPressed: () { BorderRadius.all(Radius.circular(10))),
// TODO: handle base64 and etc. children: [
GallerySaver.saveImage(imageUrl).then((_) => SimpleDialogItem(
ScaffoldMessenger.of(context).showSnackBar( icon: Icons.save,
const SnackBar(content: Text('Saved')))); color: Colors.greenAccent,
}, text: 'Save',
), onPressed: () {
SimpleDialogItem( // TODO: improve this
icon: Icons.zoom_in, GallerySaver.saveImage(imageUrl).then((_) =>
color: Colors.cyanAccent, ScaffoldMessenger.of(context).showSnackBar(
text: 'Zoom', const SnackBar(
onPressed: () { content: Text('Saved'))));
Navigator.push( },
context, ),
MaterialPageRoute( SimpleDialogItem(
builder: (context) => ImageTapWrapper( icon: Icons.zoom_in,
imageProvider: imageUrl color: Colors.cyanAccent,
.startsWith('http') text: 'Zoom',
? NetworkImage(imageUrl) onPressed: () {
: isBase64(imageUrl) Navigator.push(
? Image.memory( context,
base64.decode(imageUrl)) MaterialPageRoute(
as ImageProvider<Object>? builder: (context) => ImageTapWrapper(
: FileImage(io.File(imageUrl)), imageUrl: imageUrl)));
))); },
}, )
) ]),
])); ));
}, },
child: image); child: image);
case 'video': case 'video':

@ -1,12 +1,45 @@
import 'dart:convert';
import 'dart:io' as io;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view.dart';
import 'package:string_validator/string_validator.dart';
bool isImageBase64(String imageUrl) {
return !imageUrl.startsWith('http') && isBase64(imageUrl);
}
Widget imageByUrl(String imageUrl,
{double? width,
double? height,
AlignmentGeometry alignment = Alignment.center}) {
if (isImageBase64(imageUrl)) {
return Image.memory(base64.decode(imageUrl),
width: width, height: height, alignment: alignment);
}
if (imageUrl.startsWith('http')) {
return Image.network(imageUrl,
width: width, height: height, alignment: alignment);
}
return Image.file(io.File(imageUrl),
width: width, height: height, alignment: alignment);
}
class ImageTapWrapper extends StatelessWidget { class ImageTapWrapper extends StatelessWidget {
const ImageTapWrapper({ const ImageTapWrapper({
this.imageProvider, required this.imageUrl,
}); });
final ImageProvider? imageProvider; final String imageUrl;
ImageProvider _imageProviderByUrl(String imageUrl) {
if (imageUrl.startsWith('http')) {
return NetworkImage(imageUrl);
}
return FileImage(io.File(imageUrl));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -18,7 +51,7 @@ class ImageTapWrapper extends StatelessWidget {
child: Stack( child: Stack(
children: [ children: [
PhotoView( PhotoView(
imageProvider: imageProvider, imageProvider: _imageProviderByUrl(imageUrl),
loadingBuilder: (context, event) { loadingBuilder: (context, event) {
return Container( return Container(
color: Colors.black, color: Colors.black,

Loading…
Cancel
Save