@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.
- package/dist/providers/ConnectionProvider.d.ts.map +1 -1
- package/dist/providers/ConnectionProvider.js +6 -6
- package/dist/providers/ConnectionProvider.js.map +1 -1
- package/package.json +2 -2
- package/src/providers/ConnectionProvider.singleton.test.tsx +100 -0
- package/src/providers/ConnectionProvider.tsx +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ConnectionProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
|
|
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
|
-
|
|
7
|
-
|
|
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 =
|
|
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,
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
36
|
-
|
|
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 =
|
|
47
|
+
const connector = sharedConnector
|
|
48
48
|
|
|
49
49
|
const [session, setSession] = useState<Session>(() => connector.getSession())
|
|
50
50
|
const [isReady, setIsReady] = useState(() => connector.isReady())
|