@xyo-network/react-chain-network 1.19.6 → 1.19.7

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 (82) hide show
  1. package/dist/browser/components/broadcast/CloseDrawerIconButton.d.ts +8 -0
  2. package/dist/browser/components/broadcast/CloseDrawerIconButton.d.ts.map +1 -0
  3. package/dist/browser/components/broadcast/Drawer.d.ts +9 -0
  4. package/dist/browser/components/broadcast/Drawer.d.ts.map +1 -0
  5. package/dist/browser/components/broadcast/details/Card.d.ts +7 -0
  6. package/dist/browser/components/broadcast/details/Card.d.ts.map +1 -0
  7. package/dist/browser/components/broadcast/details/SummaryStack.d.ts +11 -0
  8. package/dist/browser/components/broadcast/details/SummaryStack.d.ts.map +1 -0
  9. package/dist/browser/components/broadcast/details/index.d.ts +3 -0
  10. package/dist/browser/components/broadcast/details/index.d.ts.map +1 -0
  11. package/dist/browser/components/broadcast/helpers/formatEvents.d.ts +7 -0
  12. package/dist/browser/components/broadcast/helpers/formatEvents.d.ts.map +1 -0
  13. package/dist/browser/components/broadcast/helpers/index.d.ts +2 -0
  14. package/dist/browser/components/broadcast/helpers/index.d.ts.map +1 -0
  15. package/dist/browser/components/broadcast/index.d.ts +2 -0
  16. package/dist/browser/components/broadcast/index.d.ts.map +1 -0
  17. package/dist/browser/components/index.d.ts +1 -0
  18. package/dist/browser/components/index.d.ts.map +1 -1
  19. package/dist/browser/context/network/Provider.d.ts +2 -0
  20. package/dist/browser/context/network/Provider.d.ts.map +1 -1
  21. package/dist/browser/context/network/context.d.ts +6 -0
  22. package/dist/browser/context/network/context.d.ts.map +1 -1
  23. package/dist/browser/context/network/index.d.ts +1 -0
  24. package/dist/browser/context/network/index.d.ts.map +1 -1
  25. package/dist/browser/context/network/settings/defaultChainNetworkSettings.d.ts +3 -0
  26. package/dist/browser/context/network/settings/defaultChainNetworkSettings.d.ts.map +1 -0
  27. package/dist/browser/context/network/settings/index.d.ts +4 -0
  28. package/dist/browser/context/network/settings/index.d.ts.map +1 -0
  29. package/dist/browser/context/network/settings/types.d.ts +6 -0
  30. package/dist/browser/context/network/settings/types.d.ts.map +1 -0
  31. package/dist/browser/context/network/settings/useChainNetworkSettings.d.ts +7 -0
  32. package/dist/browser/context/network/settings/useChainNetworkSettings.d.ts.map +1 -0
  33. package/dist/browser/context/network/state.d.ts +3 -0
  34. package/dist/browser/context/network/state.d.ts.map +1 -1
  35. package/dist/browser/context/network/use.d.ts +2 -0
  36. package/dist/browser/context/network/use.d.ts.map +1 -1
  37. package/dist/browser/hooks/provider/UseViewerInPage.stories.d.ts +2 -4
  38. package/dist/browser/hooks/provider/UseViewerInPage.stories.d.ts.map +1 -1
  39. package/dist/browser/hooks/provider/index.d.ts +1 -0
  40. package/dist/browser/hooks/provider/index.d.ts.map +1 -1
  41. package/dist/browser/hooks/provider/useActiveNetworkCurrentBlock.d.ts +36 -24
  42. package/dist/browser/hooks/provider/useActiveNetworkCurrentBlock.d.ts.map +1 -1
  43. package/dist/browser/hooks/provider/useActiveNetworkRunner.d.ts +1 -1
  44. package/dist/browser/hooks/provider/useActiveNetworkRunner.d.ts.map +1 -1
  45. package/dist/browser/hooks/provider/useRpcBroadcastListener.d.ts +5 -0
  46. package/dist/browser/hooks/provider/useRpcBroadcastListener.d.ts.map +1 -0
  47. package/dist/browser/hooks/provider/useViewerInPage.d.ts +2 -2
  48. package/dist/browser/hooks/provider/useViewerInPage.d.ts.map +1 -1
  49. package/dist/browser/hooks/provider/useViewerInWallet.d.ts +1 -1
  50. package/dist/browser/hooks/provider/useViewerInWallet.d.ts.map +1 -1
  51. package/dist/browser/index.d.ts +1 -0
  52. package/dist/browser/index.d.ts.map +1 -1
  53. package/dist/browser/index.mjs +318 -43
  54. package/dist/browser/index.mjs.map +1 -1
  55. package/dist/browser/model/BroadcastRpc.d.ts +20 -0
  56. package/dist/browser/model/BroadcastRpc.d.ts.map +1 -0
  57. package/dist/browser/model/index.d.ts +2 -0
  58. package/dist/browser/model/index.d.ts.map +1 -0
  59. package/package.json +13 -11
  60. package/src/components/broadcast/CloseDrawerIconButton.tsx +23 -0
  61. package/src/components/broadcast/Drawer.tsx +33 -0
  62. package/src/components/broadcast/details/Card.tsx +54 -0
  63. package/src/components/broadcast/details/SummaryStack.tsx +34 -0
  64. package/src/components/broadcast/details/index.ts +2 -0
  65. package/src/components/broadcast/helpers/formatEvents.ts +40 -0
  66. package/src/components/broadcast/helpers/index.ts +1 -0
  67. package/src/components/broadcast/index.ts +1 -0
  68. package/src/components/index.ts +1 -0
  69. package/src/context/network/Provider.tsx +8 -2
  70. package/src/context/network/index.ts +1 -0
  71. package/src/context/network/settings/defaultChainNetworkSettings.ts +5 -0
  72. package/src/context/network/settings/index.ts +3 -0
  73. package/src/context/network/settings/types.ts +7 -0
  74. package/src/context/network/settings/useChainNetworkSettings.ts +27 -0
  75. package/src/context/network/state.ts +4 -0
  76. package/src/hooks/provider/UseViewerInPage.stories.tsx +69 -14
  77. package/src/hooks/provider/index.ts +1 -0
  78. package/src/hooks/provider/useRpcBroadcastListener.ts +40 -0
  79. package/src/hooks/provider/useViewerInPage.ts +19 -6
  80. package/src/index.ts +1 -0
  81. package/src/model/BroadcastRpc.ts +24 -0
  82. package/src/model/index.ts +1 -0
