This commit is contained in:
otsmr 2025-12-28 15:46:21 +01:00
parent 85d6bdfcc9
commit 4b5a4387d1
6 changed files with 48 additions and 28 deletions

View file

@ -87,7 +87,6 @@ Future<MediaFileService?> initializeMediaUpload(
Future<void> insertMediaFileInMessagesTable(
MediaFileService mediaService,
List<String> groupIds,
Future<Uint8List?>? imageStoreAwait,
) async {
await twonlyDB.mediaFilesDao.updateAllMediaFiles(
const MediaFilesCompanion(
@ -118,13 +117,6 @@ Future<void> insertMediaFileInMessagesTable(
}
}
if (imageStoreAwait != null) {
if (await imageStoreAwait == null) {
Log.error('image store as original did return false...');
return;
}
}
unawaited(startBackgroundMediaUpload(mediaService));
}

View file

@ -35,6 +35,7 @@ class BackgroundLayerData extends Layer {
required this.image,
});
ImageItem image;
bool imageLoaded = false;
}
class FilterLayerData extends Layer {

View file

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:twonly/src/views/camera/image_editor/data/layer.dart';
/// Main layer
class BackgroundLayer extends StatefulWidget {
const BackgroundLayer({
required this.layerData,
@ -23,7 +22,17 @@ class _BackgroundLayerState extends State<BackgroundLayer> {
height: widget.layerData.image.height.toDouble(),
// color: Theme.of(context).colorScheme.surface,
padding: EdgeInsets.zero,
child: Image.memory(widget.layerData.image.bytes),
child: Image.memory(
widget.layerData.image.bytes,
frameBuilder: (context, child, frame, wasSynchronouslyLoaded) {
if (wasSynchronouslyLoaded || frame != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
widget.layerData.imageLoaded = true;
});
}
return child;
},
),
);
}
}

View file

@ -64,6 +64,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
VideoPlayerController? videoController;
ImageItem currentImage = ImageItem();
ScreenshotController screenshotController = ScreenshotController();
Timer? _imageLoadingTimer;
MediaFileService get mediaService => widget.mediaFileService;
MediaFile get media => widget.mediaFileService.mediaFile;
@ -120,6 +121,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
isDraftMedia: Value(false),
),
);
_imageLoadingTimer?.cancel();
super.dispose();
}
@ -535,6 +537,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
}
});
setState(() {
layers.insert(
0,
BackgroundLayerData(
@ -542,11 +545,28 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
image: currentImage,
),
);
});
// It is important that the user can sending the image only when the image is fully loaded otherwise if the user
// will click on send before the image is painted the screenshot will be transparent..
_imageLoadingTimer =
Timer.periodic(const Duration(milliseconds: 10), (timer) {
final imageLayer = layers.first;
if (imageLayer is BackgroundLayerData) {
if (imageLayer.imageLoaded) {
timer.cancel();
Future.delayed(const Duration(milliseconds: 50), () {
Log.info(imageLayer.imageLoaded);
if (context.mounted) {
setState(() {
sendingOrLoadingImage = false;
loadingImage = false;
});
}
});
}
}
});
}
Future<void> sendImageToSinglePerson() async {
if (sendingOrLoadingImage) return;
@ -556,16 +576,16 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
if (!context.mounted) return;
// must be awaited so the widget for the screenshot is not already disposed when sending..
await storeImageAsOriginal();
// Insert media file into the messages database and start uploading process in the background
unawaited(
insertMediaFileInMessagesTable(
await insertMediaFileInMessagesTable(
mediaService,
[widget.sendToGroup!.groupId],
storeImageAsOriginal(),
),
);
if (context.mounted) {
if (mounted) {
Navigator.pop(context, true);
}
}

View file

@ -286,7 +286,6 @@ class _ShareImageView extends State<ShareImageView> {
await insertMediaFileInMessagesTable(
widget.mediaFileService,
widget.selectedGroupIds.toList(),
null,
);
if (context.mounted) {

View file

@ -151,7 +151,6 @@ class _MessageInputState extends State<MessageInput> {
await insertMediaFileInMessagesTable(
mediaFileService,
[widget.group.groupId],
null,
);
}