@xyo-network/xl1-react-client-sdk 1.28.0

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.
Files changed (121) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +30 -0
  3. package/dist/browser/client/components/connected/ConnectAccountsStack.d.ts +51 -0
  4. package/dist/browser/client/components/connected/ConnectAccountsStack.d.ts.map +1 -0
  5. package/dist/browser/client/components/connected/account/Connected.d.ts +5 -0
  6. package/dist/browser/client/components/connected/account/Connected.d.ts.map +1 -0
  7. package/dist/browser/client/components/connected/account/index.d.ts +2 -0
  8. package/dist/browser/client/components/connected/account/index.d.ts.map +1 -0
  9. package/dist/browser/client/components/connected/hooks/index.d.ts +2 -0
  10. package/dist/browser/client/components/connected/hooks/index.d.ts.map +1 -0
  11. package/dist/browser/client/components/connected/hooks/useConnectAccount.d.ts +17 -0
  12. package/dist/browser/client/components/connected/hooks/useConnectAccount.d.ts.map +1 -0
  13. package/dist/browser/client/components/connected/index.d.ts +3 -0
  14. package/dist/browser/client/components/connected/index.d.ts.map +1 -0
  15. package/dist/browser/client/components/index.d.ts +2 -0
  16. package/dist/browser/client/components/index.d.ts.map +1 -0
  17. package/dist/browser/client/context/GatewayContext.d.ts +28 -0
  18. package/dist/browser/client/context/GatewayContext.d.ts.map +1 -0
  19. package/dist/browser/client/context/GatewayProviderProps.d.ts +6 -0
  20. package/dist/browser/client/context/GatewayProviderProps.d.ts.map +1 -0
  21. package/dist/browser/client/context/GatewayProviderState.d.ts +33 -0
  22. package/dist/browser/client/context/GatewayProviderState.d.ts.map +1 -0
  23. package/dist/browser/client/context/in-page/InPageGatewaysContext.d.ts +16 -0
  24. package/dist/browser/client/context/in-page/InPageGatewaysContext.d.ts.map +1 -0
  25. package/dist/browser/client/context/in-page/InPageGatewaysState.d.ts +21 -0
  26. package/dist/browser/client/context/in-page/InPageGatewaysState.d.ts.map +1 -0
  27. package/dist/browser/client/context/in-page/Provider.d.ts +60 -0
  28. package/dist/browser/client/context/in-page/Provider.d.ts.map +1 -0
  29. package/dist/browser/client/context/in-page/index.d.ts +5 -0
  30. package/dist/browser/client/context/in-page/index.d.ts.map +1 -0
  31. package/dist/browser/client/context/in-page/lib/buildGateway.d.ts +3 -0
  32. package/dist/browser/client/context/in-page/lib/buildGateway.d.ts.map +1 -0
  33. package/dist/browser/client/context/in-page/lib/index.d.ts +2 -0
  34. package/dist/browser/client/context/in-page/lib/index.d.ts.map +1 -0
  35. package/dist/browser/client/context/in-page/useProvidedInPageGateways.d.ts +13 -0
  36. package/dist/browser/client/context/in-page/useProvidedInPageGateways.d.ts.map +1 -0
  37. package/dist/browser/client/context/index.d.ts +7 -0
  38. package/dist/browser/client/context/index.d.ts.map +1 -0
  39. package/dist/browser/client/context/providers/GatewayProvider.d.ts +47 -0
  40. package/dist/browser/client/context/providers/GatewayProvider.d.ts.map +1 -0
  41. package/dist/browser/client/context/providers/WalletGatewayProvider.d.ts +34 -0
  42. package/dist/browser/client/context/providers/WalletGatewayProvider.d.ts.map +1 -0
  43. package/dist/browser/client/context/providers/index.d.ts +3 -0
  44. package/dist/browser/client/context/providers/index.d.ts.map +1 -0
  45. package/dist/browser/client/context/providers/story/GatewayStatus.d.ts +9 -0
  46. package/dist/browser/client/context/providers/story/GatewayStatus.d.ts.map +1 -0
  47. package/dist/browser/client/context/useProvidedGateway.d.ts +16 -0
  48. package/dist/browser/client/context/useProvidedGateway.d.ts.map +1 -0
  49. package/dist/browser/client/hooks/client/helpers/findCaveat.d.ts +3 -0
  50. package/dist/browser/client/hooks/client/helpers/findCaveat.d.ts.map +1 -0
  51. package/dist/browser/client/hooks/client/helpers/index.d.ts +2 -0
  52. package/dist/browser/client/hooks/client/helpers/index.d.ts.map +1 -0
  53. package/dist/browser/client/hooks/client/index.d.ts +5 -0
  54. package/dist/browser/client/hooks/client/index.d.ts.map +1 -0
  55. package/dist/browser/client/hooks/client/permissions/index.d.ts +3 -0
  56. package/dist/browser/client/hooks/client/permissions/index.d.ts.map +1 -0
  57. package/dist/browser/client/hooks/client/permissions/usePermissions.d.ts +7 -0
  58. package/dist/browser/client/hooks/client/permissions/usePermissions.d.ts.map +1 -0
  59. package/dist/browser/client/hooks/client/permissions/usePermissionsAccounts.d.ts +2 -0
  60. package/dist/browser/client/hooks/client/permissions/usePermissionsAccounts.d.ts.map +1 -0
  61. package/dist/browser/client/hooks/client/story/GatewayFromWalletStatus.d.ts +7 -0
  62. package/dist/browser/client/hooks/client/story/GatewayFromWalletStatus.d.ts.map +1 -0
  63. package/dist/browser/client/hooks/client/story/mockWalletDecorator.d.ts +3 -0
  64. package/dist/browser/client/hooks/client/story/mockWalletDecorator.d.ts.map +1 -0
  65. package/dist/browser/client/hooks/client/useClientFromWallet.d.ts +12 -0
  66. package/dist/browser/client/hooks/client/useClientFromWallet.d.ts.map +1 -0
  67. package/dist/browser/client/hooks/client/useGatewayFromWallet.d.ts +20 -0
  68. package/dist/browser/client/hooks/client/useGatewayFromWallet.d.ts.map +1 -0
  69. package/dist/browser/client/hooks/helpers/getXyoClient.d.ts +6 -0
  70. package/dist/browser/client/hooks/helpers/getXyoClient.d.ts.map +1 -0
  71. package/dist/browser/client/hooks/helpers/index.d.ts +2 -0
  72. package/dist/browser/client/hooks/helpers/index.d.ts.map +1 -0
  73. package/dist/browser/client/hooks/index.d.ts +3 -0
  74. package/dist/browser/client/hooks/index.d.ts.map +1 -0
  75. package/dist/browser/client/index.d.ts +5 -0
  76. package/dist/browser/client/index.d.ts.map +1 -0
  77. package/dist/browser/client/index.mjs +546 -0
  78. package/dist/browser/client/index.mjs.map +1 -0
  79. package/dist/browser/client/story/GatewayStats.d.ts +7 -0
  80. package/dist/browser/client/story/GatewayStats.d.ts.map +1 -0
  81. package/dist/browser/client/story/GatewayStatus.d.ts +3 -0
  82. package/dist/browser/client/story/GatewayStatus.d.ts.map +1 -0
  83. package/dist/browser/client/types/ContextGatewayType.d.ts +3 -0
  84. package/dist/browser/client/types/ContextGatewayType.d.ts.map +1 -0
  85. package/dist/browser/client/types/GatewayFromWallet.d.ts +8 -0
  86. package/dist/browser/client/types/GatewayFromWallet.d.ts.map +1 -0
  87. package/dist/browser/client/types/index.d.ts +3 -0
  88. package/dist/browser/client/types/index.d.ts.map +1 -0
  89. package/dist/browser/index.d.ts +4 -0
  90. package/dist/browser/index.d.ts.map +1 -0
  91. package/dist/browser/index.mjs +722 -0
  92. package/dist/browser/index.mjs.map +1 -0
  93. package/dist/browser/model/index.d.ts +2 -0
  94. package/dist/browser/model/index.d.ts.map +1 -0
  95. package/dist/browser/model/index.mjs +13 -0
  96. package/dist/browser/model/index.mjs.map +1 -0
  97. package/dist/browser/model/types/XyoGlobal.d.ts +17 -0
  98. package/dist/browser/model/types/XyoGlobal.d.ts.map +1 -0
  99. package/dist/browser/model/types/index.d.ts +2 -0
  100. package/dist/browser/model/types/index.d.ts.map +1 -0
  101. package/dist/browser/shared/components/index.d.ts +3 -0
  102. package/dist/browser/shared/components/index.d.ts.map +1 -0
  103. package/dist/browser/shared/components/menu-item/ActiveMenuItem.d.ts +6 -0
  104. package/dist/browser/shared/components/menu-item/ActiveMenuItem.d.ts.map +1 -0
  105. package/dist/browser/shared/components/menu-item/index.d.ts +2 -0
  106. package/dist/browser/shared/components/menu-item/index.d.ts.map +1 -0
  107. package/dist/browser/shared/components/stack/DetailsStack.d.ts +10 -0
  108. package/dist/browser/shared/components/stack/DetailsStack.d.ts.map +1 -0
  109. package/dist/browser/shared/components/stack/LabelValueStack.d.ts +8 -0
  110. package/dist/browser/shared/components/stack/LabelValueStack.d.ts.map +1 -0
  111. package/dist/browser/shared/components/stack/index.d.ts +3 -0
  112. package/dist/browser/shared/components/stack/index.d.ts.map +1 -0
  113. package/dist/browser/shared/decorators/IframeWalletWarningDecorator.d.ts +10 -0
  114. package/dist/browser/shared/decorators/IframeWalletWarningDecorator.d.ts.map +1 -0
  115. package/dist/browser/shared/decorators/index.d.ts +2 -0
  116. package/dist/browser/shared/decorators/index.d.ts.map +1 -0
  117. package/dist/browser/shared/index.d.ts +3 -0
  118. package/dist/browser/shared/index.d.ts.map +1 -0
  119. package/dist/browser/shared/index.mjs +175 -0
  120. package/dist/browser/shared/index.mjs.map +1 -0
  121. package/package.json +234 -0
