getQrCode method

  1. @override
Future<QrCodeImage?> getQrCode()
inherited

Implementation

@override
Future<QrCodeImage?> getQrCode() async {
  try {
    if (Platform.isWindows) {
      final hasCanvas = await evaluateJs(
            "document.querySelector('canvas') != null",
            tryPromise: false,
          ) ==
          true;
      if (!hasCanvas) {
        await Future.delayed(const Duration(seconds: 5));
      }
    }

    final result = await evaluateJs(
      '''
      (async function()  {
        try {
          const canvas = document.querySelector('canvas');
          if (!canvas) return null;

          // Wait for canvas content if it's empty
          if (canvas.width <= 1 || canvas.height <= 1) {
             await new Promise(resolve => setTimeout(resolve, 1000));
          }

          const selectorUrl = canvas.closest('[data-ref]');
          return {
            'base64Image': canvas.toDataURL(),
            'urlCode': selectorUrl ? selectorUrl.getAttribute('data-ref') : null,
          };
        } catch(e) {
          return null;
        }
      })()
      ''',
      tryPromise: true,
    );

    if (result == null || result is! Map) return null;

    return QrCodeImage(
      base64Image: result['base64Image'],
      urlCode: result['urlCode'],
    );
  } catch (e) {
    WhatsappLogger.log("QrCodeFetchingError: $e");
    return null;
  }
}