abrirScannerComFallback function

Future<void> abrirScannerComFallback(
  1. BuildContext context,
  2. WebViewController controller
)

Implementation

Future<void> abrirScannerComFallback(
  BuildContext context,
  WebViewController controller,
) async {
  print('Platform.isIOS ${Platform.isIOS}');
  if (Platform.isIOS) {
    await Navigator.of(context).push(
      MaterialPageRoute(
        builder:
            (_) => BeMallQRScannerPage(
              onDetect: (
                String? qrCode,
                String? imagePath,
                Uint8List? imageBytes,
              ) async {
                final imageBase64 =
                    imagePath != null && imagePath.isNotEmpty
                        ? base64Encode(await XFile(imagePath).readAsBytes())
                        : '';
                DebugLogger.logPostMessageToPWA(
                  qrCode,
                  imagePath ?? '',
                  imageBase64,
                );

                final js = '''
              (function() {
                try {
                  const base64 = "${imageBase64}";
                  const byteCharacters = atob(base64);
                  const byteNumbers = new Array(byteCharacters.length);
                  for (let i = 0; i < byteCharacters.length; i++) {
                    byteNumbers[i] = byteCharacters.charCodeAt(i);
                  }
                  const byteArray = new Uint8Array(byteNumbers);
                  const blob = new Blob([byteArray], { type: 'image/jpeg' });
                  const file = new File([blob], 'cupom.jpg', { type: 'image/jpeg' });
                  const dataTransfer = new DataTransfer();
                  dataTransfer.items.add(file);
                  const fileList = dataTransfer.files;

                  const eventData = {
                    qrcode: "${qrCode ?? ''}",
                    imageBase64: base64,
                    fileList,
                  };

                  if (typeof window.onBemallSdkData === 'function') {
                    window.onBemallSdkData(eventData);
                  } else {
                    window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: eventData }));
                  }

                  if ("${qrCode ?? ''}" !== '') {
                    document.dispatchEvent(new CustomEvent('qrCodeDetected', {
                      detail: { qrcode: "${qrCode ?? ''}", timestamp: new Date().toISOString() }
                    }));
                  }
                } catch (e) {
                  window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: 'Erro ao processar imagem base64 no WebView' }));
                  console.error('Erro ao processar imagem base64 no WebView', e);
                }
              })();
            ''';

                await controller.runJavaScript(js);
              },
            ),
      ),
    );
  } else {
    // ===== Android (e outros): mantêm o fluxo atual =====
    await Navigator.of(context).push(
      MaterialPageRoute(
        builder:
            (_) => QRCameraScannerWidget(
              onDetect: (String? qrCode, String? imagePath) async {
                // Se vier path, lê bytes para base64 (mantendo seu comportamento atual)
                final imageBase64 =
                    imagePath != null && imagePath.isNotEmpty
                        ? base64Encode(await XFile(imagePath).readAsBytes())
                        : '';

                DebugLogger.logPostMessageToPWA(
                  qrCode,
                  imagePath ?? '',
                  imageBase64,
                );

                final js = '''
              (function() {
                try {
                  const base64 = "${imageBase64}";
                  const byteCharacters = atob(base64);
                  const byteNumbers = new Array(byteCharacters.length);
                  for (let i = 0; i < byteCharacters.length; i++) {
                    byteNumbers[i] = byteCharacters.charCodeAt(i);
                  }
                  const byteArray = new Uint8Array(byteNumbers);
                  const blob = new Blob([byteArray], { type: 'image/jpeg' });

                  const file = new File([blob], 'cupom.jpg', { type: 'image/jpeg' });
                  const dataTransfer = new DataTransfer();
                  dataTransfer.items.add(file);

                  const fileList = dataTransfer.files;
                  const eventData = {
                    qrcode: "${qrCode ?? ''}",
                    imageBase64: base64,
                    fileList,
                  };

                  if (typeof window.onBemallSdkData === 'function') {
                    window.onBemallSdkData(eventData);
                  } else {
                    window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: eventData }));
                  }

                  if ("${qrCode ?? ''}" !== '') {
                    document.dispatchEvent(new CustomEvent('qrCodeDetected', {
                      detail: { qrcode: "${qrCode ?? ''}", timestamp: new Date().toISOString() }
                    }));
                  }
                } catch (e) {
                  window.dispatchEvent(new CustomEvent('bemallSdkData', { detail: 'Erro ao processar imagem base64 no WebView' }));
                  console.error('Erro ao processar imagem base64 no WebView', e);
                }
              })();
            ''';

                await controller.runJavaScript(js);
              },
            ),
      ),
    );
  }
}