handleMessage function
void
handleMessage(})
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));
}
}