@meshconnect/uwc-react 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ConnectionProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,cAAc,EACd,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAE/B,UAAU,sBAAsB;IAC9B,SAAS,EAAE,wBAAwB,CAAA;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,QAAA,MAAM,iBAAiB,8CAAqD,CAAA;AAE5E,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,sBAA8B,EAC9B,mBAAmB,EACpB,EAAE,uBAAuB,2CAwCzB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"ConnectionProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ConnectionProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAA;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,cAAc,EACd,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAK/B,UAAU,sBAAsB;IAC9B,SAAS,EAAE,wBAAwB,CAAA;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,QAAA,MAAM,iBAAiB,8CAAqD,CAAA;AAE5E,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,sBAA8B,EAC9B,mBAAmB,EACpB,EAAE,uBAAuB,2CAqCzB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1,14 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import React, { createContext, useEffect, useState, useRef } from 'react';
2
+ import React, { createContext, useEffect, useState } from 'react';
3
3
  import { UniversalWalletConnector } from '@meshconnect/uwc-core';
4
+ // Guard against double initialization
5
+ let sharedConnector = null;
4
6
  const ConnectionContext = createContext(null);
5
7
  export function ConnectionProvider({ children, networks, wallets, usingIntegratedBrowser = false, walletConnectConfig }) {
6
- // Create the connector instance only once using useRef
7
- const connectorRef = useRef(null);
8
- if (!connectorRef.current) {
9
- connectorRef.current = new UniversalWalletConnector(networks, wallets, usingIntegratedBrowser, walletConnectConfig);
8
+ if (!sharedConnector) {
9
+ sharedConnector = new UniversalWalletConnector(networks, wallets, usingIntegratedBrowser, walletConnectConfig);
10
10
  }
11
- const connector = connectorRef.current;
11
+ const connector = sharedConnector;
12
12
  const [session, setSession] = useState(() => connector.getSession());
13
13
  const [isReady, setIsReady] = useState(() => connector.isReady());
14
14
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionProvider.js","sourceRoot":"","sources":["../../src/providers/ConnectionProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAgBhE,MAAM,iBAAiB,GAAG,aAAa,CAAgC,IAAI,CAAC,CAAA;AAU5E,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,sBAAsB,GAAG,KAAK,EAC9B,mBAAmB,EACK;IACxB,uDAAuD;IACvD,MAAM,YAAY,GAAG,MAAM,CAAkC,IAAI,CAAC,CAAA;IAElE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1B,YAAY,CAAC,OAAO,GAAG,IAAI,wBAAwB,CACjD,QAAQ,EACR,OAAO,EACP,sBAAsB,EACtB,mBAAmB,CACpB,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAA;IAEtC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;IAC7E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;YAC3C,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;YAClC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,OAAO,WAAW,CAAA;IACpB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,MAAM,KAAK,GAA2B;QACpC,SAAS;QACT,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE;QAC/B,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE;QACjC,OAAO;KACR,CAAA;IAED,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACrC,QAAQ,GACkB,CAC9B,CAAA;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"ConnectionProvider.js","sourceRoot":"","sources":["../../src/providers/ConnectionProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAQhE,sCAAsC;AACtC,IAAI,eAAe,GAAoC,IAAI,CAAA;AAU3D,MAAM,iBAAiB,GAAG,aAAa,CAAgC,IAAI,CAAC,CAAA;AAU5E,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,sBAAsB,GAAG,KAAK,EAC9B,mBAAmB,EACK;IACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,wBAAwB,CAC5C,QAAQ,EACR,OAAO,EACP,sBAAsB,EACtB,mBAAmB,CACpB,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAA;IAEjC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;IAC7E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;YAC3C,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAA;YAClC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,OAAO,WAAW,CAAA;IACpB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,MAAM,KAAK,GAA2B;QACpC,SAAS;QACT,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE;QAC/B,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE;QACjC,OAAO;KACR,CAAA;IAED,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACrC,QAAQ,GACkB,CAC9B,CAAA;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-react",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "React hooks and components for Universal Wallet Connector",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,7 +16,7 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@meshconnect/uwc-core": "0.2.15",
19
+ "@meshconnect/uwc-core": "0.2.16",
20
20
  "@meshconnect/uwc-types": "0.2.7"
21
21
  },
22
22
  "peerDependencies": {
@@ -0,0 +1,100 @@
1
+ import React, { useContext } from 'react'
2
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
3
+ import { createRoot } from 'react-dom/client'
4
+ import { act } from 'react-dom/test-utils'
5
+
6
+ describe('ConnectionProvider singleton behavior', () => {
7
+ beforeEach(async () => {
8
+ vi.resetModules()
9
+ })
10
+
11
+ it('creates only one UniversalWalletConnector across multiple providers', async () => {
12
+ vi.doMock('@meshconnect/uwc-core', () => {
13
+ class UniversalWalletConnector {
14
+ static calls = 0
15
+
16
+ constructor() {
17
+ UniversalWalletConnector.calls++
18
+ }
19
+
20
+ // Minimal API used by the provider
21
+ getSession() {
22
+ return {
23
+ isConnected: false,
24
+ walletId: undefined,
25
+ networkId: undefined
26
+ }
27
+ }
28
+
29
+ isReady() {
30
+ return true
31
+ }
32
+
33
+ subscribe() {
34
+ return () => {}
35
+ }
36
+
37
+ getWallets() {
38
+ return []
39
+ }
40
+
41
+ getNetworks() {
42
+ return []
43
+ }
44
+ }
45
+
46
+ return { UniversalWalletConnector }
47
+ })
48
+
49
+ const { ConnectionProvider, ConnectionContext } = await import(
50
+ './ConnectionProvider'
51
+ )
52
+ const { UniversalWalletConnector } = await import('@meshconnect/uwc-core')
53
+ const connectors: unknown[] = []
54
+
55
+ function Capture() {
56
+ const ctx = useContext(ConnectionContext)
57
+ if (ctx) {
58
+ connectors.push(ctx.connector)
59
+ }
60
+ return null
61
+ }
62
+
63
+ const container = document.createElement('div')
64
+ document.body.appendChild(container)
65
+ const root = createRoot(container)
66
+
67
+ await act(async () => {
68
+ root.render(
69
+ <>
70
+ <ConnectionProvider
71
+ networks={[]}
72
+ wallets={[]}
73
+ usingIntegratedBrowser={false}
74
+ >
75
+ <Capture />
76
+ </ConnectionProvider>
77
+ <ConnectionProvider
78
+ networks={[]}
79
+ wallets={[]}
80
+ usingIntegratedBrowser={false}
81
+ >
82
+ <Capture />
83
+ </ConnectionProvider>
84
+ </>
85
+ )
86
+ })
87
+
88
+ // Only one constructor call expected due to singleton guard
89
+ // @ts-expect-error test-only property
90
+ expect(UniversalWalletConnector.calls).toBe(1)
91
+
92
+ // Both providers should expose the same connector instance
93
+ expect(connectors.length).toBe(2)
94
+ expect(connectors[0]).toBe(connectors[1])
95
+
96
+ await act(async () => {
97
+ root.unmount()
98
+ })
99
+ })
100
+ })
@@ -1,4 +1,4 @@
1
- import React, { createContext, useEffect, useState, useRef } from 'react'
1
+ import React, { createContext, useEffect, useState } from 'react'
2
2
  import { UniversalWalletConnector } from '@meshconnect/uwc-core'
3
3
  import type {
4
4
  Session,
@@ -7,6 +7,9 @@ import type {
7
7
  WalletConnectConfig
8
8
  } from '@meshconnect/uwc-types'
9
9
 
10
+ // Guard against double initialization
11
+ let sharedConnector: UniversalWalletConnector | null = null
12
+
10
13
  interface ConnectionContextValue {
11
14
  connector: UniversalWalletConnector
12
15
  session: Session
@@ -32,11 +35,8 @@ export function ConnectionProvider({
32
35
  usingIntegratedBrowser = false,
33
36
  walletConnectConfig
34
37
  }: ConnectionProviderProps) {
35
- // Create the connector instance only once using useRef
36
- const connectorRef = useRef<UniversalWalletConnector | null>(null)
37
-
38
- if (!connectorRef.current) {
39
- connectorRef.current = new UniversalWalletConnector(
38
+ if (!sharedConnector) {
39
+ sharedConnector = new UniversalWalletConnector(
40
40
  networks,
41
41
  wallets,
42
42
  usingIntegratedBrowser,
@@ -44,7 +44,7 @@ export function ConnectionProvider({
44
44
  )
45
45
  }
46
46
 
47
- const connector = connectorRef.current
47
+ const connector = sharedConnector
48
48
 
49
49
  const [session, setSession] = useState<Session>(() => connector.getSession())
50
50
  const [isReady, setIsReady] = useState(() => connector.isReady())