execute method

  1. @override
Future<void> execute(
  1. BuildContext context,
  2. ScopeManager scopeManager
)
override

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