@@ -0,0 +1,722 @@
1
+ // src/client/components/connected/account/Connected.tsx
2
+ import {
3
+ Stack,
4
+ Tooltip,
5
+ Typography
6
+ } from "@mui/material";
7
+ import { EthAddressWrapper } from "@xylabs/sdk-js";
8
+ import { BlockiesAvatarAddress } from "@xyo-network/xl1-blockies";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ var ConnectedAccount = ({ address }) => {
11
+ const shortenedAddress = `${EthAddressWrapper.fromString(address)?.toShortString(4)}`;
12
+ return /* @__PURE__ */ jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
13
+ /* @__PURE__ */ jsx(BlockiesAvatarAddress, { address, size: 21 }),
14
+ /* @__PURE__ */ jsx(Tooltip, { title: address, children: /* @__PURE__ */ jsx(Typography, { color: "textSecondary", variant: "caption", fontFamily: "monospace", children: shortenedAddress }) })
15
+ ] });
16
+ };
17
+
18
+ // src/client/components/connected/ConnectAccountsStack.tsx
19
+ import {
20
+ Alert,
21
+ AlertTitle,
22
+ Button,
23
+ Stack as Stack2,
24
+ Typography as Typography2
25
+ } from "@mui/material";
26
+ import { ButtonEx } from "@xylabs/react-button";
27
+ import { ErrorRender } from "@xylabs/react-error";
28
+ import { isDefined as isDefined3, isUndefined as isUndefined3 } from "@xylabs/sdk-js";
29
+ import { useEffect as useEffect2 } from "react";
30
+
31
+ // src/client/components/connected/hooks/useConnectAccount.ts
32
+ import { asAddress } from "@xylabs/sdk-js";
33
+ import { assertEx } from "@xylabs/sdk-js";
34
+ import { MainNetwork } from "@xyo-network/xl1-sdk";
35
+ import { useCallback, useState as useState2 } from "react";
36
+
37
+ // src/client/hooks/client/helpers/findCaveat.ts
38
+ import { isDefined } from "@xylabs/sdk-js";
39
+ var findCaveat = async (permissions, targetCapability, targetCaveatType) => {
40
+ const existingPermissions = await permissions.getPermissions();
41
+ if (isDefined(existingPermissions) && existingPermissions.length > 0) {
42
+ const foundPermissions = existingPermissions.find((p) => p.parentCapability === targetCapability);
43
+ if (isDefined(foundPermissions)) {
44
+ return foundPermissions.caveats?.find((caveat) => caveat.type === targetCaveatType)?.value ?? [];
45
+ }
46
+ }
47
+ return existingPermissions;
48
+ };
49
+
50
+ // src/client/hooks/client/useClientFromWallet.ts
51
+ import { isUndefined as isUndefined2 } from "@xylabs/sdk-js";
52
+ import { useEffect, useState } from "react";
53
+
54
+ // src/client/hooks/helpers/getXyoClient.ts
55
+ import { isUndefined } from "@xylabs/sdk-js";
56
+ var CLIENT_LISTENER_TIMEOUT = 2e3;
57
+ var hasXyoClient = () => {
58
+ return "client" in globalThis.xyo;
59
+ };
60
+ var listenForClientInjection = (onClientReady, timeout, onTimeout) => {
61
+ let resolved = false;
62
+ const listener = () => {
63
+ onClientReady();
64
+ resolved = true;
65
+ };
66
+ globalThis.addEventListener("xyo:plugin-ready", listener);
67
+ setTimeout(() => {
68
+ if (!resolved) {
69
+ globalThis.removeEventListener("xyo:plugin-ready", listener);
70
+ onTimeout();
71
+ }
72
+ }, timeout);
73
+ };
74
+ async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT) {
75
+ if (isUndefined(globalThis.xyo)) {
76
+ return null;
77
+ }
78
+ return hasXyoClient() ? globalThis.xyo.client : await new Promise((resolve) => {
79
+ listenForClientInjection(
80
+ () => {
81
+ resolve(globalThis.xyo.client);
82
+ },
83
+ timeout,
84
+ () => {
85
+ resolve(null);
86
+ }
87
+ );
88
+ });
89
+ }
90
+
91
+ // src/client/hooks/client/useClientFromWallet.ts
92
+ var initialState = {
93
+ client: void 0,
94
+ error: null,
95
+ isLoading: false,
96
+ timedout: false
97
+ };
98
+ var useClientFromWallet = (timeout) => {
99
+ const [state, setState] = useState(initialState);
100
+ useEffect(() => {
101
+ let cancelled = false;
102
+ const initialize = async () => {
103
+ setState((prev) => {
104
+ if (prev.isLoading) return prev;
105
+ return {
106
+ ...prev,
107
+ isLoading: true,
108
+ error: null
109
+ };
110
+ });
111
+ try {
112
+ const client = await getXyoClient(timeout);
113
+ if (cancelled) return;
114
+ if (client === null) {
115
+ setState({
116
+ client: null,
117
+ timedout: true,
118
+ isLoading: false,
119
+ error: null
120
+ });
121
+ } else {
122
+ setState({
123
+ client,
124
+ isLoading: false,
125
+ error: null,
126
+ timedout: false
127
+ });
128
+ }
129
+ } catch (error) {
130
+ if (cancelled) return;
131
+ setState({
132
+ client: void 0,
133
+ isLoading: false,
134
+ error,
135
+ timedout: false
136
+ });
137
+ }
138
+ };
139
+ void initialize();
140
+ const onPluginReady = () => {
141
+ if (cancelled) return;
142
+ const client = isUndefined2(globalThis.xyo) ? null : globalThis.xyo?.client ?? null;
143
+ setState({
144
+ client,
145
+ isLoading: false,
146
+ timedout: false,
147
+ error: null
148
+ });
149
+ };
150
+ globalThis.addEventListener("xyo:plugin-ready", onPluginReady);
151
+ return () => {
152
+ cancelled = true;
153
+ globalThis.removeEventListener("xyo:plugin-ready", onPluginReady);
154
+ };
155
+ }, [timeout]);
156
+ return state;
157
+ };
158
+ var useClient = useClientFromWallet;
159
+
160
+ // src/client/hooks/client/permissions/usePermissions.ts
161
+ var usePermissions = () => {
162
+ const {
163
+ client,
164
+ isLoading,
165
+ error,
166
+ timedout
167
+ } = useClientFromWallet();
168
+ const permissions = client?.permissions;
169
+ return {
170
+ permissions,
171
+ isLoading,
172
+ error,
173
+ timedout
174
+ };
175
+ };
176
+
177
+ // src/client/hooks/client/permissions/usePermissionsAccounts.ts
178
+ import { usePromise } from "@xylabs/react-promise";
179
+ import {
180
+ isArray,
181
+ isDefined as isDefined2,
182
+ isDefinedNotNull,
183
+ isString
184
+ } from "@xylabs/sdk-js";
185
+ var validateRestrictedAccounts = (restrictedAccounts) => {
186
+ if (isDefined2(restrictedAccounts)) {
187
+ if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {
188
+ return restrictedAccounts;
189
+ }
190
+ throw new Error(
191
+ `Unrecognized format for restrictReturnedAccounts caveat found on permissions.
192
+
193
+ Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`
194
+ );
195
+ }
196
+ return [];
197
+ };
198
+ var useAccountPermissions = () => {
199
+ const { permissions, error } = usePermissions();
200
+ return usePromise(async () => {
201
+ if (isDefinedNotNull(error)) throw error;
202
+ if (isDefined2(permissions)) {
203
+ const restrictedAccounts = await findCaveat(
204
+ permissions,
205
+ // TODO - extract to constant in protocol package
206
+ "xyoWallet_getAccounts",
207
+ "restrictReturnedAccounts"
208
+ );
209
+ return validateRestrictedAccounts(restrictedAccounts);
210
+ }
211
+ }, [permissions]);
212
+ };
213
+
214
+ // src/client/hooks/client/useGatewayFromWallet.ts
215
+ import { isNull } from "@xylabs/sdk-js";
216
+ var useGatewayFromWallet = (gatewayName, timeout) => {
217
+ const {
218
+ client,
219
+ isLoading,
220
+ error,
221
+ timedout
222
+ } = useClientFromWallet(timeout);
223
+ const resolveGateway = () => {
224
+ if (isNull(client)) return null;
225
+ return client?.gateways?.[gatewayName];
226
+ };
227
+ return {
228
+ // no gatewayName requested = undefined (opt-out, not "absent")
229
+ gateway: gatewayName ? resolveGateway() : void 0,
230
+ isLoading,
231
+ error,
232
+ timedout
233
+ };
234
+ };
235
+ var useGateway = useGatewayFromWallet;
236
+
237
+ // src/client/components/connected/hooks/useConnectAccount.ts
238
+ var useConnectAccount = (gatewayName = MainNetwork.id, timeout) => {
239
+ const [connectError, setConnectError] = useState2();
240
+ const {
241
+ gateway,
242
+ error,
243
+ timedout
244
+ } = useGatewayFromWallet(gatewayName, timeout);
245
+ const [accountPermissions, accountPermissionsError] = useAccountPermissions();
246
+ const [address, setAddress] = useState2();
247
+ const connectSigner = useCallback(async () => {
248
+ try {
249
+ setConnectError(void 0);
250
+ const assertedGateway = assertEx(gateway, () => `Gateway ${gatewayName} is not available`);
251
+ const signer = assertedGateway.signer;
252
+ const address2 = await signer.address();
253
+ setAddress(address2);
254
+ return address2;
255
+ } catch (e) {
256
+ setConnectError(e);
257
+ }
258
+ }, [gateway, gatewayName]);
259
+ return {
260
+ address: asAddress(accountPermissions?.[0] ?? address),
261
+ connectSigner,
262
+ error: error ?? accountPermissionsError ?? connectError,
263
+ gateway,
264
+ timedout
265
+ };
266
+ };
267
+
268
+ // src/client/components/connected/ConnectAccountsStack.tsx
269
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
270
+ var DefaultConnectComponent = (props) => /* @__PURE__ */ jsx2(ButtonEx, { variant: "contained", size: "small", ...props });
271
+ var DefaultNoWalletInstalledComponent = () => /* @__PURE__ */ jsxs2(Alert, { severity: "warning", children: [
272
+ /* @__PURE__ */ jsx2(AlertTitle, { children: "XL1 Wallet Not Found" }),
273
+ /* @__PURE__ */ jsx2(Typography2, { gutterBottom: true, children: "Please ensure that your XL1 Wallet is installed to connect your account." }),
274
+ /* @__PURE__ */ jsx2(
275
+ Button,
276
+ {
277
+ sx: { display: "flex", justifySelf: "end" },
278
+ size: "small",
279
+ variant: "outlined",
280
+ href: "https://chromewebstore.google.com/detail/xl1-wallet/fblbagcjeigmhakkfgjpdlcapcgmcfbm",
281
+ target: "_blank",
282
+ rel: "noopener",
283
+ children: "Get XL1 Wallet"
284
+ }
285
+ )
286
+ ] });
287
+ var ConnectAccountsStack = ({
288
+ AccountComponent = ConnectedAccount,
289
+ ConnectComponent = DefaultConnectComponent,
290
+ NoWalletInstalledComponent = DefaultNoWalletInstalledComponent,
291
+ onAccountConnected,
292
+ onCancel,
293
+ timeout,
294
+ ...props
295
+ }) => {
296
+ const {
297
+ address,
298
+ connectSigner,
299
+ error,
300
+ timedout
301
+ } = useConnectAccount(void 0, timeout);
302
+ useEffect2(() => {
303
+ if (isDefined3(error) && isDefined3(onCancel)) {
304
+ onCancel();
305
+ }
306
+ }, [error, onCancel]);
307
+ useEffect2(() => {
308
+ if (isDefined3(address) && isDefined3(onAccountConnected)) {
309
+ onAccountConnected(address);
310
+ }
311
+ }, [address, onAccountConnected]);
312
+ return /* @__PURE__ */ jsxs2(Stack2, { direction: "row", alignItems: "start", spacing: 2, ...props, children: [
313
+ isDefined3(address) ? /* @__PURE__ */ jsx2(AccountComponent, { address }) : null,
314
+ isUndefined3(address) && !timedout ? /* @__PURE__ */ jsx2(ConnectComponent, { onClick: () => void connectSigner(), children: "Connect" }) : null,
315
+ isUndefined3(address) && timedout ? /* @__PURE__ */ jsx2(NoWalletInstalledComponent, {}) : null,
316
+ /* @__PURE__ */ jsx2(ErrorRender, { error, scope: "ConnectSigner:error" })
317
+ ] });
318
+ };
319
+
320
+ // src/client/context/GatewayContext.ts
321
+ import { createContextEx } from "@xylabs/react-shared";
322
+ var GatewayContext = createContextEx();
323
+
324
+ // src/client/context/in-page/InPageGatewaysContext.ts
325
+ import { createContextEx as createContextEx2 } from "@xylabs/react-shared";
326
+ var InPageGatewaysContext = createContextEx2();
327
+
328
+ // src/client/context/in-page/Provider.tsx
329
+ import { DefaultNetworks as DefaultNetworks2 } from "@xyo-network/xl1-sdk";
330
+ import {
331
+ startTransition,
332
+ useCallback as useCallback2,
333
+ useEffect as useEffect3,
334
+ useMemo,
335
+ useState as useState3
336
+ } from "react";
337
+
338
+ // src/client/context/in-page/lib/buildGateway.ts
339
+ import { assertEx as assertEx2, isDefined as isDefined4 } from "@xylabs/sdk-js";
340
+ import {
341
+ basicRemoteRunnerLocator,
342
+ basicRemoteViewerLocator,
343
+ DefaultNetworks,
344
+ NetworkDataLakeUrls,
345
+ XyoGatewayMoniker
346
+ } from "@xyo-network/xl1-sdk";
347
+ var buildGateway = async (gatewayName, signerTransport) => {
348
+ const network = DefaultNetworks.find((network2) => network2.id === gatewayName);
349
+ const resolvedNetwork = assertEx2(network, () => `No network found for id ${gatewayName}`);
350
+ const remoteConfig = {
351
+ rpc: {
352
+ protocol: "http",
353
+ url: `${resolvedNetwork.url}/rpc`
354
+ }
355
+ };
356
+ const dataLakeEndpoint = NetworkDataLakeUrls[gatewayName];
357
+ const locator = isDefined4(signerTransport) ? await basicRemoteRunnerLocator(gatewayName, remoteConfig, signerTransport, dataLakeEndpoint) : await basicRemoteViewerLocator(gatewayName, remoteConfig, dataLakeEndpoint);
358
+ return await locator.getInstance(XyoGatewayMoniker);
359
+ };
360
+
361
+ // src/client/context/in-page/Provider.tsx
362
+ import { jsx as jsx3 } from "react/jsx-runtime";
363
+ var InPageGatewaysProvider = ({ signerTransport, children }) => {
364
+ const [gateways, setGateways] = useState3({});
365
+ const [errors, setErrors] = useState3({});
366
+ const [previousSignerTransport, setPreviousSignerTransport] = useState3(signerTransport);
367
+ const clearAll = useCallback2(() => {
368
+ setGateways({});
369
+ setErrors({});
370
+ }, []);
371
+ if (previousSignerTransport !== signerTransport) {
372
+ clearAll();
373
+ setPreviousSignerTransport(signerTransport);
374
+ }
375
+ useEffect3(() => {
376
+ let cancelled = false;
377
+ const buildAll = async () => {
378
+ const results = await Promise.allSettled(
379
+ DefaultNetworks2.map(async (network) => {
380
+ const gateway = await buildGateway(network.id, signerTransport);
381
+ return { id: network.id, gateway };
382
+ })
383
+ );
384
+ if (cancelled) return;
385
+ const nextGateways = {};
386
+ const nextErrors = {};
387
+ for (const [index, result] of results.entries()) {
388
+ const networkId = DefaultNetworks2[index].id;
389
+ if (result.status === "fulfilled") {
390
+ nextGateways[networkId] = result.value.gateway;
391
+ } else {
392
+ nextErrors[networkId] = result.reason instanceof Error ? result.reason : new Error(String(result.reason));
393
+ }
394
+ }
395
+ startTransition(() => {
396
+ setGateways(nextGateways);
397
+ setErrors(nextErrors);
398
+ });
399
+ };
400
+ void buildAll();
401
+ return () => {
402
+ cancelled = true;
403
+ };
404
+ }, [signerTransport]);
405
+ const value = useMemo(() => {
406
+ const value2 = {
407
+ clearAll,
408
+ errors,
409
+ gateways,
410
+ provided: true
411
+ };
412
+ return value2;
413
+ }, [clearAll, errors, gateways]);
414
+ return /* @__PURE__ */ jsx3(InPageGatewaysContext, { value, children });
415
+ };
416
+
417
+ // src/client/context/in-page/useProvidedInPageGateways.ts
418
+ import { useContextEx } from "@xylabs/react-shared";
419
+ var useProvidedInPageGateways = (required = true) => useContextEx(InPageGatewaysContext, "InPageGateways", required);
420
+
421
+ // src/client/context/providers/GatewayProvider.tsx
422
+ import { ErrorRender as ErrorRender2 } from "@xylabs/react-error";
423
+ import { isDefinedNotNull as isDefinedNotNull2, isNull as isNull2 } from "@xylabs/sdk-js";
424
+ import { useMemo as useMemo2 } from "react";
425
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
426
+ var GatewayProvider = ({ gatewayName, children }) => {
427
+ const {
428
+ gateway: gatewayFromWallet,
429
+ error: gatewayFromWalletError
430
+ } = useGatewayFromWallet(gatewayName);
431
+ const {
432
+ gateways: allGateways,
433
+ errors: allGatewayErrors,
434
+ clearAll
435
+ } = useProvidedInPageGateways(true);
436
+ const gatewayFromConfig = gatewayName ? allGateways[gatewayName] : void 0;
437
+ const gatewayFromConfigError = gatewayName ? allGatewayErrors[gatewayName] : void 0;
438
+ const { defaultGateway, gateways } = useMemo2(() => {
439
+ if (isNull2(gatewayFromWallet)) {
440
+ return {
441
+ defaultGateway: gatewayFromConfig,
442
+ gateways: {
443
+ inPageGateway: gatewayFromConfig,
444
+ walletGateway: null
445
+ }
446
+ };
447
+ } else if (isDefinedNotNull2(gatewayFromWallet)) {
448
+ return {
449
+ defaultGateway: gatewayFromWallet,
450
+ gateways: {
451
+ inPageGateway: gatewayFromConfig,
452
+ walletGateway: gatewayFromWallet
453
+ }
454
+ };
455
+ }
456
+ return {
457
+ defaultGateway: void 0,
458
+ gateways: {
459
+ inPageGateway: void 0,
460
+ walletGateway: void 0
461
+ }
462
+ };
463
+ }, [gatewayFromConfig, gatewayFromWallet]);
464
+ const value = useMemo2(() => {
465
+ const value2 = {
466
+ defaultGateway,
467
+ error: gatewayFromWalletError ?? gatewayFromConfigError,
468
+ gateways,
469
+ provided: true,
470
+ resetGatewaysFromConfig: clearAll
471
+ };
472
+ return value2;
473
+ }, [
474
+ defaultGateway,
475
+ gatewayFromWalletError,
476
+ gatewayFromConfigError,
477
+ gateways,
478
+ clearAll
479
+ ]);
480
+ return /* @__PURE__ */ jsxs3(GatewayContext, { value, children: [
481
+ /* @__PURE__ */ jsx4(ErrorRender2, { error: gatewayFromConfigError }),
482
+ children
483
+ ] });
484
+ };
485
+
486
+ // src/client/context/providers/WalletGatewayProvider.tsx
487
+ import { ErrorRender as ErrorRender3 } from "@xylabs/react-error";
488
+ import { useMemo as useMemo3 } from "react";
489
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
490
+ var WalletGatewayProvider = ({ gatewayName, children }) => {
491
+ const {
492
+ gateway: gatewayFromWallet,
493
+ error: gatewayFromWalletError
494
+ } = useGatewayFromWallet(gatewayName);
495
+ const { defaultGateway, gateways } = useMemo3(() => {
496
+ return {
497
+ defaultGateway: gatewayFromWallet,
498
+ gateways: {
499
+ inPageGateway: null,
500
+ walletGateway: gatewayFromWallet
501
+ }
502
+ };
503
+ }, [gatewayFromWallet]);
504
+ const value = useMemo3(() => {
505
+ const value2 = {
506
+ defaultGateway,
507
+ error: gatewayFromWalletError,
508
+ gateways,
509
+ provided: true
510
+ };
511
+ return value2;
512
+ }, [
513
+ defaultGateway,
514
+ gatewayFromWalletError,
515
+ gateways
516
+ ]);
517
+ return /* @__PURE__ */ jsxs4(GatewayContext, { value, children: [
518
+ /* @__PURE__ */ jsx5(ErrorRender3, { error: gatewayFromWalletError }),
519
+ children
520
+ ] });
521
+ };
522
+
523
+ // src/client/context/useProvidedGateway.ts
524
+ import { useContextEx as useContextEx2 } from "@xylabs/react-shared";
525
+ var useProvidedGateway = (required = true) => useContextEx2(GatewayContext, "Gateway", required);
526
+
527
+ // src/model/types/XyoGlobal.ts
528
+ import { isDefinedNotNull as isDefinedNotNull3, isObject } from "@xylabs/sdk-js";
529
+ var isXyoGlobal = (obj) => {
530
+ return isDefinedNotNull3(obj) && isObject(obj) && "client" in obj && "connections" in obj && "errors" in obj && "sessionId" in obj && "walletExtensionId" in obj;
531
+ };
532
+ var isUninitializedXyoGlobal = (obj) => {
533
+ return isDefinedNotNull3(obj) && isObject(obj) && "connections" in obj && "sessionId" in obj && "walletExtensionId" in obj && !("client" in obj) && "errors" in obj && Array.isArray(obj.errors) && obj.errors.length === 0;
534
+ };
535
+
536
+ // src/shared/components/menu-item/ActiveMenuItem.tsx
537
+ import {
538
+ MenuItem,
539
+ styled,
540
+ useTheme
541
+ } from "@mui/material";
542
+ import { jsx as jsx6 } from "react/jsx-runtime";
543
+ var ActiveMenuItem = ({
544
+ active,
545
+ children,
546
+ sx,
547
+ ...props
548
+ }) => {
549
+ const theme = useTheme();
550
+ return /* @__PURE__ */ jsx6(
551
+ StyledMenuItem,
552
+ {
553
+ disableRipple: true,
554
+ sx: {
555
+ // left border color and background color for active state
556
+ "borderLeft": `5px solid ${active ? theme.vars.palette.secondary.light : "transparent"}`,
557
+ "backgroundColor": active ? theme.vars.palette.secondary.dark : "transparent",
558
+ // force white text color for active state for improved readability with background color
559
+ "color": active ? "white" : "unset",
560
+ "&:hover": {
561
+ // overriding default hover color and backgroundColor since active state conflicts visually with
562
+ // default styles of MenuItem hover
563
+ ...active ? { backgroundColor: theme.vars.palette.secondary.dark } : {},
564
+ color: active ? "white" : "unset"
565
+ },
566
+ ...sx
567
+ },
568
+ ...props,
569
+ children
570
+ }
571
+ );
572
+ };
573
+ var StyledMenuItem = styled(MenuItem, { name: "StyledMenuItem" })(({ theme }) => ({
574
+ display: "flex-inline",
575
+ flexDirection: "row",
576
+ gap: theme.spacing(1),
577
+ padding: 0,
578
+ paddingLeft: theme.spacing(1),
579
+ marginBottom: theme.spacing(1)
580
+ }));
581
+
582
+ // src/shared/components/stack/DetailsStack.tsx
583
+ import {
584
+ Stack as Stack3,
585
+ styled as styled2,
586
+ Tooltip as Tooltip2,
587
+ Typography as Typography3,
588
+ useTheme as useTheme2
589
+ } from "@mui/material";
590
+ import { isDefined as isDefined5 } from "@xylabs/sdk-js";
591
+ import { useMemo as useMemo4 } from "react";
592
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
593
+ var isComponentType = (value) => typeof value === "function" || typeof value === "object" && value !== null && ("$$typeof" in value || "render" in value);
594
+ var DetailsStack = ({
595
+ IconComponent,
596
+ heading,
597
+ children,
598
+ tooltipTitle,
599
+ ...props
600
+ }) => {
601
+ const theme = useTheme2();
602
+ const hasTooltip = isDefined5(tooltipTitle);
603
+ const resolvedIconComponent = useMemo4(() => {
604
+ return isComponentType(IconComponent) ? /* @__PURE__ */ jsx7(
605
+ IconComponent,
606
+ {
607
+ style: {
608
+ /** height and marginTop adjusted to account for font not filling container with line-height: 1 */
609
+ height: "0.85rem",
610
+ marginTop: 0.5,
611
+ marginLeft: theme.spacing(1)
612
+ }
613
+ }
614
+ ) : IconComponent ?? null;
615
+ }, [IconComponent, theme]);
616
+ return /* @__PURE__ */ jsxs5(Stack3, { direction: "column", flexGrow: 1, flexWrap: "wrap", minWidth: "1px", ...props, children: [
617
+ /* @__PURE__ */ jsxs5(SectionHeadingTypography, { children: [
618
+ heading,
619
+ hasTooltip ? /* @__PURE__ */ jsx7(Tooltip2, { title: tooltipTitle, children: /* @__PURE__ */ jsx7("span", { children: resolvedIconComponent }) }) : resolvedIconComponent
620
+ ] }),
621
+ children
622
+ ] });
623
+ };
624
+ var SectionHeadingTypography = styled2(Typography3, { name: "SectionHeadingTypography" })(({ theme }) => ({
625
+ display: "flex",
626
+ fontFamily: "monospace",
627
+ lineHeight: 1,
628
+ marginBottom: theme.spacing(1.5)
629
+ }));
630
+
631
+ // src/shared/components/stack/LabelValueStack.tsx
632
+ import {
633
+ Stack as Stack4,
634
+ Typography as Typography4,
635
+ useTheme as useTheme3
636
+ } from "@mui/material";
637
+ import { ellipsize, isAddress } from "@xylabs/sdk-js";
638
+ import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
639
+ var LabelValueStack = ({
640
+ labels,
641
+ values,
642
+ ...props
643
+ }) => {
644
+ const theme = useTheme3();
645
+ const formattedValue = (value) => {
646
+ if (isAddress(value)) {
647
+ return ellipsize(value, 8);
648
+ }
649
+ return value;
650
+ };
651
+ return /* @__PURE__ */ jsxs6(Stack4, { flexDirection: "row", flexGrow: 1, ...props, children: [
652
+ /* @__PURE__ */ jsx8(Stack4, { children: labels.map((label) => /* @__PURE__ */ jsxs6(
653
+ Typography4,
654
+ {
655
+ fontWeight: "300",
656
+ variant: "body2",
657
+ sx: { borderBottom: `1px solid ${theme.vars?.palette.divider}`, opacity: 0.7 },
658
+ children: [
659
+ label,
660
+ ":"
661
+ ]
662
+ },
663
+ label
664
+ )) }),
665
+ /* @__PURE__ */ jsx8(Stack4, { alignItems: "end", flexGrow: 1, children: values.map((value, index) => /* @__PURE__ */ jsx8(
666
+ Typography4,
667
+ {
668
+ title: value,
669
+ fontFamily: "monospace",
670
+ variant: "body2",
671
+ width: "100%",
672
+ sx: {
673
+ display: "flex",
674
+ justifyContent: "end",
675
+ borderBottom: `1px solid ${theme.vars?.palette.divider}`
676
+ },
677
+ children: formattedValue(value)
678
+ },
679
+ labels[index]
680
+ )) })
681
+ ] });
682
+ };
683
+
684
+ // src/shared/decorators/IframeWalletWarningDecorator.tsx
685
+ import { Alert as Alert2, Stack as Stack5 } from "@mui/material";
686
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
687
+ var inIframe = globalThis.self !== window.top;
688
+ var IframeWalletWarningDecorator = (Story, args) => {
689
+ const hasXyoGlobal = isXyoGlobal(globalThis.xyo);
690
+ return /* @__PURE__ */ jsxs7(Stack5, { gap: 2, children: [
691
+ inIframe ? /* @__PURE__ */ jsx9(Alert2, { severity: "warning", children: "This story is running in an iframe. Please run it in a standalone browser window to test the wallet extension." }) : null,
692
+ hasXyoGlobal ? null : /* @__PURE__ */ jsx9(Alert2, { severity: "warning", children: "No wallet extension found. Please install the Xyo Wallet Chrome Extension." }),
693
+ /* @__PURE__ */ jsx9(Story, { ...args })
694
+ ] });
695
+ };
696
+ export {
697
+ ActiveMenuItem,
698
+ ConnectAccountsStack,
699
+ ConnectedAccount,
700
+ DetailsStack,
701
+ GatewayContext,
702
+ GatewayProvider,
703
+ IframeWalletWarningDecorator,
704
+ InPageGatewaysContext,
705
+ InPageGatewaysProvider,
706
+ LabelValueStack,
707
+ WalletGatewayProvider,
708
+ findCaveat,
709
+ getXyoClient,
710
+ isUninitializedXyoGlobal,
711
+ isXyoGlobal,
712
+ listenForClientInjection,
713
+ useAccountPermissions,
714
+ useClient,
715
+ useClientFromWallet,
716
+ useGateway,
717
+ useGatewayFromWallet,
718
+ usePermissions,
719
+ useProvidedGateway,
720
+ useProvidedInPageGateways
721
+ };
722
+ //# sourceMappingURL=index.mjs.map