diff --git a/.changeset/rn-window-use-sdk-logger.md b/.changeset/rn-window-use-sdk-logger.md new file mode 100644 index 000000000..9f4ca37de --- /dev/null +++ b/.changeset/rn-window-use-sdk-logger.md @@ -0,0 +1,8 @@ +--- +"@crossmint/client-sdk-rn-window": patch +--- + +Replace direct console.* calls with rnWindowLogger to respect consoleLogLevel setting + +Category: improvements +Product Area: wallets diff --git a/packages/client/rn-window/package.json b/packages/client/rn-window/package.json index ad9a20c94..5b40fd199 100644 --- a/packages/client/rn-window/package.json +++ b/packages/client/rn-window/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "@crossmint/client-sdk-window": "workspace:*", + "@crossmint/common-sdk-base": "workspace:*", "react-native-get-random-values": "^1.11.0", "zod": "3.22.4" }, diff --git a/packages/client/rn-window/src/logger.ts b/packages/client/rn-window/src/logger.ts new file mode 100644 index 000000000..c653b5084 --- /dev/null +++ b/packages/client/rn-window/src/logger.ts @@ -0,0 +1,31 @@ +import { + SdkLogger, + validateAPIKey, + detectPlatform, + BrowserDatadogSink, + ServerDatadogSink, +} from "@crossmint/common-sdk-base"; + +export const rnWindowLogger = new SdkLogger(); + +export function initRnWindowLogger(apiKey: string): void { + const validationResult = validateAPIKey(apiKey); + if (!validationResult.isValid) { + return; + } + const { environment, projectId } = validationResult; + rnWindowLogger.init({ + packageName: "@crossmint/client-sdk-rn-window", + environment, + projectId, + }); + + const platform = detectPlatform(); + if (platform === "browser") { + const sink = new BrowserDatadogSink(environment); + rnWindowLogger.addSink(sink); + } else if (platform === "server") { + const sink = new ServerDatadogSink(environment); + rnWindowLogger.addSink(sink); + } +} diff --git a/packages/client/rn-window/src/rn-webview/Parent.ts b/packages/client/rn-window/src/rn-webview/Parent.ts index cf0a3b87b..d99366df7 100644 --- a/packages/client/rn-window/src/rn-webview/Parent.ts +++ b/packages/client/rn-window/src/rn-webview/Parent.ts @@ -4,6 +4,7 @@ import type { RefObject } from "react"; import type { WebView, WebViewMessageEvent } from "react-native-webview"; import type { z } from "zod"; import { RNWebViewTransport } from "../transport/RNWebViewTransport"; +import { rnWindowLogger } from "../logger"; /** * Recovery options for handling fatal errors in WebView operations. @@ -53,7 +54,7 @@ export class WebViewParent { try { - console.info("[WebViewParent] Reloading WebView and re-establishing handshake"); + rnWindowLogger.info("[WebViewParent] Reloading WebView and re-establishing handshake"); this.isConnected = false; this.transport.reload(); await this.handshakeWithChild(); - console.info("[WebViewParent] WebView reload and handshake completed"); + rnWindowLogger.info("[WebViewParent] WebView reload and handshake completed"); } finally { this._reconnectFlight = undefined; } @@ -105,7 +106,7 @@ export class WebViewParent implements Transport { private listeners = new Map void>(); @@ -17,7 +18,7 @@ export class RNWebViewTransport impl private handleGlobalMessage = (event: MessageEvent) => { const eventName = event.data?.event; if (eventName) { - console.info(`[RNTransport WebView] received: ${String(eventName)}`); + rnWindowLogger.info(`[RNTransport WebView] received: ${String(eventName)}`); } this.dispatchToListeners({ type: "message", @@ -30,7 +31,7 @@ export class RNWebViewTransport impl try { listener(event); } catch (e) { - console.error(`[RNTransport ${this.isWebView ? "WebView" : "RN"}] Error in listener:`, e); + rnWindowLogger.error(`[RNTransport ${this.isWebView ? "WebView" : "RN"}] Error in listener:`, e); } } } @@ -40,7 +41,7 @@ export class RNWebViewTransport impl if ((window as any).ReactNativeWebView?.postMessage) { (window as any).ReactNativeWebView.postMessage(JSON.stringify(message)); } else { - console.error("[RNTransport WebView] ReactNativeWebView.postMessage not available"); + rnWindowLogger.error("[RNTransport WebView] ReactNativeWebView.postMessage not available"); } } else { if (this.webviewRef?.current?.injectJavaScript) { @@ -58,7 +59,7 @@ export class RNWebViewTransport impl `; this.webviewRef.current.injectJavaScript(script); } else { - console.warn("[RNTransport RN] WebView ref not available for injection"); + rnWindowLogger.warn("[RNTransport RN] WebView ref not available for injection"); } } } @@ -101,14 +102,14 @@ export class RNWebViewTransport impl const parsedData = JSON.parse(data); const eventName = parsedData?.event; if (eventName) { - console.info(`[RNTransport RN] received from WebView: ${String(eventName)}`); + rnWindowLogger.info(`[RNTransport RN] received from WebView: ${String(eventName)}`); } this.dispatchToListeners({ type: "message", data: parsedData, }); } catch (error) { - console.error( + rnWindowLogger.error( "[RNTransport RN] Error parsing/handling WebView message:", error instanceof Error ? error.message : String(error), "Raw data:", @@ -129,7 +130,7 @@ export class RNWebViewTransport impl if (this.webviewRef?.current?.reload) { this.webviewRef.current.reload(); } else { - console.error("[RNTransport RN] WebView ref not available for reload"); + rnWindowLogger.error("[RNTransport RN] WebView ref not available for reload"); } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7617126f..925b86003 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -647,6 +647,9 @@ importers: '@crossmint/client-sdk-window': specifier: workspace:* version: link:../window + '@crossmint/common-sdk-base': + specifier: workspace:* + version: link:../../common/base react-native-get-random-values: specifier: ^1.11.0 version: 1.11.0(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.1.10)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))