handle method

  1. @override
Future handle(
  1. MethodCall call
)
override

Implementation

@override
Future<dynamic> handle(MethodCall call) async {
  NLogger.i('Capturing target details, arguments: ${call.arguments}');

  final String label = call.arguments['LABEL'];
  final num screenHeight = call.arguments['SCREEN_HEIGHT'];
  final num screenWidth = call.arguments['SCREEN_WIDTH'];
  final num? statusBarHeight = call.arguments['STATUS_BAR_HEIGHT'];
  var devicePixelRatio = call.arguments["DPR"];

  NLogger.i('Searching for target with label: $label');
  NLogger.d(
    'Screen height: $screenHeight, Screen width: $screenWidth, status bar height: $statusBarHeight',
  );

  BuildContext? context = Nudge.nudgeNavigatorKey.currentContext;

  if (context == null) {
    NLogger.e('Nudge navigator key is null');
    return {'success': false};
  }

  // Use MediaQuery to get the initial size of the screen
  // This is a workaround to ensure we get the correct screen size
  Size initialSize = MediaQuery.of(context).size;
  NLogger.d(
    'Initial MediaQuery size using navigatorKey: $initialSize (Width: ${initialSize.width}, Height: ${initialSize.height})',
  );

  // Size? size = MediaQuery.maybeOf(context)?.size;
  Size size = getScreenSize();
  NLogger.d(
    'Initial MediaQuery size: $size (Width: ${size.width}, Height: ${size.height}) ::: getScreenSize',
  );

  if (defaultTargetPlatform == TargetPlatform.iOS) {
    final num? height = call.arguments['HEIGHT'];
    final num? width = call.arguments['WIDTH'];

    NLogger.d(
      'iOS specific size: Width: $width, Height: $height',
    );

    size = Size(
      width?.toDouble() ?? size.width,
      height?.toDouble() ?? size.height,
    );
  }

  BuildContext? mediaQueryContext = Nudge.currentContext
      ?.findAncestorStateOfType<NavigatorState>()
      ?.context;

  if (mediaQueryContext != null) {
    Size mediaQuerySize = MediaQuery.of(mediaQueryContext).size;
    NLogger.d(
      'MediaQuery size from currentContext: $mediaQuerySize (Width: ${mediaQuerySize.width}, Height: ${mediaQuerySize.height})',
    );
  } else {
    NLogger.e('MediaQuery context is null, using default size');
  }

  NLogger.d(
    'Final MediaQuery size: $size (Width: ${size.width}, Height: ${size.height})',
  );

  if (size == Size.zero) {
    // hideNudgeOverlay();
    NLogger.e('Screen size is zero, cannot proceed');
    // NudgeCoreV2NativeServices().invokeNativeMethod('sendComponentFailed', {});
    return {'success': false};
  }

  final num scaleX = screenWidth / size.width;
  final num scaleY = screenHeight / size.height;

  // final num scaleX = 720 / size.width;
  // final num scaleY = 1600 / size.height;

  NLogger.d(
    'Scale X: $scaleX, Scale Y: $scaleY, Device Pixel Ratio: $devicePixelRatio',
  );

  final Map<String, dynamic> targetDetails =
      await NudgeWidgetTracker.nativeFindWidgetPositionByLabel(
    label: label,
    scaleX: defaultTargetPlatform == TargetPlatform.iOS
        ? scaleX
        : devicePixelRatio,
    scaleY: defaultTargetPlatform == TargetPlatform.iOS
        ? scaleY
        : devicePixelRatio,
    statusBarHeight: 0,
    screenSize: size,
  );

  if (targetDetails['result']) {
    NLogger.i('Target found: $targetDetails');

    final Map<String, dynamic> response = {
      'message_type': 'SEND_TARGET_DETAILS',
      'data': targetDetails,
    };

    try {
      await NudgeCoreV2NativeServices().sendTargetDetails(response);
      return {
        'success': true,
      };
    } catch (e) {
      NLogger.e('Error sending target details: $e');
      // NudgeCoreV2NativeServices()
      //     .invokeNativeMethod('sendComponentFailed', {});
      return {'success': false};
    }
  } else {
    NLogger.i(
      'Target not found, please ensure that the widget exists on the screen',
    );

    // NudgeCoreV2NativeServices().invokeNativeMethod('sendComponentFailed', {});

    return {'success': false};
  }
}