Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/rn-window-use-sdk-logger.md
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions packages/client/rn-window/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down
31 changes: 31 additions & 0 deletions packages/client/rn-window/src/logger.ts
Original file line number Diff line number Diff line change
@@ -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);
}
Comment on lines +23 to +30
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing react-native platform case. detectPlatform() returns "react-native" for RN environments, but only "browser" and "server" cases are handled here. See packages/wallets/src/logger/init.ts:46-50 for the correct pattern with a react-native case in the switch statement.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/client/rn-window/src/logger.ts
Line: 23-30

Comment:
missing `react-native` platform case. `detectPlatform()` returns `"react-native"` for RN environments, but only `"browser"` and `"server"` cases are handled here. See `packages/wallets/src/logger/init.ts:46-50` for the correct pattern with a `react-native` case in the switch statement.

How can I resolve this? If you propose a fix, please make it concise.

}
9 changes: 5 additions & 4 deletions packages/client/rn-window/src/rn-webview/Parent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -53,7 +54,7 @@ export class WebViewParent<IncomingEvents extends EventMap, OutgoingEvents exten
if (this.transport instanceof RNWebViewTransport) {
this.transport.handleMessage(event);
} else {
console.error("[WebViewParent] Transport is not an instance of RNWebViewTransport");
rnWindowLogger.error("[WebViewParent] Transport is not an instance of RNWebViewTransport");
}
};

Expand All @@ -65,11 +66,11 @@ export class WebViewParent<IncomingEvents extends EventMap, OutgoingEvents exten
if (this._reconnectFlight == null) {
this._reconnectFlight = (async () => {
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;
}
Expand Down Expand Up @@ -105,7 +106,7 @@ export class WebViewParent<IncomingEvents extends EventMap, OutgoingEvents exten
const response = await super.sendAction(args);

if (this.isRecoverableError(response)) {
console.info(`[WebViewParent] Recoverable error (code: ${response.code}), reloading and retrying`);
rnWindowLogger.info(`[WebViewParent] Recoverable error (code: ${response.code}), reloading and retrying`);
await this.reloadAndHandshake();
return await super.sendAction(args);
}
Expand Down
15 changes: 8 additions & 7 deletions packages/client/rn-window/src/transport/RNWebViewTransport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type { WebViewMessageEvent, WebView } from "react-native-webview";
import type { EventMap, SimpleMessageEvent, Transport } from "@crossmint/client-sdk-window";
import { generateRandomString } from "@crossmint/client-sdk-window";
import type { RefObject } from "react";
import { rnWindowLogger } from "../logger";

export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> implements Transport<OutgoingEvents> {
private listeners = new Map<string, (event: SimpleMessageEvent) => void>();
Expand All @@ -17,7 +18,7 @@ export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> 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",
Expand All @@ -30,7 +31,7 @@ export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> 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);
}
}
}
Expand All @@ -40,7 +41,7 @@ export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> 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) {
Expand All @@ -58,7 +59,7 @@ export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> 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");
}
}
}
Expand Down Expand Up @@ -101,14 +102,14 @@ export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> 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:",
Expand All @@ -129,7 +130,7 @@ export class RNWebViewTransport<OutgoingEvents extends EventMap = EventMap> 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");
}
}
}
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.