@@ -1,9 +1,189 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
+ // src/components/broadcast/Drawer.tsx
5
+ import { Drawer, Stack as Stack3, Typography as Typography3 } from "@mui/material";
6
+ import React4, { useMemo } from "react";
7
+
8
+ // src/components/broadcast/CloseDrawerIconButton.tsx
9
+ import { Cancel } from "@mui/icons-material";
10
+ import { IconButton } from "@mui/material";
11
+ import React from "react";
12
+ var CloseDrawerIconButton = /* @__PURE__ */ __name(({ anchor, onClose }) => {
13
+ return /* @__PURE__ */ React.createElement(IconButton, {
14
+ onClick: /* @__PURE__ */ __name((e) => onClose?.(e, "backdropClick"), "onClick"),
15
+ size: "small",
16
+ sx: {
17
+ alignSelf: anchor === "right" ? "start" : "end",
18
+ top: 8,
19
+ right: anchor === "right" ? void 0 : 8,
20
+ left: anchor === "left" ? void 0 : 8
21
+ }
22
+ }, /* @__PURE__ */ React.createElement(Cancel, {
23
+ fontSize: "small"
24
+ }));
25
+ }, "CloseDrawerIconButton");
26
+
27
+ // src/components/broadcast/details/Card.tsx
28
+ import { Card, Collapse, Stack as Stack2, Typography as Typography2 } from "@mui/material";
29
+ import { isDefined as isDefined2 } from "@xylabs/sdk-js";
30
+ import { JsonViewerEx } from "@xyo-network/react-payload-raw-info";
31
+ import React3, { useState } from "react";
32
+
33
+ // src/components/broadcast/details/SummaryStack.tsx
34
+ 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, {
40
+ direction: "row",
41
+ gap: 2,
42
+ alignItems: "center",
43
+ justifyContent: "space-between",
44
+ ...props
45
+ }, /* @__PURE__ */ React2.createElement(Stack, {
46
+ direction: "row",
47
+ gap: 2,
48
+ alignItems: "center"
49
+ }, /* @__PURE__ */ React2.createElement(IconButton2, {
50
+ size: "small",
51
+ onClick: /* @__PURE__ */ __name(() => setExpanded?.(!expanded), "onClick")
52
+ }, /* @__PURE__ */ React2.createElement(ArrowRight, {
53
+ fontSize: "small"
54
+ })), /* @__PURE__ */ React2.createElement(Typography, {
55
+ component: "span",
56
+ variant: "body2",
57
+ fontFamily: "monospace"
58
+ }, method), /* @__PURE__ */ React2.createElement(Typography, {
59
+ component: "span",
60
+ variant: "caption",
61
+ color: "text.secondary",
62
+ sx: {
63
+ opacity: 0.6
64
+ }
65
+ }, isDefined(timestamp) ? new Date(timestamp).toLocaleString() : "")), /* @__PURE__ */ React2.createElement(Icon, {
66
+ sx: {
67
+ justifySelf: "end"
68
+ }
69
+ }, hasResult ? /* @__PURE__ */ React2.createElement(CheckCircle, {
70
+ color: "success"
71
+ }) : /* @__PURE__ */ React2.createElement(Warning, {
72
+ color: "warning"
73
+ })));
74
+ }, "BroadcastedRpcCallDetailsSummaryStack");
75
+
76
+ // src/components/broadcast/details/Card.tsx
77
+ var BroadcastedRpcCallDetails = /* @__PURE__ */ __name(({ rpcRequestResponsePairs }) => {
78
+ const [expanded, setExpanded] = useState(false);
79
+ if (!rpcRequestResponsePairs) return null;
80
+ const { request, result, source } = rpcRequestResponsePairs;
81
+ return /* @__PURE__ */ React3.createElement(Card, {
82
+ sx: {
83
+ p: 1
84
+ }
85
+ }, /* @__PURE__ */ React3.createElement(BroadcastedRpcCallDetailsSummaryStack, {
86
+ expanded,
87
+ hasResult: isDefined2(result),
88
+ method: request.rpcCall.method,
89
+ setExpanded,
90
+ timestamp: request.timestamp
91
+ }), /* @__PURE__ */ React3.createElement(Collapse, {
92
+ in: expanded
93
+ }, /* @__PURE__ */ React3.createElement(Stack2, {
94
+ direction: "column",
95
+ p: 1,
96
+ gap: 2,
97
+ width: 600
98
+ }, /* @__PURE__ */ React3.createElement(Typography2, {
99
+ variant: "body2"
100
+ }, "Source:", /* @__PURE__ */ React3.createElement(Typography2, {
101
+ variant: "caption",
102
+ component: "span",
103
+ fontFamily: "monospace",
104
+ sx: {
105
+ ml: 1
106
+ }
107
+ }, source)), /* @__PURE__ */ React3.createElement(Typography2, {
108
+ variant: "body2"
109
+ }, "Request:"), /* @__PURE__ */ React3.createElement(JsonViewerEx, {
110
+ value: request,
111
+ sx: {
112
+ maxHeight: 300,
113
+ overflow: "auto"
114
+ }
115
+ }), isDefined2(result) ? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(Typography2, {
116
+ variant: "body2"
117
+ }, "Result:"), /* @__PURE__ */ React3.createElement(JsonViewerEx, {
118
+ value: result,
119
+ sx: {
120
+ maxHeight: 300,
121
+ overflow: "auto"
122
+ }
123
+ })) : null)));
124
+ }, "BroadcastedRpcCallDetails");
125
+
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");
156
+
157
+ // 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, {
163
+ anchor,
164
+ onClose,
165
+ ...props
166
+ }, /* @__PURE__ */ React4.createElement(CloseDrawerIconButton, {
167
+ anchor,
168
+ onClose
169
+ }), /* @__PURE__ */ React4.createElement(Stack3, {
170
+ gap: 2,
171
+ sx: {
172
+ p: 3
173
+ }
174
+ }, /* @__PURE__ */ React4.createElement(Typography3, {
175
+ variant: "h6"
176
+ }, drawerTitle ?? "Broadcasted RPC Calls"), Object.entries(formattedEvents ?? {}).map(([id, broadcastedRpcCall]) => {
177
+ return /* @__PURE__ */ React4.createElement(BroadcastedRpcCallDetails, {
178
+ key: id,
179
+ rpcRequestResponsePairs: broadcastedRpcCall
180
+ });
181
+ })));
182
+ }, "BroadcastedRpcCallsDrawer");
183
+
4
184
  // src/components/menu/Avatar.tsx
