handleMessage function

void handleMessage(
  1. String message, {
  2. dynamic onLoad()?,
  3. dynamic onComplete(
    1. dynamic
    )?,
  4. dynamic onCancel()?,
  5. dynamic onError(
    1. String
    )?,
})

Handles messages from the WebView and calls appropriate callbacks

Implementation

void handleMessage(
  String message, {
  Function()? onLoad,
  Function(dynamic)? onComplete,
  Function()? onCancel,
  Function(String)? onError,
}) {
  try {
    final Map<String, dynamic> payload = jsonDecode(message);

    if (payload['type'] == null || payload['type'] is! String) {
      return;
    }

    switch (payload['type']) {
      case 'complete':
        // Handle the completion data from the nested data field
        final dynamic data = payload['data'];
        if (data != null && data is Map<String, dynamic>) {
          // Check if this is an AA flow completion
          if (data['type'] == 'AA' && data['flowCompleted'] == true) {
            onComplete?.call(data);
          } else {
            // Handle other types of completion
            onComplete?.call(data);
          }
        } else {
          onComplete?.call(payload['data']);
        }
        break;
      case 'AA':
        // Handle direct AA messages (both approved and rejected)
        if (payload['flowCompleted'] == true) {
          onComplete?.call(payload);
        }
        break;
      case 'error':
        // Handle error data and pass it to onError callback
        final errorMessage = payload['errorMessage'] ?? payload['error'] ?? 'Unknown error from WebView';
        final Map<String, dynamic> errorData = {
          'type': payload['type'],
          'status': payload['status'] ?? 'error',
          'flowCompleted': payload['flowCompleted'] ?? false,
          'errorCode': payload['errorCode'],
          'errorMessage': errorMessage,
          'errorType': payload['errorType'] ?? 'unknown',
          'statusCode': payload['statusCode'],
          'timestamp': payload['timestamp'] ?? DateTime.now().toIso8601String(),
          'userAgent': payload['userAgent'],
          'url': payload['url'],
          'stack': payload['stack'],
          'consentHandle': payload['consentHandle'],
          'redirectUrl': payload['redirectUrl'],
        };
        onError?.call(jsonEncode(errorData));
        break;
      case 'cancel':
        onCancel?.call();
        break;
      default:
        debugPrint('Received unknown message type: ${payload['type']}');
    }
  } catch (e) {
    debugPrint('Failed to parse message: $e');
    // Create a generic error response for parsing failures
    final Map<String, dynamic> errorData = {
      'type': 'error',
      'status': 'error',
      'flowCompleted': false,
      'errorCode': 'PARSE_ERROR',
      'errorMessage': 'Failed to parse WebView message: $e',
      'errorType': 'parsing',
      'timestamp': DateTime.now().toIso8601String(),
    };
    onError?.call(jsonEncode(errorData));
  }
}