diff --git a/ElementX/Sources/Screens/CallScreen/CallScreenModels.swift b/ElementX/Sources/Screens/CallScreen/CallScreenModels.swift index 3d4fd81bb..509207ac1 100644 --- a/ElementX/Sources/Screens/CallScreen/CallScreenModels.swift +++ b/ElementX/Sources/Screens/CallScreen/CallScreenModels.swift @@ -60,6 +60,8 @@ enum CallScreenJavaScriptMessageName: String, CaseIterable { case onOutputDeviceSelect /// Used to handle the webview back button case onBackButtonPressed + /// Forward logs to the native side for debugging purposes. + case forwardLogs private var postMessageScript: String { switch self { @@ -97,6 +99,25 @@ enum CallScreenJavaScriptMessageName: String, CaseIterable { window.webkit.messageHandlers.\(rawValue).postMessage(""); } """ + case .forwardLogs: + """ + (function() { + function forwardLog(level, args) { + const message = Array.from(args).map(a => { + try { return typeof a === 'object' ? JSON.stringify(a) : String(a); } + catch(e) { return String(a); } + }).join(' '); + window.webkit.messageHandlers.\(rawValue).postMessage({ level: level, message: message }); + } + ['log', 'debug', 'info', 'warn', 'error'].forEach(function(level) { + const original = console[level].bind(console); + console[level] = function(...args) { + original(...args); + forwardLog(level, args); + }; + }); + })(); + """ } } diff --git a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift index f3913c7e6..c0ec41b3e 100644 --- a/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift +++ b/ElementX/Sources/Screens/CallScreen/View/CallScreen.swift @@ -194,6 +194,23 @@ private struct CallView: UIViewRepresentable { viewModelContext?.send(viewAction: .outputDeviceSelected(deviceID: deviceID)) case .onBackButtonPressed: viewModelContext?.send(viewAction: .navigateBack) + case .forwardLogs: + guard let body = message.body as? [String: String], + let level = body["level"], + let logMessage = body["message"] else { return } + + switch level { + case "debug": + MXLog.debug("[ElementCall]: \(logMessage)") + case "info": + MXLog.info("[ElementCall]: \(logMessage)") + case "warn": + MXLog.warning("[ElementCall]: \(logMessage)") + case "error": + MXLog.error("[ElementCall]: \(logMessage)") + default: + break + } } }