5
185
  import { Avatar } from "@mui/material";
6
- import React3 from "react";
186
+ import React7 from "react";
7
187
 
8
188
  // src/context/network/context.ts
9
189
  import { createContextEx } from "@xylabs/react-shared";
@@ -12,12 +192,42 @@ var ChainNetworkContext = createContextEx();
12
192
  // src/context/network/Provider.tsx
13
193
  import { ErrorRender } from "@xylabs/react-error";
14
194
  import { usePromise } from "@xylabs/react-promise";
15
- import { isDefined } from "@xylabs/sdk-js";
195
+ import { isDefined as isDefined4 } from "@xylabs/sdk-js";
16
196
  import { MainNetwork } from "@xyo-network/xl1-sdk";
17
- import React, { useCallback, useMemo, useState } from "react";
18
- var ChainNetworkProvider = /* @__PURE__ */ __name(({ children, getActiveNetwork, networks, setActiveNetwork: setActiveNetworkExternal }) => {
19
- const [activeNetwork, setActiveNetwork] = useState();
20
- const [error, setError] = useState();
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);
21
231
  const [resolvedActiveNetwork, activeNetworkError] = usePromise(async () => {
22
232
  if (!networks) return;
23
233
  const activeNetwork2 = await getActiveNetwork?.();
@@ -31,12 +241,12 @@ var ChainNetworkProvider = /* @__PURE__ */ __name(({ children, getActiveNetwork,
31
241
  }, [
32
242
  networks
33
243
  ]);
34
- const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState(resolvedActiveNetwork);
35
- if (isDefined(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {
244
+ const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState3(resolvedActiveNetwork);
245
+ if (isDefined4(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {
36
246
  setActiveNetwork(resolvedActiveNetwork);
37
247
  setPreviousResolvedActiveNetwork(resolvedActiveNetwork);
38
248
  }
39
- const updateActiveNetwork = useCallback((networkId) => {
249
+ const updateActiveNetwork = useCallback2((networkId) => {
40
250
  setError(void 0);
41
251
  const network = networks?.find((network2) => network2.id === networkId);
42
252
  if (!network) {
@@ -49,22 +259,26 @@ var ChainNetworkProvider = /* @__PURE__ */ __name(({ children, getActiveNetwork,
49
259
  networks,
50
260
  setActiveNetworkExternal
51
261
  ]);
52
- const value = useMemo(() => ({
262
+ const value = useMemo2(() => ({
53
263
  activeNetwork,
54
264
  networks,
55
265
  provided: true,
56
266
  updateActiveNetwork,
267
+ networkSettings,
268
+ updateNetworkSettings,
57
269
  chainNetworkError: error ?? activeNetworkError
58
270
  }), [
59
271
  activeNetwork,
60
272
  activeNetworkError,
61
273
  error,
274
+ networkSettings,
62
275
  networks,
63
- updateActiveNetwork
276
+ updateActiveNetwork,
277
+ updateNetworkSettings
64
278
  ]);
65
- return /* @__PURE__ */ React.createElement(ChainNetworkContext, {
279
+ return /* @__PURE__ */ React5.createElement(ChainNetworkContext, {
66
280
  value
67
- }, /* @__PURE__ */ React.createElement(ErrorRender, {
281
+ }, /* @__PURE__ */ React5.createElement(ErrorRender, {
68
282
  error: error ?? activeNetworkError,
69
283
  scope: "ChainNetworkProvider"
70
284
  }), children);
@@ -75,9 +289,9 @@ import { useContextEx } from "@xylabs/react-shared";
75
289
  var useChainNetwork = /* @__PURE__ */ __name((required = true) => useContextEx(ChainNetworkContext, "ChainNetwork", required), "useChainNetwork");
76
290
 
77
291
  // src/components/menu/Icon.tsx
78
- import React2 from "react";
292
+ import React6 from "react";
79
293
  var NetworkIcon = /* @__PURE__ */ __name(({ icon, style, ...props }) => {
80
- return /* @__PURE__ */ React2.createElement("span", {
294
+ return /* @__PURE__ */ React6.createElement("span", {
81
295
  // eslint-disable-next-line react-dom/no-dangerously-set-innerhtml
82
296
  dangerouslySetInnerHTML: {
83
297
  __html: icon ?? ""
@@ -94,14 +308,14 @@ var NetworkIcon = /* @__PURE__ */ __name(({ icon, style, ...props }) => {
94
308
 
95
309
  // src/components/menu/Avatar.tsx
96
310
  var NetworkAvatar = /* @__PURE__ */ __name(({ icon, iconStyles, name, sx, ...props }) => {
97
- return /* @__PURE__ */ React3.createElement(Avatar, {
311
+ return /* @__PURE__ */ React7.createElement(Avatar, {
98
312
  sx: {
99
313
  backgroundColor: "white",
100
314
  ...sx
101
315
  },
102
316
  alt: name,
103
317
  ...props
104
- }, /* @__PURE__ */ React3.createElement(NetworkIcon, {
318
+ }, /* @__PURE__ */ React7.createElement(NetworkIcon, {
105
319
  icon,
106
320
  style: {
107
321
  ...iconStyles
@@ -110,7 +324,7 @@ var NetworkAvatar = /* @__PURE__ */ __name(({ icon, iconStyles, name, sx, ...pro
110
324
  }, "NetworkAvatar");
111
325
  var ActiveNetworkAvatar = /* @__PURE__ */ __name((props) => {
112
326
  const { activeNetwork } = useChainNetwork();
113
- return /* @__PURE__ */ React3.createElement(NetworkAvatar, {
327
+ return /* @__PURE__ */ React7.createElement(NetworkAvatar, {
114
328
  icon: activeNetwork?.icon,
115
329
  name: activeNetwork?.name,
116
330
  ...props
@@ -120,14 +334,14 @@ var ActiveNetworkAvatar = /* @__PURE__ */ __name((props) => {
120
334
  // src/components/menu/MenuItem.tsx
121
335
  import { ListItemText } from "@mui/material";
122
336
  import { ActiveMenuItem } from "@xyo-network/react-chain-shared";
123
- import React4 from "react";
337
+ import React8 from "react";
124
338
  var NetworkMenuItem = /* @__PURE__ */ __name(({ active, network, onClick, updateActiveNetwork, ...props }) => {
125
339
  const handleClick = /* @__PURE__ */ __name((event) => {
126
340
  if (network === void 0) throw new Error("Network is undefined");
127
341
  updateActiveNetwork?.(network.id);
128
342
  onClick?.(event);
129
343
  }, "handleClick");
130
- return /* @__PURE__ */ React4.createElement(ActiveMenuItem, {
344
+ return /* @__PURE__ */ React8.createElement(ActiveMenuItem, {
131
345
  title: network?.name,
132
346
  disableRipple: true,
133
347
  onClick: handleClick,
@@ -136,38 +350,38 @@ var NetworkMenuItem = /* @__PURE__ */ __name(({ active, network, onClick, update
136
350
  py: 1
137
351
  },
138
352
  ...props
139
- }, /* @__PURE__ */ React4.createElement(NetworkAvatar, {
353
+ }, /* @__PURE__ */ React8.createElement(NetworkAvatar, {
140
354
  icon: network?.icon,
141
355
  name: network?.name,
142
356
  sx: {
143
357
  width: 30,
144
358
  height: 30
145
359
  }
146
- }), /* @__PURE__ */ React4.createElement(ListItemText, null, network?.name));
360
+ }), /* @__PURE__ */ React8.createElement(ListItemText, null, network?.name));
147
361
  }, "NetworkMenuItem");
148
362
 
149
363
  // src/components/status/Alert.tsx
150
364
  import { Alert, AlertTitle, Button as Button2 } from "@mui/material";
151
- import React6, { useMemo as useMemo2, useState as useState2 } from "react";
365
+ import React10, { useMemo as useMemo3, useState as useState4 } from "react";
152
366
 
153
367
  // src/components/status/Dialog.tsx
154
- import { Button, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography } from "@mui/material";
155
- import React5 from "react";
368
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, List, ListItem, Typography as Typography4 } from "@mui/material";
369
+ import React9 from "react";
156
370
  var NetworkStatusDialog = /* @__PURE__ */ __name(({ updates, ...props }) => {
157
- return /* @__PURE__ */ React5.createElement(Dialog, props, /* @__PURE__ */ React5.createElement(DialogTitle, null, "Recent Status Updates"), /* @__PURE__ */ React5.createElement(DialogContent, null, /* @__PURE__ */ React5.createElement(List, null, updates.map(({ start, end, update }) => /* @__PURE__ */ React5.createElement(ListItem, {
371
+ 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, {
158
372
  key: start + update,
159
373
  sx: {
160
374
  flexDirection: "column",
161
375
  alignItems: "start",
162
376
  pl: 0
163
377
  }
164
- }, /* @__PURE__ */ React5.createElement(Typography, null, update), /* @__PURE__ */ React5.createElement(Typography, {
378
+ }, /* @__PURE__ */ React9.createElement(Typography4, null, update), /* @__PURE__ */ React9.createElement(Typography4, {
165
379
  gutterBottom: true,
166
380
  sx: {
167
381
  opacity: 0.75,
168
382
  fontSize: ".8333rem"
169
383
  }
170
- }, "Start:", " ", new Date(start).toLocaleString(), " ", /* @__PURE__ */ React5.createElement("br", null), "End:", " ", new Date(end).toLocaleString()))))), /* @__PURE__ */ React5.createElement(DialogActions, null, /* @__PURE__ */ React5.createElement(Button, {
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, {
171
385
  onClick: /* @__PURE__ */ __name((e) => props.onClose?.(e, "backdropClick"), "onClick"),
172
386
  color: "primary",
173
387
  variant: "outlined"
@@ -176,9 +390,9 @@ var NetworkStatusDialog = /* @__PURE__ */ __name(({ updates, ...props }) => {
176
390
 
177
391
  // src/components/status/Alert.tsx
178
392
  var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
179
- const [open, setOpen] = useState2(false);
393
+ const [open, setOpen] = useState4(false);
180
394
  const handleClose = /* @__PURE__ */ __name(() => setOpen(false), "handleClose");
181
- const severity = useMemo2(() => {
395
+ const severity = useMemo3(() => {
182
396
  if (!status) return;
183
397
  switch (status.state) {
184
398
  case "online": {
@@ -197,15 +411,15 @@ var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
197
411
  }, [
198
412
  status
199
413
  ]);
200
- return /* @__PURE__ */ React6.createElement(Alert, {
414
+ return /* @__PURE__ */ React10.createElement(Alert, {
201
415
  severity,
202
416
  ...props
203
- }, /* @__PURE__ */ React6.createElement(AlertTitle, null, status?.description), status?.updates && status.updates.length > 0 ? /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(Button2, {
417
+ }, /* @__PURE__ */ React10.createElement(AlertTitle, null, status?.description), status?.updates && status.updates.length > 0 ? /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Button2, {
204
418
  color: severity,
205
419
  variant: "outlined",
206
420
  size: "small",
207
421
  onClick: /* @__PURE__ */ __name(() => setOpen(true), "onClick")
208
- }, "Updates"), /* @__PURE__ */ React6.createElement(NetworkStatusDialog, {
422
+ }, "Updates"), /* @__PURE__ */ React10.createElement(NetworkStatusDialog, {
209
423
  open,
210
424
  onClose: handleClose,
211
425
  updates: status.updates
@@ -213,22 +427,28 @@ var NetworkStatusAlert = /* @__PURE__ */ __name(({ status, ...props }) => {
213
427
  }, "NetworkStatusAlert");
214
428
 
215
429
  // src/components/status/NetworkStatus.tsx
216
- import React7 from "react";
430
+ import React11 from "react";
217
431
 
218
432
  // src/hooks/provider/useActiveNetworkCurrentBlock.ts
219
433
  import { useCurrentBlock, useViewerFromWallet as useViewerFromWallet2 } from "@xyo-network/react-chain-provider";
220
434
 
221
435
  // src/hooks/provider/useViewerInPage.ts
222
- import { isDefined as isDefined2, isDefinedNotNull, isUndefined } from "@xylabs/sdk-js";
436
+ import { isDefined as isDefined5, isUndefined } from "@xylabs/sdk-js";
223
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");
224
441
  var useViewerInPage = /* @__PURE__ */ __name((networkOverride) => {
225
442
  let networkBootstrap;
226
- const { activeNetwork } = useChainNetwork();
227
- networkBootstrap = isDefined2(networkOverride) ? networkOverride : activeNetwork;
443
+ const { activeNetwork, networkSettings } = useChainNetwork();
444
+ networkBootstrap = isDefined5(networkOverride) ? networkOverride : activeNetwork;
228
445
  const httpRpcViewer = useHttpRpcViewer(networkBootstrap?.url);
229
446
  const [walletRpcViewer] = useViewerFromWallet(networkBootstrap?.id);
230
447
  if (isUndefined(walletRpcViewer)) return;
231
- return isDefinedNotNull(walletRpcViewer) ? walletRpcViewer : httpRpcViewer;
448
+ if (shouldProxy(networkSettings, networkBootstrap) && isDefined5(walletRpcViewer)) {
449
+ return walletRpcViewer;
450
+ }
451
+ return httpRpcViewer;
232
452
  }, "useViewerInPage");
233
453
 
234
454
  // src/hooks/provider/useActiveNetworkCurrentBlock.ts
@@ -263,6 +483,46 @@ var useActiveNetworkRunner = /* @__PURE__ */ __name(() => {
263
483
  return runner;
264
484
  }, "useActiveNetworkRunner");
265
485
 
486
+ // src/hooks/provider/useRpcBroadcastListener.ts
487
+ import { isString } from "@xylabs/sdk-js";
488
+ import { useEffect, useState as useState5 } from "react";
489
+ var useRpcBroadcastListener = /* @__PURE__ */ __name(() => {
490
+ const [events, setEvents] = useState5([]);
491
+ useEffect(() => {
492
+ const listener = /* @__PURE__ */ __name((e) => {
493
+ if ("detail" in e) {
494
+ const { detail } = e ?? {};
495
+ if (isString(detail)) {
496
+ try {
497
+ const parsedDetail = JSON.parse(detail);
498
+ const { data: rpcCall, source } = parsedDetail;
499
+ const broadcastedRpcCall = {
500
+ rpcCall,
501
+ source,
502
+ timestamp: e.timeStamp
503
+ };
504
+ setEvents((prev) => [
505
+ broadcastedRpcCall,
506
+ ...prev
507
+ ]);
508
+ } catch (err) {
509
+ console.error(err);
510
+ }
511
+ }
512
+ }
513
+ }, "listener");
514
+ globalThis.addEventListener("xyo:broadcast-rpc-request", listener);
515
+ globalThis.addEventListener("xyo:broadcast-rpc-response", listener);
516
+ return () => {
517
+ globalThis.removeEventListener("xyo:broadcast-rpc-request", listener);
518
+ globalThis.removeEventListener("xyo:broadcast-rpc-response", listener);
519
+ };
520
+ }, []);
521
+ return {
522
+ events
523
+ };
524
+ }, "useRpcBroadcastListener");
525
+
266
526
  // src/hooks/provider/useViewerInWallet.ts
267
527
  import { useHttpRpcViewer as useHttpRpcViewer2 } from "@xyo-network/react-chain-provider";
268
528
  var useViewerInWallet = /* @__PURE__ */ __name(() => {
@@ -273,13 +533,13 @@ var useViewerInWallet = /* @__PURE__ */ __name(() => {
273
533
 
274
534
  // src/hooks/status/usePollNetworkStatus.ts
275
535
  import { delay, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
276
- import { useEffect, useState as useState3 } from "react";
536
+ import { useEffect as useEffect2, useState as useState6 } from "react";
277
537
  var STATUS_CHECK_INTERVAL = 1e4;
278
538
  var usePollNetworkStatus = /* @__PURE__ */ __name(() => {
279
539
  const network = useActiveNetworkNetwork();
280
- const [networkStatus, setNetworkStatus] = useState3();
281
- const [networkStatusError, setNetworkStatusError] = useState3();
282
- useEffect(() => {
540
+ const [networkStatus, setNetworkStatus] = useState6();
541
+ const [networkStatusError, setNetworkStatusError] = useState6();
542
+ useEffect2(() => {
283
543
  let checkNetwork = true;
284
544
  void (async () => {
285
545
  if (isUndefined2(network)) return;
@@ -316,13 +576,24 @@ var validNetworkStates = /* @__PURE__ */ new Set([
316
576
  var NetworkStatus = /* @__PURE__ */ __name(({ children, ...props }) => {
317
577
  const [networkStatus] = usePollNetworkStatus();
318
578
  const showStatus = networkStatus && !validNetworkStates.has(networkStatus.state);
319
- return /* @__PURE__ */ React7.createElement(React7.Fragment, null, showStatus ? /* @__PURE__ */ React7.createElement(NetworkStatusAlert, {
579
+ return /* @__PURE__ */ React11.createElement(React11.Fragment, null, showStatus ? /* @__PURE__ */ React11.createElement(NetworkStatusAlert, {
320
580
  status: networkStatus,
321
581
  ...props
322
582
  }) : null, children);
323
583
  }, "NetworkStatus");
584
+
585
+ // src/model/BroadcastRpc.ts
586
+ var BroadcastRpcRequestEventName = "xyo:broadcast-rpc-request";
587
+ var BroadcastRpcResponseEventName = "xyo:broadcast-rpc-response";
588
+ var defaultBroadcastConfig = {
589
+ request: true,
590
+ response: true
591
+ };
324
592
  export {
325
593
  ActiveNetworkAvatar,
594
+ BroadcastRpcRequestEventName,
595
+ BroadcastRpcResponseEventName,
596
+ BroadcastedRpcCallsDrawer,
326
597
  ChainNetworkContext,
327
598
  ChainNetworkProvider,
328
599
  NetworkAvatar,
@@ -330,13 +601,17 @@ export {
330
601
  NetworkMenuItem,
331
602
  NetworkStatus,
332
603
  NetworkStatusAlert,
604
+ defaultBroadcastConfig,
605
+ defaultChainNetworkSettings,
333
606
  useActiveNetworkCurrentBlock,
334
607
  useActiveNetworkCurrentBlockInPage,
335
608
  useActiveNetworkCurrentBlockInWallet,
336
609
  useActiveNetworkNetwork,
337
610
  useActiveNetworkRunner,
338
611
  useChainNetwork,
612
+ useChainNetworkSettings,
339
613
  usePollNetworkStatus,
614
+ useRpcBroadcastListener,
340
615
  useViewerInPage,
341
616
  useViewerInWallet
342
617
  };