@xyo-network/react-chain-network 1.19.10 → 1.19.12

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 (32) hide show
  1. package/dist/browser/components/broadcast/Drawer.d.ts +5 -2
  2. package/dist/browser/components/broadcast/Drawer.d.ts.map +1 -1
  3. package/dist/browser/components/broadcast/details/Card.d.ts +3 -2
  4. package/dist/browser/components/broadcast/details/Card.d.ts.map +1 -1
  5. package/dist/browser/components/broadcast/details/SummaryStack.d.ts +2 -0
  6. package/dist/browser/components/broadcast/details/SummaryStack.d.ts.map +1 -1
  7. package/dist/browser/components/broadcast/details/SummaryStack.stories.d.ts +8 -0
  8. package/dist/browser/components/broadcast/details/SummaryStack.stories.d.ts.map +1 -0
  9. package/dist/browser/components/broadcast/usePaginatedEventPairs.d.ts +13 -0
  10. package/dist/browser/components/broadcast/usePaginatedEventPairs.d.ts.map +1 -0
  11. package/dist/browser/hooks/provider/UseViewerInPage.stories.d.ts.map +1 -1
  12. package/dist/browser/hooks/provider/useRpcBroadcastListener.d.ts +3 -2
  13. package/dist/browser/hooks/provider/useRpcBroadcastListener.d.ts.map +1 -1
  14. package/dist/browser/index.mjs +469 -337
  15. package/dist/browser/index.mjs.map +1 -1
  16. package/dist/browser/model/BroadcastRpc.d.ts +3 -0
  17. package/dist/browser/model/BroadcastRpc.d.ts.map +1 -1
  18. package/package.json +11 -10
  19. package/src/components/broadcast/Drawer.tsx +66 -14
  20. package/src/components/broadcast/details/Card.tsx +26 -9
  21. package/src/components/broadcast/details/SummaryStack.stories.tsx +36 -0
  22. package/src/components/broadcast/details/SummaryStack.tsx +41 -3
  23. package/src/components/broadcast/usePaginatedEventPairs.ts +64 -0
  24. package/src/hooks/provider/UseViewerInPage.stories.tsx +10 -8
  25. package/src/hooks/provider/useRpcBroadcastListener.ts +36 -6
  26. package/src/model/BroadcastRpc.ts +4 -0
  27. package/dist/browser/components/broadcast/helpers/formatEvents.d.ts +0 -7
  28. package/dist/browser/components/broadcast/helpers/formatEvents.d.ts.map +0 -1
  29. package/dist/browser/components/broadcast/helpers/index.d.ts +0 -2
  30. package/dist/browser/components/broadcast/helpers/index.d.ts.map +0 -1
  31. package/src/components/broadcast/helpers/formatEvents.ts +0 -40
  32. package/src/components/broadcast/helpers/index.ts +0 -1
