From a40577d36b9c58bbd0ceaba89eb833cd067c37a3 Mon Sep 17 00:00:00 2001 From: Francis John <7452924+franjohn21@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:16:44 +0000 Subject: [PATCH 1/5] [bugfix] mock localStorage for environments that dont support it globally (node) --- packages/core/src/analytics/storage.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/core/src/analytics/storage.ts b/packages/core/src/analytics/storage.ts index 1fc0c605..c118c439 100644 --- a/packages/core/src/analytics/storage.ts +++ b/packages/core/src/analytics/storage.ts @@ -1,6 +1,18 @@ import { v4 as uuidv4 } from "uuid"; import type { AnalyticsPayload } from "./types"; +const localStorage: Pick< + WindowLocalStorage["localStorage"], + "getItem" | "setItem" | "removeItem" +> = + typeof window !== "undefined" + ? window.localStorage + : { + getItem: () => null, + setItem: () => null, + removeItem: () => null, + }; + function getCachedEventIds(): string[] { let cachedEventIds: string[] = []; const cachedEventIdsValue = localStorage.getItem("tdk-analytics-event-ids"); @@ -35,7 +47,7 @@ export function addCachedEvent(event: AnalyticsPayload): void { cachedEventIds.push(event.id); localStorage.setItem( "tdk-analytics-event-ids", - JSON.stringify(cachedEventIds), + JSON.stringify(cachedEventIds) ); localStorage.setItem(`tdk-analytic-${event.id}`, JSON.stringify(event)); } From aff0ad455f274f09075b7c3d2c59ea7bdec1774a Mon Sep 17 00:00:00 2001 From: Francis John <7452924+franjohn21@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:17:33 +0000 Subject: [PATCH 2/5] fix lint --- packages/core/src/analytics/storage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/analytics/storage.ts b/packages/core/src/analytics/storage.ts index c118c439..a42bc93e 100644 --- a/packages/core/src/analytics/storage.ts +++ b/packages/core/src/analytics/storage.ts @@ -47,7 +47,7 @@ export function addCachedEvent(event: AnalyticsPayload): void { cachedEventIds.push(event.id); localStorage.setItem( "tdk-analytics-event-ids", - JSON.stringify(cachedEventIds) + JSON.stringify(cachedEventIds), ); localStorage.setItem(`tdk-analytic-${event.id}`, JSON.stringify(event)); } From 63c724efc08f7ce5fce91c3b6ea09fdcead27389 Mon Sep 17 00:00:00 2001 From: Francis John <7452924+franjohn21@users.noreply.github.com> Date: Wed, 13 Nov 2024 20:48:12 +0000 Subject: [PATCH 3/5] Move analytics manager instantiation to client only --- packages/react/src/contexts/treasure.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/react/src/contexts/treasure.tsx b/packages/react/src/contexts/treasure.tsx index 8694b719..f520ded4 100644 --- a/packages/react/src/contexts/treasure.tsx +++ b/packages/react/src/contexts/treasure.tsx @@ -104,6 +104,8 @@ const TreasureProviderInner = ({ }), [apiUri, chain.id, sessionOptions?.backendWallet, client], ); + const [analyticsManager, setAnalyticsManager] = + useState(null); const contractAddresses = useMemo( () => getContractAddresses(chain.id), @@ -114,9 +116,9 @@ const TreasureProviderInner = ({ ? (getUserAddress(user, chain.id) ?? user.smartAccounts[0]?.address) : undefined; - const analyticsManager = useMemo(() => { + useEffect(() => { if (!analyticsOptions) { - return undefined; + return; } AnalyticsManager.instance.init({ @@ -127,7 +129,7 @@ const TreasureProviderInner = ({ device: analyticsOptions.device, }); - return AnalyticsManager.instance; + setAnalyticsManager(AnalyticsManager.instance); }, [analyticsOptions]); const trackCustomEvent = useCallback( From 35de48a7cbe3be4786377341a5c70e527c7dd6de Mon Sep 17 00:00:00 2001 From: Francis John <7452924+franjohn21@users.noreply.github.com> Date: Wed, 13 Nov 2024 21:06:49 +0000 Subject: [PATCH 4/5] dont allow reinitialized analyticsmanager --- packages/core/src/analytics/AnalyticsManager.ts | 4 ++++ packages/react/src/contexts/treasure.tsx | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core/src/analytics/AnalyticsManager.ts b/packages/core/src/analytics/AnalyticsManager.ts index 63f86040..4d8782c8 100644 --- a/packages/core/src/analytics/AnalyticsManager.ts +++ b/packages/core/src/analytics/AnalyticsManager.ts @@ -52,6 +52,10 @@ export class AnalyticsManager { cartridgeTag: string; device?: Device; }) { + if (this.initialized) { + throw new Error("AnalyticsManager is already initialized"); + } + this.apiUri = apiUri; this.apiKey = apiKey; this.app = app; diff --git a/packages/react/src/contexts/treasure.tsx b/packages/react/src/contexts/treasure.tsx index f520ded4..2fb978b1 100644 --- a/packages/react/src/contexts/treasure.tsx +++ b/packages/react/src/contexts/treasure.tsx @@ -116,8 +116,9 @@ const TreasureProviderInner = ({ ? (getUserAddress(user, chain.id) ?? user.smartAccounts[0]?.address) : undefined; + // biome-ignore lint/correctness/useExhaustiveDependencies: analyticsManager doesnt need to be a dependency useEffect(() => { - if (!analyticsOptions) { + if (!analyticsOptions || analyticsManager) { return; } From 654619b448ea6953d57ad257594ae13fb4c344e9 Mon Sep 17 00:00:00 2001 From: Francis John <7452924+franjohn21@users.noreply.github.com> Date: Wed, 13 Nov 2024 21:51:01 +0000 Subject: [PATCH 5/5] version --- .changeset/cold-singers-teach.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/cold-singers-teach.md diff --git a/.changeset/cold-singers-teach.md b/.changeset/cold-singers-teach.md new file mode 100644 index 00000000..64940628 --- /dev/null +++ b/.changeset/cold-singers-teach.md @@ -0,0 +1,6 @@ +--- +"@treasure-dev/tdk-react": patch +"@treasure-dev/tdk-core": patch +--- + +Remove analytics manager from SSR