@xyo-network/react-chain-network 1.20.15 → 1.20.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -540
- package/dist/browser/context/network/context.d.ts +12 -12
- package/dist/browser/context/network/use.d.ts +4 -4
- package/dist/browser/hooks/provider/useViewerInPage.d.ts.map +1 -1
- package/dist/browser/index.mjs.map +1 -1
- package/package.json +158 -48
- package/src/components/broadcast/CloseDrawerIconButton.tsx +0 -23
- package/src/components/broadcast/Drawer.tsx +0 -88
- package/src/components/broadcast/details/Card.tsx +0 -71
- package/src/components/broadcast/details/SummaryStack.stories.tsx +0 -36
- package/src/components/broadcast/details/SummaryStack.tsx +0 -68
- package/src/components/broadcast/details/index.ts +0 -2
- package/src/components/broadcast/index.ts +0 -1
- package/src/components/broadcast/usePaginatedEventPairs.ts +0 -69
- package/src/components/index.ts +0 -3
- package/src/components/menu/Avatar.tsx +0 -42
- package/src/components/menu/Icon.tsx +0 -21
- package/src/components/menu/MenuItem.tsx +0 -38
- package/src/components/menu/index.ts +0 -3
- package/src/components/status/Alert.stories.tsx +0 -74
- package/src/components/status/Alert.tsx +0 -51
- package/src/components/status/Dialog.tsx +0 -51
- package/src/components/status/NetworkStatus.tsx +0 -21
- package/src/components/status/index.ts +0 -2
- package/src/context/ActiveGatewayProvider.tsx +0 -21
- package/src/context/index.ts +0 -2
- package/src/context/network/Provider.tsx +0 -85
- package/src/context/network/context.ts +0 -5
- package/src/context/network/index.ts +0 -5
- package/src/context/network/settings/defaultChainNetworkSettings.ts +0 -5
- package/src/context/network/settings/index.ts +0 -3
- package/src/context/network/settings/types.ts +0 -7
- package/src/context/network/settings/useChainNetworkSettings.ts +0 -27
- package/src/context/network/state.ts +0 -13
- package/src/context/network/use.ts +0 -5
- package/src/hooks/index.ts +0 -2
- package/src/hooks/provider/UseViewerInPageV2.stories.tsx +0 -126
- package/src/hooks/provider/index.ts +0 -2
- package/src/hooks/provider/useRpcBroadcastListener.ts +0 -70
- package/src/hooks/provider/useViewerInPage.ts +0 -49
- package/src/hooks/status/index.ts +0 -1
- package/src/hooks/status/usePollNetworkStatus.ts +0 -39
- package/src/index.ts +0 -5
- package/src/model/BroadcastRpc.ts +0 -29
- package/src/model/index.ts +0 -1
- package/src/story/NetworkGatewayDecorators.tsx +0 -44
- package/src/story/index.ts +0 -1
- package/src/types/global.d.ts +0 -9
- package/src/types/images.d.ts +0 -20
package/src/context/index.ts
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { ErrorRender } from '@xylabs/react-error'
|
|
2
|
-
import { usePromise } from '@xylabs/react-promise'
|
|
3
|
-
import { isDefined } from '@xylabs/sdk-js'
|
|
4
|
-
import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'
|
|
5
|
-
import { MainNetwork } from '@xyo-network/xl1-sdk'
|
|
6
|
-
import type { PropsWithChildren } from 'react'
|
|
7
|
-
import React, {
|
|
8
|
-
useCallback, useMemo, useState,
|
|
9
|
-
} from 'react'
|
|
10
|
-
|
|
11
|
-
import { ChainNetworkContext } from './context.ts'
|
|
12
|
-
import type { ChainNetworkSettings } from './settings/index.ts'
|
|
13
|
-
import { defaultChainNetworkSettings, useChainNetworkSettings } from './settings/index.ts'
|
|
14
|
-
import type { ChainNetworkState } from './state.ts'
|
|
15
|
-
|
|
16
|
-
export interface ChainNetworkProviderProps extends PropsWithChildren {
|
|
17
|
-
getActiveNetwork?: () => Promise<NetworkBootstrap | undefined>
|
|
18
|
-
networkSettings?: ChainNetworkSettings
|
|
19
|
-
networks?: NetworkBootstrap[]
|
|
20
|
-
setActiveNetwork?: (networkId: NetworkBootstrap['id']) => Promise<NetworkBootstrap>
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const ChainNetworkProvider: React.FC<ChainNetworkProviderProps> = ({
|
|
24
|
-
children, getActiveNetwork, networkSettings: networkSettingsProp = defaultChainNetworkSettings, networks, setActiveNetwork: setActiveNetworkExternal,
|
|
25
|
-
}) => {
|
|
26
|
-
const [activeNetwork, setActiveNetwork] = useState<NetworkBootstrap>()
|
|
27
|
-
const [error, setError] = useState<Error>()
|
|
28
|
-
const { networkSettings, updateNetworkSettings } = useChainNetworkSettings(networkSettingsProp)
|
|
29
|
-
|
|
30
|
-
// Set the active network upon initialization
|
|
31
|
-
const [resolvedActiveNetwork, activeNetworkError] = usePromise(async () => {
|
|
32
|
-
// ensure networks are loaded
|
|
33
|
-
if (!networks) return
|
|
34
|
-
// get last saved active network
|
|
35
|
-
const activeNetwork = await getActiveNetwork?.()
|
|
36
|
-
// ensure the active network saved is found in the list of networks
|
|
37
|
-
if (activeNetwork && networks?.find(network => network.id === activeNetwork.id)) {
|
|
38
|
-
// Set the active network if it exists
|
|
39
|
-
return activeNetwork
|
|
40
|
-
} else {
|
|
41
|
-
// Set the default network if no active network exists
|
|
42
|
-
const defaultNetwork = networks.find(network => network.id === MainNetwork.id) ?? networks[0]
|
|
43
|
-
await setActiveNetworkExternal?.(defaultNetwork.id)
|
|
44
|
-
|
|
45
|
-
// Set the active network in the context
|
|
46
|
-
return defaultNetwork
|
|
47
|
-
}
|
|
48
|
-
}, [networks])
|
|
49
|
-
|
|
50
|
-
const [previousResolvedActiveNetwork, setPreviousResolvedActiveNetwork] = useState(resolvedActiveNetwork)
|
|
51
|
-
if (isDefined(resolvedActiveNetwork) && resolvedActiveNetwork !== previousResolvedActiveNetwork) {
|
|
52
|
-
setActiveNetwork(resolvedActiveNetwork)
|
|
53
|
-
setPreviousResolvedActiveNetwork(resolvedActiveNetwork)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const updateActiveNetwork = useCallback((networkId: NetworkBootstrap['id']) => {
|
|
57
|
-
setError(undefined)
|
|
58
|
-
const network = networks?.find(network => network.id === networkId)
|
|
59
|
-
if (!network) {
|
|
60
|
-
setError(new Error(`Network with id ${networkId} not found`))
|
|
61
|
-
return
|
|
62
|
-
}
|
|
63
|
-
// set internally
|
|
64
|
-
setActiveNetwork(network)
|
|
65
|
-
// set externally
|
|
66
|
-
void setActiveNetworkExternal?.(networkId)
|
|
67
|
-
}, [networks, setActiveNetworkExternal])
|
|
68
|
-
|
|
69
|
-
const value: ChainNetworkState = useMemo(() => ({
|
|
70
|
-
activeNetwork,
|
|
71
|
-
networks,
|
|
72
|
-
provided: true,
|
|
73
|
-
updateActiveNetwork,
|
|
74
|
-
networkSettings,
|
|
75
|
-
updateNetworkSettings,
|
|
76
|
-
chainNetworkError: error ?? activeNetworkError,
|
|
77
|
-
}), [activeNetwork, activeNetworkError, error, networkSettings, networks, updateActiveNetwork, updateNetworkSettings])
|
|
78
|
-
|
|
79
|
-
return (
|
|
80
|
-
<ChainNetworkContext value={value}>
|
|
81
|
-
<ErrorRender error={error ?? activeNetworkError} scope="ChainNetworkProvider" />
|
|
82
|
-
{children}
|
|
83
|
-
</ChainNetworkContext>
|
|
84
|
-
)
|
|
85
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'
|
|
2
|
-
import { useCallback, useState } from 'react'
|
|
3
|
-
|
|
4
|
-
import { defaultChainNetworkSettings } from './defaultChainNetworkSettings.ts'
|
|
5
|
-
import type { ChainNetworkSettings } from './types.ts'
|
|
6
|
-
|
|
7
|
-
export const useChainNetworkSettings = (defaults = defaultChainNetworkSettings) => {
|
|
8
|
-
const [networkSettings, setNetworkSettings] = useState<ChainNetworkSettings>(defaults)
|
|
9
|
-
|
|
10
|
-
const updateNetworkSettings = useCallback((
|
|
11
|
-
networkId: NetworkBootstrap['id'],
|
|
12
|
-
settings: Partial<ChainNetworkSettings>,
|
|
13
|
-
) => {
|
|
14
|
-
setNetworkSettings(prevSettings => ({
|
|
15
|
-
...prevSettings,
|
|
16
|
-
[networkId]: {
|
|
17
|
-
...prevSettings[networkId],
|
|
18
|
-
...settings,
|
|
19
|
-
},
|
|
20
|
-
}))
|
|
21
|
-
}, [])
|
|
22
|
-
|
|
23
|
-
return {
|
|
24
|
-
networkSettings,
|
|
25
|
-
updateNetworkSettings,
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { ContextExState } from '@xylabs/react-shared'
|
|
2
|
-
import type { NetworkBootstrap } from '@xyo-network/xl1-sdk'
|
|
3
|
-
|
|
4
|
-
import type { ChainNetworkSettings, NetworkSetting } from './settings/index.ts'
|
|
5
|
-
|
|
6
|
-
export type ChainNetworkState = ContextExState<{
|
|
7
|
-
activeNetwork?: NetworkBootstrap
|
|
8
|
-
chainNetworkError?: Error
|
|
9
|
-
networkSettings: ChainNetworkSettings
|
|
10
|
-
networks?: NetworkBootstrap[]
|
|
11
|
-
updateActiveNetwork?: (networkId: NetworkBootstrap['id']) => void
|
|
12
|
-
updateNetworkSettings?: (networkId: NetworkBootstrap['id'], settings: NetworkSetting) => void
|
|
13
|
-
}>
|
package/src/hooks/index.ts
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MenuItem, Select, Stack, Typography,
|
|
3
|
-
} from '@mui/material'
|
|
4
|
-
import type { Decorator, StoryFn } from '@storybook/react-vite'
|
|
5
|
-
import { ButtonEx } from '@xylabs/react-button'
|
|
6
|
-
import { ErrorRender } from '@xylabs/react-error'
|
|
7
|
-
import {
|
|
8
|
-
isDefined, isDefinedNotNull, isUndefined, isUndefinedOrNull,
|
|
9
|
-
} from '@xylabs/sdk-js'
|
|
10
|
-
import { IframeWalletWarningDecorator } from '@xyo-network/react-chain-shared'
|
|
11
|
-
import type { HydratedBlock, NetworkId } from '@xyo-network/xl1-sdk'
|
|
12
|
-
import {
|
|
13
|
-
LocalNetwork, MainNetwork, SequenceNetwork,
|
|
14
|
-
} from '@xyo-network/xl1-sdk'
|
|
15
|
-
import React, { useCallback, useState } from 'react'
|
|
16
|
-
|
|
17
|
-
import { BroadcastedRpcCallsDrawer } from '../../components/index.ts'
|
|
18
|
-
import type { ChainNetworkSettings } from '../../context/index.ts'
|
|
19
|
-
import {
|
|
20
|
-
ActiveGatewayProvider, ChainNetworkProvider, useChainNetwork,
|
|
21
|
-
} from '../../context/index.ts'
|
|
22
|
-
import { LocalNetworkGatewayDecorator } from '../../story/index.ts'
|
|
23
|
-
import { useRpcBroadcastListener } from './useRpcBroadcastListener.ts'
|
|
24
|
-
import { useViewerInPage } from './useViewerInPage.ts'
|
|
25
|
-
|
|
26
|
-
const AvailableNetworks = [MainNetwork, SequenceNetwork, LocalNetwork]
|
|
27
|
-
const networkSettings: ChainNetworkSettings = { [LocalNetwork.id]: { proxy: true } }
|
|
28
|
-
const getActiveNetwork = async () => await Promise.resolve(AvailableNetworks[2])
|
|
29
|
-
|
|
30
|
-
const UseViewerInPageV2StoryProxyDecorator: Decorator = (Story, args) => {
|
|
31
|
-
return (
|
|
32
|
-
<ChainNetworkProvider networks={AvailableNetworks} networkSettings={networkSettings} getActiveNetwork={getActiveNetwork}>
|
|
33
|
-
<ActiveGatewayProvider>
|
|
34
|
-
<StubNetworkSelector />
|
|
35
|
-
<Story {...args} />
|
|
36
|
-
</ActiveGatewayProvider>
|
|
37
|
-
</ChainNetworkProvider>
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const StubNetworkSelector: React.FC = () => {
|
|
42
|
-
const { updateActiveNetwork } = useChainNetwork()
|
|
43
|
-
return (
|
|
44
|
-
<Select size="small" defaultValue={LocalNetwork.id} onChange={event => updateActiveNetwork?.(event.target.value as NetworkId)}>
|
|
45
|
-
{AvailableNetworks.map(network => (
|
|
46
|
-
<MenuItem key={network.id} value={network.id}>{network.name}</MenuItem>
|
|
47
|
-
))}
|
|
48
|
-
</Select>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const UseViewerInPageV2StoryTemplate: React.FC = () => {
|
|
53
|
-
const viewer = useViewerInPage()
|
|
54
|
-
const [error, setError] = useState<Error | null>(null)
|
|
55
|
-
const [result, setResult] = useState<HydratedBlock | null | undefined>()
|
|
56
|
-
const [loading, setLoading] = useState(false)
|
|
57
|
-
const [drawerOpen, setDrawerOpen] = useState(false)
|
|
58
|
-
const { clearEvents, events } = useRpcBroadcastListener()
|
|
59
|
-
|
|
60
|
-
const handleClick = useCallback(async () => {
|
|
61
|
-
if (isDefinedNotNull(viewer)) {
|
|
62
|
-
try {
|
|
63
|
-
setError(null)
|
|
64
|
-
setResult(undefined)
|
|
65
|
-
setLoading(true)
|
|
66
|
-
const block = await viewer.currentBlock()
|
|
67
|
-
setError(null)
|
|
68
|
-
setResult(block)
|
|
69
|
-
setLoading(false)
|
|
70
|
-
} catch (err) {
|
|
71
|
-
setError(err as Error)
|
|
72
|
-
setResult(undefined)
|
|
73
|
-
setLoading(false)
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}, [viewer])
|
|
77
|
-
|
|
78
|
-
if (isDefined(viewer) && isUndefined(result) && isUndefinedOrNull(error) && !loading) {
|
|
79
|
-
void handleClick()
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return (
|
|
83
|
-
<Stack gap={2} alignItems="center">
|
|
84
|
-
<BroadcastedRpcCallsDrawer
|
|
85
|
-
open={drawerOpen}
|
|
86
|
-
events={events}
|
|
87
|
-
onClearEvents={clearEvents}
|
|
88
|
-
onClose={() => setDrawerOpen(false)}
|
|
89
|
-
/>
|
|
90
|
-
<ButtonEx disabled={Object.keys(events).length === 0} variant="contained" onClick={() => setDrawerOpen(true)}>
|
|
91
|
-
Show Broadcasted RPC Calls
|
|
92
|
-
</ButtonEx>
|
|
93
|
-
<ButtonEx loading={loading} variant="contained" onClick={() => void handleClick()} disabled={!isDefined(viewer)}>
|
|
94
|
-
Get Current Block
|
|
95
|
-
</ButtonEx>
|
|
96
|
-
{isDefined(result)
|
|
97
|
-
? (
|
|
98
|
-
<Typography variant="h4">
|
|
99
|
-
Block:
|
|
100
|
-
{result?.[0].block}
|
|
101
|
-
</Typography>
|
|
102
|
-
)
|
|
103
|
-
: null}
|
|
104
|
-
<pre>
|
|
105
|
-
{JSON.stringify(result, null, 2)}
|
|
106
|
-
</pre>
|
|
107
|
-
<ErrorRender error={error} />
|
|
108
|
-
</Stack>
|
|
109
|
-
)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export default {
|
|
113
|
-
title: 'provider/useViewerInPage',
|
|
114
|
-
component: UseViewerInPageV2StoryTemplate,
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const Template: StoryFn<typeof UseViewerInPageV2StoryTemplate> = args => <UseViewerInPageV2StoryTemplate {...args} />
|
|
118
|
-
|
|
119
|
-
const Default = Template.bind({})
|
|
120
|
-
Default.decorators = [LocalNetworkGatewayDecorator]
|
|
121
|
-
Default.args = {}
|
|
122
|
-
const Proxy = Template.bind({})
|
|
123
|
-
Proxy.decorators = [IframeWalletWarningDecorator, UseViewerInPageV2StoryProxyDecorator]
|
|
124
|
-
Proxy.args = {}
|
|
125
|
-
|
|
126
|
-
export { Default, Proxy }
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { JsonRpcRequest, JsonRpcResponse } from '@metamask/utils'
|
|
2
|
-
import { isJsonRpcRequest, isJsonRpcResponse } from '@metamask/utils'
|
|
3
|
-
import { isDefined, isString } from '@xylabs/sdk-js'
|
|
4
|
-
import { useEffect, useState } from 'react'
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
BroadcastedRpcCall, RpcRequestResponsePairs, RpcRequestResponsePairsById,
|
|
8
|
-
} from '../../model/index.ts'
|
|
9
|
-
|
|
10
|
-
const parseRpcCall = (acc: RpcRequestResponsePairsById, event: BroadcastedRpcCall) => {
|
|
11
|
-
if (isJsonRpcResponse(event.rpcCall)) {
|
|
12
|
-
const castedEvent = event as BroadcastedRpcCall<JsonRpcResponse>
|
|
13
|
-
acc[castedEvent.rpcCall.id as string].result = castedEvent
|
|
14
|
-
} else if (isJsonRpcRequest(event.rpcCall)) {
|
|
15
|
-
const castedEvent = event as BroadcastedRpcCall<JsonRpcRequest>
|
|
16
|
-
acc[castedEvent.rpcCall.id as string].request = castedEvent
|
|
17
|
-
} else {
|
|
18
|
-
console.error('Unknown RPC call type', event)
|
|
19
|
-
}
|
|
20
|
-
acc[event.rpcCall.id as string].source = event.source
|
|
21
|
-
|
|
22
|
-
return acc
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const useRpcBroadcastListener = () => {
|
|
26
|
-
const [events, setEvents] = useState<RpcRequestResponsePairsById>({})
|
|
27
|
-
const clearEvents = () => setEvents({})
|
|
28
|
-
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
const listener = (e: Event) => {
|
|
31
|
-
if ('detail' in e) {
|
|
32
|
-
const { detail } = e ?? {}
|
|
33
|
-
if (isString(detail)) {
|
|
34
|
-
try {
|
|
35
|
-
const parsedDetail = JSON.parse(detail)
|
|
36
|
-
const { data: rpcCall, source } = parsedDetail
|
|
37
|
-
// TODO - make zod type for parsing details
|
|
38
|
-
const broadcastedRpcCall: BroadcastedRpcCall = {
|
|
39
|
-
rpcCall,
|
|
40
|
-
source,
|
|
41
|
-
timestamp: Date.now(),
|
|
42
|
-
}
|
|
43
|
-
setEvents((prev) => {
|
|
44
|
-
const { id } = broadcastedRpcCall.rpcCall
|
|
45
|
-
const newState = { ...prev }
|
|
46
|
-
if (isDefined(newState[id as string])) {
|
|
47
|
-
parseRpcCall(newState, broadcastedRpcCall)
|
|
48
|
-
} else {
|
|
49
|
-
newState[id as string] = {} as RpcRequestResponsePairs
|
|
50
|
-
parseRpcCall(newState, broadcastedRpcCall)
|
|
51
|
-
}
|
|
52
|
-
return newState
|
|
53
|
-
})
|
|
54
|
-
} catch (err) {
|
|
55
|
-
console.error(err)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
globalThis.addEventListener('xyo:broadcast-rpc-request', listener)
|
|
61
|
-
globalThis.addEventListener('xyo:broadcast-rpc-response', listener)
|
|
62
|
-
|
|
63
|
-
return () => {
|
|
64
|
-
globalThis.removeEventListener('xyo:broadcast-rpc-request', listener)
|
|
65
|
-
globalThis.removeEventListener('xyo:broadcast-rpc-response', listener)
|
|
66
|
-
}
|
|
67
|
-
}, [])
|
|
68
|
-
|
|
69
|
-
return { events, clearEvents }
|
|
70
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isDefined, isNull, isUndefined,
|
|
3
|
-
} from '@xylabs/sdk-js'
|
|
4
|
-
import { useProvidedGateway } from '@xyo-network/react-chain-provider'
|
|
5
|
-
import type { NetworkId } from '@xyo-network/xl1-sdk'
|
|
6
|
-
|
|
7
|
-
import type { ChainNetworkSettings } from '../../context/index.ts'
|
|
8
|
-
import { useChainNetwork } from '../../context/index.ts'
|
|
9
|
-
|
|
10
|
-
const shouldProxy = (networkSettings: ChainNetworkSettings, networkId: NetworkId | undefined) => {
|
|
11
|
-
return isDefined(networkId)
|
|
12
|
-
&& isDefined(networkSettings[networkId])
|
|
13
|
-
&& networkSettings[networkId].proxy
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Finds the appropriate viewer based on network settings and available gateways
|
|
18
|
-
*
|
|
19
|
-
* Specifically, if the network settings indicate that the network should be proxied, it will attempt to use the wallet viewer.
|
|
20
|
-
* If the wallet viewer is not available, it will fall back to the in-page viewer and log a warning. If the network should not
|
|
21
|
-
* be proxied, it will use the in-page viewer.
|
|
22
|
-
*/
|
|
23
|
-
export const useViewerInPage = () => {
|
|
24
|
-
const { networkSettings, activeNetwork } = useChainNetwork()
|
|
25
|
-
const { gateways } = useProvidedGateway()
|
|
26
|
-
|
|
27
|
-
const { inPageGateway, walletGateway } = gateways
|
|
28
|
-
|
|
29
|
-
const inPageViewer = inPageGateway?.connection?.viewer
|
|
30
|
-
const walletViewer = walletGateway?.connection?.viewer
|
|
31
|
-
|
|
32
|
-
// If the wallet viewer is undefined, don't return it yet, walletViewer is still checking
|
|
33
|
-
if (isUndefined(walletGateway)) return
|
|
34
|
-
|
|
35
|
-
if (shouldProxy(networkSettings, activeNetwork?.id)) {
|
|
36
|
-
if (isNull(walletGateway)) {
|
|
37
|
-
// eslint-disable-next-line react-x/purity
|
|
38
|
-
console.warn(`Network ${activeNetwork?.id} is set to proxy but no wallet viewer is available, falling back to HTTP RPC viewer`)
|
|
39
|
-
return inPageViewer
|
|
40
|
-
}
|
|
41
|
-
// If the network setting is to proxy and the wallet viewer is available,
|
|
42
|
-
// try to use the wallet viewer
|
|
43
|
-
return walletViewer
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return inPageViewer
|
|
47
|
-
}
|
|
48
|
-
/** @deprecated - use useViewerInPage instead */
|
|
49
|
-
export const useViewerInPageV2 = useViewerInPage
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './usePollNetworkStatus.ts'
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { delay, isUndefined } from '@xylabs/sdk-js'
|
|
2
|
-
import { useNetworkFromGateway } from '@xyo-network/react-chain-provider'
|
|
3
|
-
import type { NetworkStatus } from '@xyo-network/xl1-sdk'
|
|
4
|
-
import { useEffect, useState } from 'react'
|
|
5
|
-
|
|
6
|
-
const STATUS_CHECK_INTERVAL = 10_000
|
|
7
|
-
|
|
8
|
-
export const usePollNetworkStatus = () => {
|
|
9
|
-
const network = useNetworkFromGateway()
|
|
10
|
-
const [networkStatus, setNetworkStatus] = useState<NetworkStatus>()
|
|
11
|
-
const [networkStatusError, setNetworkStatusError] = useState<Error>()
|
|
12
|
-
|
|
13
|
-
// Check network status every 10 seconds
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
let checkNetwork = true
|
|
16
|
-
void (async () => {
|
|
17
|
-
if (isUndefined(network)) return
|
|
18
|
-
while (checkNetwork) {
|
|
19
|
-
try {
|
|
20
|
-
const response = await network.status()
|
|
21
|
-
setNetworkStatus(response)
|
|
22
|
-
setNetworkStatusError(undefined)
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.info('Error fetching network status:', error)
|
|
25
|
-
setNetworkStatus(undefined)
|
|
26
|
-
setNetworkStatusError(error as Error)
|
|
27
|
-
}
|
|
28
|
-
await delay(STATUS_CHECK_INTERVAL)
|
|
29
|
-
}
|
|
30
|
-
})()
|
|
31
|
-
|
|
32
|
-
return () => {
|
|
33
|
-
// Cleanup function to stop checking network status at the current statusUrl
|
|
34
|
-
checkNetwork = false
|
|
35
|
-
}
|
|
36
|
-
}, [network])
|
|
37
|
-
|
|
38
|
-
return [networkStatus, networkStatusError] as const
|
|
39
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { JsonRpcRequest } from '@metamask/json-rpc-engine/v2'
|
|
2
|
-
import type { JsonRpcResponse } from '@metamask/utils'
|
|
3
|
-
|
|
4
|
-
// Configuration options for broadcasting RPC calls
|
|
5
|
-
export type BroadcastRpcConfig = { request: boolean; response: boolean }
|
|
6
|
-
|
|
7
|
-
// Event Names
|
|
8
|
-
export const BroadcastRpcRequestEventName = 'xyo:broadcast-rpc-request' as const
|
|
9
|
-
export const BroadcastRpcResponseEventName = 'xyo:broadcast-rpc-response' as const
|
|
10
|
-
export type BroadcastRpcEventNames = typeof BroadcastRpcRequestEventName | typeof BroadcastRpcResponseEventName
|
|
11
|
-
|
|
12
|
-
// default options are to broadcast all events
|
|
13
|
-
export const defaultBroadcastConfig: BroadcastRpcConfig = { request: true, response: true }
|
|
14
|
-
|
|
15
|
-
export interface BroadcastedRpcCall<TRpcCall extends JsonRpcRequest | JsonRpcResponse = JsonRpcRequest | JsonRpcResponse> {
|
|
16
|
-
rpcCall: TRpcCall
|
|
17
|
-
source: string
|
|
18
|
-
timestamp: number
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type RpcRequestResponsePairs = {
|
|
22
|
-
request: BroadcastedRpcCall<JsonRpcRequest>
|
|
23
|
-
result?: BroadcastedRpcCall<JsonRpcResponse>
|
|
24
|
-
source?: string
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type RpcRequestResponsePairsById = {
|
|
28
|
-
[id: string]: RpcRequestResponsePairs
|
|
29
|
-
}
|
package/src/model/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './BroadcastRpc.ts'
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { Decorator } from '@storybook/react-vite'
|
|
2
|
-
import {
|
|
3
|
-
LocalNetwork, MainNetwork, SequenceNetwork,
|
|
4
|
-
} from '@xyo-network/xl1-sdk'
|
|
5
|
-
import React from 'react'
|
|
6
|
-
|
|
7
|
-
import type { ChainNetworkSettings } from '../context/index.ts'
|
|
8
|
-
import { ActiveGatewayProvider, ChainNetworkProvider } from '../context/index.ts'
|
|
9
|
-
|
|
10
|
-
const AvailableNetworks = [MainNetwork, SequenceNetwork, LocalNetwork]
|
|
11
|
-
const networkSettings: ChainNetworkSettings = { [LocalNetwork.id]: { proxy: true } }
|
|
12
|
-
|
|
13
|
-
const getActiveMainnetNetwork = async () => await Promise.resolve(AvailableNetworks[0])
|
|
14
|
-
export const MainnetNetworkGatewayDecorator: Decorator = (Story, args) => {
|
|
15
|
-
return (
|
|
16
|
-
<ChainNetworkProvider networks={AvailableNetworks} networkSettings={networkSettings} getActiveNetwork={getActiveMainnetNetwork}>
|
|
17
|
-
<ActiveGatewayProvider>
|
|
18
|
-
<Story {...args} />
|
|
19
|
-
</ActiveGatewayProvider>
|
|
20
|
-
</ChainNetworkProvider>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const getActiveSequenceNetwork = async () => await Promise.resolve(AvailableNetworks[1])
|
|
25
|
-
export const SequenceNetworkGatewayDecorator: Decorator = (Story, args) => {
|
|
26
|
-
return (
|
|
27
|
-
<ChainNetworkProvider networks={AvailableNetworks} networkSettings={networkSettings} getActiveNetwork={getActiveSequenceNetwork}>
|
|
28
|
-
<ActiveGatewayProvider>
|
|
29
|
-
<Story {...args} />
|
|
30
|
-
</ActiveGatewayProvider>
|
|
31
|
-
</ChainNetworkProvider>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const getActiveLocalNetwork = async () => await Promise.resolve(AvailableNetworks[2])
|
|
36
|
-
export const LocalNetworkGatewayDecorator: Decorator = (Story, args) => {
|
|
37
|
-
return (
|
|
38
|
-
<ChainNetworkProvider networks={AvailableNetworks} networkSettings={networkSettings} getActiveNetwork={getActiveLocalNetwork}>
|
|
39
|
-
<ActiveGatewayProvider>
|
|
40
|
-
<Story {...args} />
|
|
41
|
-
</ActiveGatewayProvider>
|
|
42
|
-
</ChainNetworkProvider>
|
|
43
|
-
)
|
|
44
|
-
}
|
package/src/story/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './NetworkGatewayDecorators.tsx'
|
package/src/types/global.d.ts
DELETED
package/src/types/images.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
declare module '*.png'
|
|
2
|
-
declare module '*.jpg'
|
|
3
|
-
declare module '*.gif'
|
|
4
|
-
declare module '*.webp'
|
|
5
|
-
|
|
6
|
-
declare module '*.svg?react' {
|
|
7
|
-
import type * as React from 'react'
|
|
8
|
-
const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>
|
|
9
|
-
export default ReactComponent
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
declare module '*.svg' {
|
|
13
|
-
const src: string
|
|
14
|
-
export default src
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
declare module '*.svg?raw' {
|
|
18
|
-
const content: string
|
|
19
|
-
export default content
|
|
20
|
-
}
|