@@ -2,15 +2,288 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // src/components/broadcast/Drawer.tsx
5
- import { Drawer, Stack as Stack3, Typography as Typography3 } from "@mui/material";
6
- import React4, { useMemo } from "react";
5
+ import { Box, Button, Drawer, Pagination, Stack as Stack3, Typography as Typography3 } from "@mui/material";
6
+ import React5 from "react";
7
+
8
+ // src/hooks/provider/useActiveNetworkCurrentBlock.ts
9
+ import { useCurrentBlock, useViewerFromWallet as useViewerFromWallet2 } from "@xyo-network/react-chain-provider";
10
+
11
+ // src/hooks/provider/useViewerInPage.ts
12
+ import { isDefined as isDefined2, isNull, isUndefined } from "@xylabs/sdk-js";
13
+ import { useHttpRpcViewer, useViewerFromWallet } from "@xyo-network/react-chain-provider";
14
+
15
+ // src/context/network/context.ts
16
+ import { createContextEx } from "@xylabs/react-shared";
17
+ var ChainNetworkContext = createContextEx();
18
+
19
+ // src/context/network/Provider.tsx
20
+ import { ErrorRender } from "@xylabs/react-error";
21
+ import { usePromise } from "@xylabs/react-promise";
22
+ import { isDefined } from "@xylabs/sdk-js";
23
+ import { MainNetwork } from "@xyo-network/xl1-sdk";
24
+ import React, { useCallback as useCallback2, useMemo, useState as useState2 } from "react";
25
+
26
+ // src/context/network/settings/defaultChainNetworkSettings.ts
27
+ import { LocalNetwork } from "@xyo-network/xl1-sdk";
28
+ var defaultChainNetworkSettings = {
29
+ [LocalNetwork.id]: {
30
+ proxy: true
31
+ }
32
+ };
33
+
34
+ // src/context/network/settings/useChainNetworkSettings.ts
35
+ import { useCallback, useState } from "react";
36
+ var useChainNetworkSettings = /* @__PURE__ */ __name((defaults = defaultChainNetworkSettings) => {
37
+ const [networkSettings, setNetworkSettings] = useState(defaults);
38
+ const updateNetworkSettings = useCallback((networkId, settings) => {
39
+ setNetworkSettings((prevSettings) => ({
40
+ ...prevSettings,
41
+ [networkId]: {
42
+ ...prevSettings[networkId],
43
+ ...settings
44
+ }
45
+ }));
46
+ }, []);
47
+ return {
48
+ networkSettings,
49
+ updateNetworkSettings
50
+ };
51
+ }, "useChainNetworkSettings");
52
+
53
+ // src/context/network/Provider.tsx
54
+ var ChainNetworkProvider = /* @__PURE__ */ __name(({ children, getActiveNetwork, networkSettings: networkSettingsProp = defaultChainNetworkSettings, networks, setActiveNetwork: setActiveNetworkExternal }) => {
55
+ const [activeNetwork, setActiveNetwork] = useState2();
56
+ const [error, setError] = useState2();
57
+ const { networkSettings, updateNetworkSettings } = useChainNetworkSettings(networkSettingsProp);
58
+ const [resolvedActiveNetwork, activeNetworkError] = usePromise(async () => {
59
+ if (!networks) return;
60
+ const activeNetwork2 = await getActiveNetwork?.();
61
+ if (activeNetwork2 && networks?.find((network) => network.id === activeNetwork2.id)) {
62
+ return activeNetwork2;
63
+ } else {
64
+ const defaultNetwork = networks.find((network) => network.id === MainNetwork.id) ?? networks[0];
65
+ await setActiveNetworkExternal?.(defaultNetwork.id);
66
+ return defaultNetwork;
67
+ }
68
+ }, [
69
+ networks
70
+ ]);
71
+ const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState2(resolvedActiveNetwork);
72
+ if (isDefined(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {
73
+ setActiveNetwork(resolvedActiveNetwork);
74
+ setPreviousResolvedActiveNetwork(resolvedActiveNetwork);
75
+ }
76
+ const updateActiveNetwork = useCallback2((networkId) => {
77
+ setError(void 0);
78
+ const network = networks?.find((network2) => network2.id === networkId);
79
+ if (!network) {
80
+ setError(new Error(`Network with id ${networkId} not found`));
81
+ return;
82
+ }
83
+ setActiveNetwork(network);
84
+ void setActiveNetworkExternal?.(networkId);
85
+ }, [
86
+ networks,
87
+ setActiveNetworkExternal
88
+ ]);
89
+ const value = useMemo(() => ({
90
+ activeNetwork,
91
+ networks,
92
+ provided: true,
93
+ updateActiveNetwork,
94
+ networkSettings,
95
+ updateNetworkSettings,
96
+ chainNetworkError: error ?? activeNetworkError
97
+ }), [
98
+ activeNetwork,
99
+ activeNetworkError,
100
+ error,
101
+ networkSettings,
102
+ networks,
103
+ updateActiveNetwork,
104
+ updateNetworkSettings
105
+ ]);
106
+ return /* @__PURE__ */ React.createElement(ChainNetworkContext, {
107
+ value
108
+ }, /* @__PURE__ */ React.createElement(ErrorRender, {
109
+ error: error ?? activeNetworkError,
110
+ scope: "ChainNetworkProvider"
111
+ }), children);
112
+ }, "ChainNetworkProvider");
113
+
114
+ // src/context/network/use.ts
115
+ import { useContextEx } from "@xylabs/react-shared";
116
+ var useChainNetwork = /* @__PURE__ */ __name((required = true) => useContextEx(ChainNetworkContext, "ChainNetwork", required), "useChainNetwork");
117
+
118
+ // src/hooks/provider/useViewerInPage.ts
119
+ var shouldProxy = /* @__PURE__ */ __name((networkSettings, networkBootstrap) => {
120
+ return isDefined2(networkBootstrap) && isDefined2(networkSettings[networkBootstrap.id]) && networkSettings[networkBootstrap.id].proxy;
121
+ }, "shouldProxy");
122
+ var useViewerInPage = /* @__PURE__ */ __name((networkOverride) => {
123
+ let networkBootstrap;
124
+ const { activeNetwork, networkSettings } = useChainNetwork();
125
+ networkBootstrap = isDefined2(networkOverride) ? networkOverride : activeNetwork;
126
+ const httpRpcViewer = useHttpRpcViewer(networkBootstrap?.url);
127
+ const [walletRpcViewer] = useViewerFromWallet(networkBootstrap?.id);
128
+ if (isUndefined(walletRpcViewer)) return;
129
+ if (shouldProxy(networkSettings, networkBootstrap)) {
130
+ if (isNull(walletRpcViewer)) {
131
+ console.warn(`Network ${networkBootstrap?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`);
132
+ return httpRpcViewer;
133
+ }
134
+ return walletRpcViewer;
135
+ }
136
+ return httpRpcViewer;
137
+ }, "useViewerInPage");
138
+
139
+ // src/hooks/provider/useActiveNetworkCurrentBlock.ts
140
+ var useActiveNetworkCurrentBlock = /* @__PURE__ */ __name((refresh = 1, viewer) => {
141
+ const currentBlock = useCurrentBlock(refresh, viewer);
142
+ return currentBlock;
143
+ }, "useActiveNetworkCurrentBlock");
144
+ var useActiveNetworkCurrentBlockInPage = /* @__PURE__ */ __name((refresh = 1) => {
145
+ const viewer = useViewerInPage();
146
+ const currentBlock = useCurrentBlock(refresh, viewer);
147
+ return currentBlock;
148
+ }, "useActiveNetworkCurrentBlockInPage");
149
+ var useActiveNetworkCurrentBlockInWallet = /* @__PURE__ */ __name((refresh = 1) => {
150
+ const [viewer] = useViewerFromWallet2();
151
+ const currentBlock = useCurrentBlock(refresh, viewer);
152
+ return currentBlock;
153
+ }, "useActiveNetworkCurrentBlockInWallet");
154
+
155
+ // src/hooks/provider/useActiveNetworkNetwork.ts
156
+ import { useNetwork } from "@xyo-network/react-chain-provider";
157
+ var useActiveNetworkNetwork = /* @__PURE__ */ __name(() => {
158
+ const { activeNetwork } = useChainNetwork();
159
+ const network = useNetwork(activeNetwork?.id);
160
+ return network;
161
+ }, "useActiveNetworkNetwork");
162
+
163
+ // src/hooks/provider/useActiveNetworkRunner.ts
164
+ import { useHttpRpcRunner } from "@xyo-network/react-chain-provider";
165
+ var useActiveNetworkRunner = /* @__PURE__ */ __name(() => {
166
+ const { activeNetwork } = useChainNetwork();
167
+ const runner = useHttpRpcRunner(activeNetwork?.url);
168
+ return runner;
169
+ }, "useActiveNetworkRunner");
170
+
171
+ // src/hooks/provider/useRpcBroadcastListener.ts
172
+ import { isJsonRpcRequest, isJsonRpcResponse } from "@metamask/utils";
173
+ import { isDefined as isDefined3, isString } from "@xylabs/sdk-js";
174
+ import { useEffect, useState as useState3 } from "react";
175
+ var parseRpcCall = /* @__PURE__ */ __name((acc, event) => {
176
+ if (isJsonRpcResponse(event.rpcCall)) {
177
+ const castedEvent = event;
178
+ acc[castedEvent.rpcCall.id].result = castedEvent;
179
+ } else if (isJsonRpcRequest(event.rpcCall)) {
180
+ const castedEvent = event;
181
+ acc[castedEvent.rpcCall.id].request = castedEvent;
182
+ } else {
183
+ console.error("Unknown RPC call type", event);
184
+ }
185
+ acc[event.rpcCall.id].source = event.source;
186
+ return acc;
187
+ }, "parseRpcCall");
188
+ var useRpcBroadcastListener = /* @__PURE__ */ __name(() => {
189
+ const [events, setEvents] = useState3({});
190
+ const clearEvents = /* @__PURE__ */ __name(() => setEvents({}), "clearEvents");
191
+ useEffect(() => {
192
+ const listener = /* @__PURE__ */ __name((e) => {
193
+ if ("detail" in e) {
194
+ const { detail } = e ?? {};
195
+ if (isString(detail)) {
196
+ try {
197
+ const parsedDetail = JSON.parse(detail);
198
+ const { data: rpcCall, source } = parsedDetail;
199
+ const broadcastedRpcCall = {
200
+ rpcCall,
201
+ source,
202
+ timestamp: Date.now()
203
+ };
204
+ setEvents((prev) => {
205
+ const { id } = broadcastedRpcCall.rpcCall;
206
+ const newState = {
207
+ ...prev
208
+ };
209
+ if (isDefined3(newState[id])) {
210
+ parseRpcCall(newState, broadcastedRpcCall);
211
+ } else {
212
+ newState[id] = {};
213
+ parseRpcCall(newState, broadcastedRpcCall);
214
+ }
215
+ return newState;
216
+ });
217
+ } catch (err) {
218
+ console.error(err);
219
+ }
220
+ }
221
+ }
222
+ }, "listener");
223
+ globalThis.addEventListener("xyo:broadcast-rpc-request", listener);
224
+ globalThis.addEventListener("xyo:broadcast-rpc-response", listener);
225
+ return () => {
226
+ globalThis.removeEventListener("xyo:broadcast-rpc-request", listener);
227
+ globalThis.removeEventListener("xyo:broadcast-rpc-response", listener);
228
+ };
229
+ }, []);
230
+ return {
231
+ events,
232
+ clearEvents
233
+ };
234
+ }, "useRpcBroadcastListener");
235
+
236
+ // src/hooks/provider/useViewerInWallet.ts
237
+ import { useHttpRpcViewer as useHttpRpcViewer2 } from "@xyo-network/react-chain-provider";
238
+ var useViewerInWallet = /* @__PURE__ */ __name(() => {
239
+ const { activeNetwork } = useChainNetwork();
240
+ const walletViewer = useHttpRpcViewer2(activeNetwork?.url);
241
+ return walletViewer;
242
+ }, "useViewerInWallet");
243
+
244
+ // src/hooks/status/usePollNetworkStatus.ts
245
+ import { delay, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
246
+ import { useEffect as useEffect2, useState as useState4 } from "react";
247
+ var STATUS_CHECK_INTERVAL = 1e4;
248
+ var usePollNetworkStatus = /* @__PURE__ */ __name(() => {
249
+ const network = useActiveNetworkNetwork();
250
+ const [networkStatus, setNetworkStatus] = useState4();
251
+ const [networkStatusError, setNetworkStatusError] = useState4();
252
+ useEffect2(() => {
253
+ let checkNetwork = true;
254
+ void (async () => {
255
+ if (isUndefined2(network)) return;
256
+ while (checkNetwork) {
257
+ try {
258
+ const response = await network.status();
259
+ setNetworkStatus(response);
260
+ setNetworkStatusError(void 0);
261
+ } catch (error) {
262
+ console.error("Error fetching network status:", error);
263
+ setNetworkStatus(void 0);
264
+ setNetworkStatusError(error);
265
+ }
266
+ await delay(STATUS_CHECK_INTERVAL);
267
+ }
268
+ })();
269
+ return () => {
270
+ checkNetwork = false;
271
+ };
272
+ }, [
273
+ network
274
+ ]);
275
+ return [
276
+ networkStatus,
277
+ networkStatusError
278
+ ];
279
+ }, "usePollNetworkStatus");
7
280
 
8
281
  // src/components/broadcast/CloseDrawerIconButton.tsx
9
282
  import { Cancel } from "@mui/icons-material";
10
283
  import { IconButton } from "@mui/material";
11
- import React from "react";
284
+ import React2 from "react";
12
285
  var CloseDrawerIconButton = /* @__PURE__ */ __name(({ anchor, onClose }) => {
13
- return /* @__PURE__ */ React.createElement(IconButton, {
286
+ return /* @__PURE__ */ React2.createElement(IconButton, {
14
287
  onClick: /* @__PURE__ */ __name((e) => onClose?.(e, "backdropClick"), "onClick"),
15
288
  size: "small",
16
289
  sx: {
@@ -19,275 +292,278 @@ var CloseDrawerIconButton = /* @__PURE__ */ __name(({ anchor, onClose }) => {
19
292
  right: anchor === "right" ? void 0 : 8,
20
293
  left: anchor === "left" ? void 0 : 8
21
294
  }
22
- }, /* @__PURE__ */ React.createElement(Cancel, {
295
+ }, /* @__PURE__ */ React2.createElement(Cancel, {
23
296
  fontSize: "small"
24
297
  }));
25
298
  }, "CloseDrawerIconButton");
26
299
 
27
300
  // src/components/broadcast/details/Card.tsx
28
301
  import { Card, Collapse, Stack as Stack2, Typography as Typography2 } from "@mui/material";
29
- import { isDefined as isDefined2 } from "@xylabs/sdk-js";
302
+ import { isDefined as isDefined5 } from "@xylabs/sdk-js";
30
303
  import { JsonViewerEx } from "@xyo-network/react-payload-raw-info";
31
- import React3, { useState } from "react";
304
+ import React4, { memo, useState as useState5 } from "react";
32
305
 
33
306
  // src/components/broadcast/details/SummaryStack.tsx
34
307
  import { ArrowRight, CheckCircle, Warning } from "@mui/icons-material";
35
- import { Icon, IconButton as IconButton2, Stack, Typography } from "@mui/material";
36
- import { isDefined } from "@xylabs/sdk-js";
37
- import React2 from "react";
38
- var BroadcastedRpcCallDetailsSummaryStack = /* @__PURE__ */ __name(({ expanded, setExpanded, method, timestamp, hasResult, ...props }) => {
39
- return /* @__PURE__ */ React2.createElement(Stack, {
308
+ import { Avatar, Icon, IconButton as IconButton2, Stack, Typography, useTheme } from "@mui/material";
309
+ import { Identicon } from "@xylabs/react-identicon";
310
+ import { isDefined as isDefined4, isHash } from "@xylabs/sdk-js";
311
+ import React3 from "react";
312
+ var inferParamsType = /* @__PURE__ */ __name((params) => {
313
+ if (!params || !Array.isArray(params)) return {
314
+ type: "unknown"
315
+ };
316
+ const firstParam = params[0];
317
+ if (isHash(firstParam)) {
318
+ return {
319
+ type: "hash",
320
+ value: firstParam
321
+ };
322
+ }
323
+ return {
324
+ type: "unknown"
325
+ };
326
+ }, "inferParamsType");
327
+ var BroadcastedRpcCallDetailsSummaryStack = /* @__PURE__ */ __name(({ expanded, setExpanded, method, timestamp, hasResult, params, ...props }) => {
328
+ const theme = useTheme();
329
+ const { type, value } = inferParamsType(params);
330
+ return /* @__PURE__ */ React3.createElement(Stack, {
40
331
  direction: "row",
41
332
  gap: 2,
42
333
  alignItems: "center",
43
334
  justifyContent: "space-between",
44
335
  ...props
45
- }, /* @__PURE__ */ React2.createElement(Stack, {
336
+ }, /* @__PURE__ */ React3.createElement(Stack, {
46
337
  direction: "row",
47
338
  gap: 2,
48
339
  alignItems: "center"
49
- }, /* @__PURE__ */ React2.createElement(IconButton2, {
340
+ }, /* @__PURE__ */ React3.createElement(IconButton2, {
50
341
  size: "small",
51
342
  onClick: /* @__PURE__ */ __name(() => setExpanded?.(!expanded), "onClick")
52
- }, /* @__PURE__ */ React2.createElement(ArrowRight, {
343
+ }, /* @__PURE__ */ React3.createElement(ArrowRight, {
344
+ sx: {
345
+ transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
346
+ transition: "transform 0.2s ease-in-out"
347
+ },
53
348
  fontSize: "small"
54
- })), /* @__PURE__ */ React2.createElement(Typography, {
349
+ })), /* @__PURE__ */ React3.createElement(Typography, {
55
350
  component: "span",
56
351
  variant: "body2",
57
352
  fontFamily: "monospace"
58
- }, method), /* @__PURE__ */ React2.createElement(Typography, {
353
+ }, method), type === "hash" ? /* @__PURE__ */ React3.createElement(Avatar, {
354
+ sx: {
355
+ backgroundColor: theme.vars?.palette.text.primary,
356
+ width: 20,
357
+ height: 20
358
+ }
359
+ }, /* @__PURE__ */ React3.createElement(Identicon, {
360
+ value,
361
+ size: 14
362
+ })) : null, /* @__PURE__ */ React3.createElement(Typography, {
59
363
  component: "span",
60
364
  variant: "caption",
61
365
  color: "text.secondary",
62
366
  sx: {
63
367
  opacity: 0.6
64
368
  }
65
- }, isDefined(timestamp) ? new Date(timestamp).toLocaleString() : "")), /* @__PURE__ */ React2.createElement(Icon, {
369
+ }, isDefined4(timestamp) ? new Date(timestamp).toLocaleString() : "")), /* @__PURE__ */ React3.createElement(Icon, {
66
370
  sx: {
67
371
  justifySelf: "end"
68
372
  }
69
- }, hasResult ? /* @__PURE__ */ React2.createElement(CheckCircle, {
373
+ }, hasResult ? /* @__PURE__ */ React3.createElement(CheckCircle, {
70
374
  color: "success"
71
- }) : /* @__PURE__ */ React2.createElement(Warning, {
375
+ }) : /* @__PURE__ */ React3.createElement(Warning, {
72
376
  color: "warning"
73
377
  })));
74
378
  }, "BroadcastedRpcCallDetailsSummaryStack");
75
379
 
76
380
  // src/components/broadcast/details/Card.tsx
77
- var BroadcastedRpcCallDetails = /* @__PURE__ */ __name(({ rpcRequestResponsePairs }) => {
78
- const [expanded, setExpanded] = useState(false);
381
+ var JSON_VIEWER_WIDTH = 600;
382
+ var BroadcastedRpcCallDetailsCard = /* @__PURE__ */ memo(({ rpcRequestResponsePairs, sx, ...props }) => {
383
+ const [expanded, setExpanded] = useState5(false);
79
384
  if (!rpcRequestResponsePairs) return null;
80
385
  const { request, result, source } = rpcRequestResponsePairs;
81
- return /* @__PURE__ */ React3.createElement(Card, {
386
+ return /* @__PURE__ */ React4.createElement(Card, {
82
387
  sx: {
83
- p: 1
84
- }
85
- }, /* @__PURE__ */ React3.createElement(BroadcastedRpcCallDetailsSummaryStack, {
388
+ p: 1,
389
+ display: "flex",
390
+ flexDirection: "column",
391
+ width: JSON_VIEWER_WIDTH,
392
+ ...sx
393
+ },
394
+ ...props
395
+ }, /* @__PURE__ */ React4.createElement(BroadcastedRpcCallDetailsSummaryStack, {
86
396
  expanded,
87
- hasResult: isDefined2(result),
397
+ params: request.rpcCall.params,
398
+ hasResult: isDefined5(result),
88
399
  method: request.rpcCall.method,
89
400
  setExpanded,
90
401
  timestamp: request.timestamp
91
- }), /* @__PURE__ */ React3.createElement(Collapse, {
92
- in: expanded
93
- }, /* @__PURE__ */ React3.createElement(Stack2, {
402
+ }), /* @__PURE__ */ React4.createElement(Collapse, {
403
+ in: expanded,
404
+ unmountOnExit: true
405
+ }, /* @__PURE__ */ React4.createElement(Stack2, {
94
406
  direction: "column",
95
407
  p: 1,
96
408
  gap: 2,
97
- width: 600
98
- }, /* @__PURE__ */ React3.createElement(Typography2, {
409
+ alignItems: "stretch"
410
+ }, /* @__PURE__ */ React4.createElement(Typography2, {
99
411
  variant: "body2"
100
- }, "Source:", /* @__PURE__ */ React3.createElement(Typography2, {
412
+ }, "Source:", /* @__PURE__ */ React4.createElement(Typography2, {
101
413
  variant: "caption",
102
414
  component: "span",
103
415
  fontFamily: "monospace",
104
416
  sx: {
105
417
  ml: 1
106
418
  }
107
- }, source)), /* @__PURE__ */ React3.createElement(Typography2, {
419
+ }, source)), /* @__PURE__ */ React4.createElement(Typography2, {
108
420
  variant: "body2"
109
- }, "Request:"), /* @__PURE__ */ React3.createElement(JsonViewerEx, {
421
+ }, "Request:"), /* @__PURE__ */ React4.createElement(JsonViewerEx, {
110
422
  value: request,
111
423
  sx: {
112
424
  maxHeight: 300,
113
425
  overflow: "auto"
114
426
  }
115
- }), isDefined2(result) ? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(Typography2, {
427
+ }), isDefined5(result) ? /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(Typography2, {
116
428
  variant: "body2"
117
- }, "Result:"), /* @__PURE__ */ React3.createElement(JsonViewerEx, {
429
+ }, "Result:"), /* @__PURE__ */ React4.createElement(JsonViewerEx, {
118
430
  value: result,
119
431
  sx: {
120
432
  maxHeight: 300,
121
433
  overflow: "auto"
122
434
  }
123
435
  })) : null)));
124
- }, "BroadcastedRpcCallDetails");
436
+ });
125
437
 
126
- // src/components/broadcast/helpers/formatEvents.ts
127
- import { isJsonRpcRequest, isJsonRpcResponse } from "@metamask/utils";
128
- import { isArray, isDefined as isDefined3 } from "@xylabs/sdk-js";
129
- var formatEvents = /* @__PURE__ */ __name((events) => {
130
- if (!isArray(events) || events.length === 0) return {};
131
- const parseRpcCall = /* @__PURE__ */ __name((acc2, event) => {
132
- if (isJsonRpcResponse(event.rpcCall)) {
133
- const castedEvent = event;
134
- acc2[castedEvent.rpcCall.id].result = castedEvent;
135
- } else if (isJsonRpcRequest(event.rpcCall)) {
136
- const castedEvent = event;
137
- acc2[castedEvent.rpcCall.id].request = castedEvent;
138
- } else {
139
- console.error("Unknown RPC call type", event);
140
- }
141
- acc2[event.rpcCall.id].source = event.source;
142
- return acc2;
143
- }, "parseRpcCall");
144
- let acc = {};
145
- for (const event of events) {
146
- const { id } = event.rpcCall;
147
- if (isDefined3(acc[id])) {
148
- acc = parseRpcCall(acc, event);
149
- } else {
150
- acc[id] = {};
151
- acc = parseRpcCall(acc, event);
152
- }
153
- }
154
- return acc;
155
- }, "formatEvents");
438
+ // src/components/broadcast/usePaginatedEventPairs.ts
439
+ import { useCallback as useCallback3, useMemo as useMemo2, useState as useState6 } from "react";
440
+ var usePaginatedEventPairs = /* @__PURE__ */ __name((formattedEvents, numberOfVisiblePairs, onClearEvents) => {
441
+ const [currentPage, setCurrentPage] = useState6(0);
442
+ const allEventEntries = useMemo2(() => {
443
+ return Object.entries(formattedEvents ?? {}).toSorted(([, a], [, b]) => b.request.timestamp - a.request.timestamp);
444
+ }, [
445
+ formattedEvents
446
+ ]);
447
+ const totalPages = useMemo2(() => {
448
+ return Math.ceil(allEventEntries.length / numberOfVisiblePairs);
449
+ }, [
450
+ allEventEntries.length,
451
+ numberOfVisiblePairs
452
+ ]);
453
+ const effectiveCurrentPage = useMemo2(() => {
454
+ if (totalPages === 0) return 0;
455
+ return Math.min(currentPage, totalPages - 1);
456
+ }, [
457
+ currentPage,
458
+ totalPages
459
+ ]);
460
+ const visibleEvents = useMemo2(() => {
461
+ const startIndex = effectiveCurrentPage * numberOfVisiblePairs;
462
+ const endIndex = startIndex + numberOfVisiblePairs;
463
+ return allEventEntries.slice(startIndex, endIndex);
464
+ }, [
465
+ allEventEntries,
466
+ effectiveCurrentPage,
467
+ numberOfVisiblePairs
468
+ ]);
469
+ const handlePreviousPage = useCallback3(() => {
470
+ setCurrentPage((prev) => Math.max(0, prev - 1));
471
+ }, []);
472
+ const handleNextPage = useCallback3(() => {
473
+ setCurrentPage((prev) => Math.min(totalPages - 1, prev + 1));
474
+ }, [
475
+ totalPages
476
+ ]);
477
+ const handleClearEvents = useCallback3(() => {
478
+ setCurrentPage(0);
479
+ onClearEvents?.();
480
+ }, [
481
+ onClearEvents
482
+ ]);
483
+ const handlePageChange = useCallback3((_event, page) => {
484
+ setCurrentPage(page - 1);
485
+ }, []);
486
+ return {
487
+ allEventEntries,
488
+ visibleEvents,
489
+ effectiveCurrentPage: effectiveCurrentPage + 1,
490
+ totalPages,
491
+ handlePreviousPage,
492
+ handleNextPage,
493
+ handleClearEvents,
494
+ handlePageChange
495
+ };
496
+ }, "usePaginatedEventPairs");
156
497
 
157
498
  // src/components/broadcast/Drawer.tsx
158
- var BroadcastedRpcCallsDrawer = /* @__PURE__ */ __name(({ anchor = "right", drawerTitle, events, onClose, ...props }) => {
159
- const formattedEvents = useMemo(() => formatEvents(events), [
160
- events
161
- ]);
162
- return /* @__PURE__ */ React4.createElement(Drawer, {
499
+ var BroadcastedRpcCallsDrawer = /* @__PURE__ */ __name(({ anchor = "right", onClearEvents, drawerTitle, events, onClose, numberOfVisibleEvents = 25, ...props }) => {
500
+ const { allEventEntries, visibleEvents, totalPages, effectiveCurrentPage, handleClearEvents, handlePageChange } = usePaginatedEventPairs(events, numberOfVisibleEvents, onClearEvents);
501
+ return /* @__PURE__ */ React5.createElement(Drawer, {
163
502
  anchor,
164
503
  onClose,
504
+ keepMounted: false,
165
505
  ...props
166
- }, /* @__PURE__ */ React4.createElement(CloseDrawerIconButton, {
506
+ }, /* @__PURE__ */ React5.createElement(CloseDrawerIconButton, {
167
507
  anchor,
168
508
  onClose
169
- }), /* @__PURE__ */ React4.createElement(Stack3, {
509
+ }), /* @__PURE__ */ React5.createElement(Stack3, {
170
510
  gap: 2,
171
511
  sx: {
172
512
  p: 3
173
- }
174
- }, /* @__PURE__ */ React4.createElement(Typography3, {
513
+ },
514
+ flexShrink: 0
515
+ }, /* @__PURE__ */ React5.createElement(Stack3, {
516
+ direction: "row",
517
+ justifyContent: "space-between",
518
+ alignItems: "center",
519
+ gap: 4
520
+ }, /* @__PURE__ */ React5.createElement(Typography3, {
175
521
  variant: "h6"
176
- }, drawerTitle ?? "Broadcasted RPC Calls"), Object.entries(formattedEvents ?? {}).map(([id, broadcastedRpcCall]) => {
177
- return /* @__PURE__ */ React4.createElement(BroadcastedRpcCallDetails, {
522
+ }, drawerTitle ?? "Broadcasted RPC Calls"), /* @__PURE__ */ React5.createElement(Button, {
523
+ variant: "outlined",
524
+ size: "small",
525
+ onClick: handleClearEvents
526
+ }, "Clear All")), allEventEntries.length > 0 && /* @__PURE__ */ React5.createElement(Pagination, {
527
+ count: totalPages,
528
+ page: effectiveCurrentPage,
529
+ onChange: handlePageChange,
530
+ color: "primary"
531
+ })), /* @__PURE__ */ React5.createElement(Stack3, {
532
+ direction: "column",
533
+ id: "events-container",
534
+ flexGrow: 1,
535
+ sx: {
536
+ overflowY: "hidden"
537
+ }
538
+ }, /* @__PURE__ */ React5.createElement(Box, {
539
+ sx: {
540
+ overflowY: "auto",
541
+ px: 3,
542
+ pb: 3
543
+ }
544
+ }, visibleEvents.map(([id, broadcastedRpcCall], index) => {
545
+ return /* @__PURE__ */ React5.createElement(BroadcastedRpcCallDetailsCard, {
178
546
  key: id,
179
- rpcRequestResponsePairs: broadcastedRpcCall
547
+ rpcRequestResponsePairs: broadcastedRpcCall,
548
+ sx: {
549
+ mb: index < visibleEvents.length - 1 ? 2 : 0
550
+ }
180
551
  });
181
- })));
552
+ }))));
182
553
  }, "BroadcastedRpcCallsDrawer");
554
+ var BroadcastedRpcCallsDrawerWithEvents = /* @__PURE__ */ __name((props) => {
555
+ const { clearEvents, events } = useRpcBroadcastListener();
556
+ return /* @__PURE__ */ React5.createElement(BroadcastedRpcCallsDrawer, {
557
+ events,
558
+ onClearEvents: clearEvents,
559
+ ...props
560
+ });
561
+ }, "BroadcastedRpcCallsDrawerWithEvents");
183
562
 
184
563
  // src/components/menu/Avatar.tsx
185
- import { Avatar } from "@mui/material";
564
+ import { Avatar as Avatar2 } from "@mui/material";
186
565
  import React7 from "react";
187
566
 
188
- // src/context/network/context.ts
189
- import { createContextEx } from "@xylabs/react-shared";
190
- var ChainNetworkContext = createContextEx();
191
-
192
- // src/context/network/Provider.tsx
193
- import { ErrorRender } from "@xylabs/react-error";
194
- import { usePromise } from "@xylabs/react-promise";
195
- import { isDefined as isDefined4 } from "@xylabs/sdk-js";
196
- import { MainNetwork } from "@xyo-network/xl1-sdk";
197
- import React5, { useCallback as useCallback2, useMemo as useMemo2, useState as useState3 } from "react";
198
-
199
- // src/context/network/settings/defaultChainNetworkSettings.ts
200
- import { LocalNetwork } from "@xyo-network/xl1-sdk";
201
- var defaultChainNetworkSettings = {
202
- [LocalNetwork.id]: {
203
- proxy: true
204
- }
205
- };
206
-
207
- // src/context/network/settings/useChainNetworkSettings.ts
208
- import { useCallback, useState as useState2 } from "react";
209
- var useChainNetworkSettings = /* @__PURE__ */ __name((defaults = defaultChainNetworkSettings) => {
210
- const [networkSettings, setNetworkSettings] = useState2(defaults);
211
- const updateNetworkSettings = useCallback((networkId, settings) => {
212
- setNetworkSettings((prevSettings) => ({
213
- ...prevSettings,
214
- [networkId]: {
215
- ...prevSettings[networkId],
216
- ...settings
217
- }
218
- }));
219
- }, []);
220
- return {
221
- networkSettings,
222
- updateNetworkSettings
223
- };
224
- }, "useChainNetworkSettings");
225
-
226
- // src/context/network/Provider.tsx
227
- var ChainNetworkProvider = /* @__PURE__ */ __name(({ children, getActiveNetwork, networkSettings: networkSettingsProp = defaultChainNetworkSettings, networks, setActiveNetwork: setActiveNetworkExternal }) => {
228
- const [activeNetwork, setActiveNetwork] = useState3();
229
- const [error, setError] = useState3();
230
- const { networkSettings, updateNetworkSettings } = useChainNetworkSettings(networkSettingsProp);
231
- const [resolvedActiveNetwork, activeNetworkError] = usePromise(async () => {
232
- if (!networks) return;
233
- const activeNetwork2 = await getActiveNetwork?.();
234
- if (activeNetwork2 && networks?.find((network) => network.id === activeNetwork2.id)) {
235
- return activeNetwork2;
236
- } else {
237
- const defaultNetwork = networks.find((network) => network.id === MainNetwork.id) ?? networks[0];
238
- await setActiveNetworkExternal?.(defaultNetwork.id);
239
- return defaultNetwork;
240
- }
241
- }, [
242
- networks
243
- ]);
244
- const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState3(resolvedActiveNetwork);
245
- if (isDefined4(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {
246
- setActiveNetwork(resolvedActiveNetwork);
247
- setPreviousResolvedActiveNetwork(resolvedActiveNetwork);
248
- }
249
- const updateActiveNetwork = useCallback2((networkId) => {
250
- setError(void 0);
251
- const network = networks?.find((network2) => network2.id === networkId);
252
- if (!network) {
253
- setError(new Error(`Network with id ${networkId} not found`));
254
- return;
255
- }
256
- setActiveNetwork(network);
257
- void setActiveNetworkExternal?.(networkId);
258
- }, [
259
- networks,
260
- setActiveNetworkExternal
261
- ]);
262
- const value = useMemo2(() => ({
263
- activeNetwork,
264
- networks,
265
- provided: true,
266
- updateActiveNetwork,
267
- networkSettings,
268
- updateNetworkSettings,
269
- chainNetworkError: error ?? activeNetworkError
270
- }), [
271
- activeNetwork,
272
- activeNetworkError,
273
- error,
274
- networkSettings,
275
- networks,
276
- updateActiveNetwork,
277
- updateNetworkSettings
278
- ]);
279
- return /* @__PURE__ */ React5.createElement(ChainNetworkContext, {
280
- value
281
- }, /* @__PURE__ */ React5.createElement(ErrorRender, {
282
- error: error ?? activeNetworkError,
283
- scope: "ChainNetworkProvider"
284
- }), children);
285
- }, "ChainNetworkProvider");
286
-
287
- // src/context/network/use.ts
288
- import { useContextEx } from "@xylabs/react-shared";
289
- var useChainNetwork = /* @__PURE__ */ __name((required = true) => useContextEx(ChainNetworkContext, "ChainNetwork", required), "useChainNetwork");
290
-
291
567
  // src/components/menu/Icon.tsx
292
568
  import React6 from "react";
293
569
  var NetworkIcon = /* @__PURE__ */ __name(({ icon, style, ...props }) => {
@@ -308,7 +584,7 @@ var NetworkIcon = /* @__PURE__ */ __name(({ icon, style, ...props }) => {
308
584
 
309
585
  // src/components/menu/Avatar.tsx
310
586
  var NetworkAvatar = /* @__PURE__ */ __name(({ icon, iconStyles, name, sx, ...props }) => {
311
- return /* @__PURE__ */ React7.createElement(Avatar, {
587
+ return /* @__PURE__ */ React7.createElement(Avatar2, {
312
588
  sx: {
313
589
  backgroundColor: "white",
314
590
  ...sx
@@ -361,11 +637,11 @@ var NetworkMenuItem = /* @__PURE__ */ __name(({ active, network, onClick, update
361
637
  }, "NetworkMenuItem");
362
638
 
363
639
  // src/components/status/Alert.tsx
364
- import { Alert, AlertTitle, Button as Button2 } from "@mui/material";
365
- import React10, { useMemo as useMemo3, useState as useState4 } from "react";
640
+ import { Alert, AlertTitle, Button as Button3 } from "@mui/material";
641
+ import React10, { useMemo as useMemo3, useState as useState7 } from "react";
366
642
 
367
643
  // src/components/status/Dialog.tsx
368
- import { Button, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography as Typography4 } from "@mui/material";
644
+ import { Button as Button2, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography as Typography4 } from "@mui/material";
369
645
  import React9 from "react";
370
646
  var NetworkStatusDialog = /* @__PURE__ */ __name(({ updates, ...props }) => {
371
647
  return /* @__PURE__ */ React9.createElement(Dialog, props, /* @__PURE__ */ React9.createElement(DialogTitle, null, "Recent Status Updates"), /* @__PURE__ */ React9.createElement(DialogContent, null, /* @__PURE__ */ React9.createElement(List, null, updates.map(({ start, end, update }) => /* @__PURE__ */ React9.createElement(ListItem, {
@@ -381,7 +657,7 @@ var NetworkStatusDialog = /* @__PURE__ */ __name(({ updates, ...props }) => {
381
657
  opacity: 0.75,
382
658
  fontSize: ".8333rem"
383
659
  }
384
- }, "Start:", " ", new Date(start).toLocaleString(), " ", /* @__PURE__ */ React9.createElement("br", null), "End:", " ", new Date(end).toLocaleString()))))), /* @__PURE__ */ React9.createElement(DialogActions, null, /* @__PURE__ */ React9.createElement(Button, {
660
+ }, "Start:", " ", new Date(start).toLocaleString(), " ", /* @__PURE__ */ React9.createElement("br", null), "End:", " ", new Date(end).toLocaleString()))))), /* @__PURE__ */ React9.createElement(DialogActions, null, /* @__PURE__ */ React9.createElement(Button2, {
385
661
  onClick: /* @__PURE__ */ __name((e) => props.onClose?.(e, "backdropClick"), "onClick"),
386
662
  color: "primary",
387
663
  variant: "outlined"
@@ -390,7 +666,7 @@ var NetworkStatusDialog = /* @__PURE__ */ __name(({ updates, ...props }) => {
390
666
 
391
667
  // src/components/status/Alert.tsx
392
668
  var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
393
- const [open, setOpen] = useState4(false);
669
+ const [open, setOpen] = useState7(false);
394
670
  const handleClose = /* @__PURE__ */ __name(() => setOpen(false), "handleClose");
395
671
  const severity = useMemo3(() => {
396
672
  if (!status) return;
@@ -414,7 +690,7 @@ var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
414
690
  return /* @__PURE__ */ React10.createElement(Alert, {
415
691
  severity,
416
692
  ...props
417
- }, /* @__PURE__ */ React10.createElement(AlertTitle, null, status?.description), status?.updates && status.updates.length > 0 ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Button2, {
693
+ }, /* @__PURE__ */ React10.createElement(AlertTitle, null, status?.description), status?.updates && status.updates.length > 0 ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Button3, {
418
694
  color: severity,
419
695
  variant: "outlined",
420
696
  size: "small",
@@ -428,151 +704,6 @@ var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
428
704
 
429
705
  // src/components/status/NetworkStatus.tsx
430
706
  import React11 from "react";
431
-
432
- // src/hooks/provider/useActiveNetworkCurrentBlock.ts
433
- import { useCurrentBlock, useViewerFromWallet as useViewerFromWallet2 } from "@xyo-network/react-chain-provider";
434
-
435
- // src/hooks/provider/useViewerInPage.ts
436
- import { isDefined as isDefined5, isNull, isUndefined } from "@xylabs/sdk-js";
437
- import { useHttpRpcViewer, useViewerFromWallet } from "@xyo-network/react-chain-provider";
438
- var shouldProxy = /* @__PURE__ */ __name((networkSettings, networkBootstrap) => {
439
- return isDefined5(networkBootstrap) && isDefined5(networkSettings[networkBootstrap.id]) && networkSettings[networkBootstrap.id].proxy;
440
- }, "shouldProxy");
441
- var useViewerInPage = /* @__PURE__ */ __name((networkOverride) => {
442
- let networkBootstrap;
443
- const { activeNetwork, networkSettings } = useChainNetwork();
444
- networkBootstrap = isDefined5(networkOverride) ? networkOverride : activeNetwork;
445
- const httpRpcViewer = useHttpRpcViewer(networkBootstrap?.url);
446
- const [walletRpcViewer] = useViewerFromWallet(networkBootstrap?.id);
447
- if (isUndefined(walletRpcViewer)) return;
448
- if (shouldProxy(networkSettings, networkBootstrap)) {
449
- if (isNull(walletRpcViewer)) {
450
- console.warn(`Network ${networkBootstrap?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`);
451
- return httpRpcViewer;
452
- }
453
- return walletRpcViewer;
454
- }
455
- return httpRpcViewer;
456
- }, "useViewerInPage");
457
-
458
- // src/hooks/provider/useActiveNetworkCurrentBlock.ts
459
- var useActiveNetworkCurrentBlock = /* @__PURE__ */ __name((refresh = 1, viewer) => {
460
- const currentBlock = useCurrentBlock(refresh, viewer);
461
- return currentBlock;
462
- }, "useActiveNetworkCurrentBlock");
463
- var useActiveNetworkCurrentBlockInPage = /* @__PURE__ */ __name((refresh = 1) => {
464
- const viewer = useViewerInPage();
465
- const currentBlock = useCurrentBlock(refresh, viewer);
466
- return currentBlock;
467
- }, "useActiveNetworkCurrentBlockInPage");
468
- var useActiveNetworkCurrentBlockInWallet = /* @__PURE__ */ __name((refresh = 1) => {
469
- const [viewer] = useViewerFromWallet2();
470
- const currentBlock = useCurrentBlock(refresh, viewer);
471
- return currentBlock;
472
- }, "useActiveNetworkCurrentBlockInWallet");
473
-
474
- // src/hooks/provider/useActiveNetworkNetwork.ts
475
- import { useNetwork } from "@xyo-network/react-chain-provider";
476
- var useActiveNetworkNetwork = /* @__PURE__ */ __name(() => {
477
- const { activeNetwork } = useChainNetwork();
478
- const network = useNetwork(activeNetwork?.id);
479
- return network;
480
- }, "useActiveNetworkNetwork");
481
-
482
- // src/hooks/provider/useActiveNetworkRunner.ts
483
- import { useHttpRpcRunner } from "@xyo-network/react-chain-provider";
484
- var useActiveNetworkRunner = /* @__PURE__ */ __name(() => {
485
- const { activeNetwork } = useChainNetwork();
486
- const runner = useHttpRpcRunner(activeNetwork?.url);
487
- return runner;
488
- }, "useActiveNetworkRunner");
489
-
490
- // src/hooks/provider/useRpcBroadcastListener.ts
491
- import { isString } from "@xylabs/sdk-js";
492
- import { useEffect, useState as useState5 } from "react";
493
- var useRpcBroadcastListener = /* @__PURE__ */ __name(() => {
494
- const [events, setEvents] = useState5([]);
495
- useEffect(() => {
496
- const listener = /* @__PURE__ */ __name((e) => {
497
- if ("detail" in e) {
498
- const { detail } = e ?? {};
499
- if (isString(detail)) {
500
- try {
501
- const parsedDetail = JSON.parse(detail);
502
- const { data: rpcCall, source } = parsedDetail;
503
- const broadcastedRpcCall = {
504
- rpcCall,
505
- source,
506
- timestamp: e.timeStamp
507
- };
508
- setEvents((prev) => [
509
- broadcastedRpcCall,
510
- ...prev
511
- ]);
512
- } catch (err) {
513
- console.error(err);
514
- }
515
- }
516
- }
517
- }, "listener");
518
- globalThis.addEventListener("xyo:broadcast-rpc-request", listener);
519
- globalThis.addEventListener("xyo:broadcast-rpc-response", listener);
520
- return () => {
521
- globalThis.removeEventListener("xyo:broadcast-rpc-request", listener);
522
- globalThis.removeEventListener("xyo:broadcast-rpc-response", listener);
523
- };
524
- }, []);
525
- return {
526
- events
527
- };
528
- }, "useRpcBroadcastListener");
529
-
530
- // src/hooks/provider/useViewerInWallet.ts
531
- import { useHttpRpcViewer as useHttpRpcViewer2 } from "@xyo-network/react-chain-provider";
532
- var useViewerInWallet = /* @__PURE__ */ __name(() => {
533
- const { activeNetwork } = useChainNetwork();
534
- const walletViewer = useHttpRpcViewer2(activeNetwork?.url);
535
- return walletViewer;
536
- }, "useViewerInWallet");
537
-
538
- // src/hooks/status/usePollNetworkStatus.ts
539
- import { delay, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
540
- import { useEffect as useEffect2, useState as useState6 } from "react";
541
- var STATUS_CHECK_INTERVAL = 1e4;
542
- var usePollNetworkStatus = /* @__PURE__ */ __name(() => {
543
- const network = useActiveNetworkNetwork();
544
- const [networkStatus, setNetworkStatus] = useState6();
545
- const [networkStatusError, setNetworkStatusError] = useState6();
546
- useEffect2(() => {
547
- let checkNetwork = true;
548
- void (async () => {
549
- if (isUndefined2(network)) return;
550
- while (checkNetwork) {
551
- try {
552
- const response = await network.status();
553
- setNetworkStatus(response);
554
- setNetworkStatusError(void 0);
555
- } catch (error) {
556
- console.error("Error fetching network status:", error);
557
- setNetworkStatus(void 0);
558
- setNetworkStatusError(error);
559
- }
560
- await delay(STATUS_CHECK_INTERVAL);
561
- }
562
- })();
563
- return () => {
564
- checkNetwork = false;
565
- };
566
- }, [
567
- network
568
- ]);
569
- return [
570
- networkStatus,
571
- networkStatusError
572
- ];
573
- }, "usePollNetworkStatus");
574
-
575
- // src/components/status/NetworkStatus.tsx
576
707
  var validNetworkStates = /* @__PURE__ */ new Set([
577
708
  "online",
578
709
  "unknown"
@@ -598,6 +729,7 @@ export {
598
729
  BroadcastRpcRequestEventName,
599
730
  BroadcastRpcResponseEventName,
600
731
  BroadcastedRpcCallsDrawer,
732
+ BroadcastedRpcCallsDrawerWithEvents,
601
733
  ChainNetworkContext,
602
734
  ChainNetworkProvider,
603
735
  NetworkAvatar,