execute method
TODO: each Action does all the execution in here use DataContext to eval properties. ScopeManager should be refactored so it contains the update data context (its DataContext might not have the latest data)
Implementation
@override
Future<void> execute(BuildContext context, ScopeManager scopeManager) async {
try {
final box = context.findRenderObject() as RenderBox?;
if (box == null) return;
final sharePositionOrigin = box.localToGlobal(Offset.zero) & box.size;
final evaluatedText =
scopeManager.dataContext.eval(_text)?.toString() ?? '';
final evaluatedTitle =
Utils.optionalString(scopeManager.dataContext.eval(_title));
// Handle file sharing
if (_files != null) {
final evaluatedFiles = scopeManager.dataContext.eval(_files);
if (evaluatedFiles != null) {
final filesList =
evaluatedFiles is List ? evaluatedFiles : [evaluatedFiles];
final List<XFile> xFiles = [];
// Create XFiles
for (var file in filesList) {
final xFile = createXFile(file);
if (xFile != null) {
xFiles.add(xFile);
}
}
// Share files if any were created successfully
if (xFiles.isNotEmpty) {
try {
final result = await Share.shareXFiles(
xFiles,
text: evaluatedText,
subject: evaluatedTitle ?? '',
sharePositionOrigin: sharePositionOrigin,
);
// Handle share result
if (result.status == ShareResultStatus.success) {
debugPrint('Share completed successfully: ${result.raw}');
} else {
debugPrint('Share completed with status: ${result.status}');
}
return;
} catch (e) {
debugPrint('Error sharing files: $e');
if (kIsWeb) {
// On web, fall back to sharing just the text
await Share.share(
evaluatedText,
subject: evaluatedTitle ?? '',
sharePositionOrigin: sharePositionOrigin,
);
return;
}
rethrow;
}
}
}
}
// Fall back to sharing just text if no files or file sharing failed
if (evaluatedText.isNotEmpty) {
final result = await Share.share(
evaluatedText,
subject: evaluatedTitle ?? '',
sharePositionOrigin: sharePositionOrigin,
);
if (result.status == ShareResultStatus.success) {
debugPrint('Text share completed successfully: ${result.raw}');
} else {
debugPrint('Text share completed with status: ${result.status}');
}
}
} catch (e) {
debugPrint('ShareAction failed: $e');
rethrow;
}
}