@bosonprotocol/react-kit 0.36.0-alpha.13 → 0.36.0-alpha.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/ui/SvgImage.d.ts.map +1 -1
- package/dist/cjs/components/ui/SvgImage.js +2 -1
- package/dist/cjs/components/ui/SvgImage.js.map +1 -1
- package/dist/cjs/components/widgets/commit/CommitWidgetProviders.js +2 -2
- package/dist/cjs/components/widgets/commit/CommitWidgetProviders.js.map +1 -1
- package/dist/cjs/components/widgets/finance/FinanceWidgetProviders.js +2 -2
- package/dist/cjs/components/widgets/finance/FinanceWidgetProviders.js.map +1 -1
- package/dist/cjs/components/widgets/index.d.ts +1 -0
- package/dist/cjs/components/widgets/index.d.ts.map +1 -1
- package/dist/cjs/components/widgets/index.js +3 -1
- package/dist/cjs/components/widgets/index.js.map +1 -1
- package/dist/cjs/components/widgets/redemption/RedemptionWidgetProviders.js +2 -2
- package/dist/cjs/components/widgets/redemption/RedemptionWidgetProviders.js.map +1 -1
- package/dist/cjs/hooks/contracts/BlockNumberProvider.d.ts +12 -0
- package/dist/cjs/hooks/contracts/BlockNumberProvider.d.ts.map +1 -0
- package/dist/cjs/hooks/contracts/BlockNumberProvider.js +93 -0
- package/dist/cjs/hooks/contracts/BlockNumberProvider.js.map +1 -0
- package/dist/cjs/hooks/contracts/useBlockNumber.d.ts +0 -5
- package/dist/cjs/hooks/contracts/useBlockNumber.d.ts.map +1 -1
- package/dist/cjs/hooks/contracts/useBlockNumber.js +4 -91
- package/dist/cjs/hooks/contracts/useBlockNumber.js.map +1 -1
- package/dist/esm/components/ui/SvgImage.d.ts.map +1 -1
- package/dist/esm/components/ui/SvgImage.js +2 -1
- package/dist/esm/components/ui/SvgImage.js.map +1 -1
- package/dist/esm/components/widgets/commit/CommitWidgetProviders.js +1 -1
- package/dist/esm/components/widgets/commit/CommitWidgetProviders.js.map +1 -1
- package/dist/esm/components/widgets/finance/FinanceWidgetProviders.js +1 -1
- package/dist/esm/components/widgets/finance/FinanceWidgetProviders.js.map +1 -1
- package/dist/esm/components/widgets/index.d.ts +1 -0
- package/dist/esm/components/widgets/index.d.ts.map +1 -1
- package/dist/esm/components/widgets/index.js +1 -0
- package/dist/esm/components/widgets/index.js.map +1 -1
- package/dist/esm/components/widgets/redemption/RedemptionWidgetProviders.js +1 -1
- package/dist/esm/components/widgets/redemption/RedemptionWidgetProviders.js.map +1 -1
- package/dist/esm/hooks/contracts/BlockNumberProvider.d.ts +12 -0
- package/dist/esm/hooks/contracts/BlockNumberProvider.d.ts.map +1 -0
- package/dist/esm/hooks/contracts/BlockNumberProvider.js +86 -0
- package/dist/esm/hooks/contracts/BlockNumberProvider.js.map +1 -0
- package/dist/esm/hooks/contracts/useBlockNumber.d.ts +0 -5
- package/dist/esm/hooks/contracts/useBlockNumber.d.ts.map +1 -1
- package/dist/esm/hooks/contracts/useBlockNumber.js +2 -85
- package/dist/esm/hooks/contracts/useBlockNumber.js.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/components/ui/SvgImage.tsx +3 -1
- package/src/components/widgets/commit/CommitWidgetProviders.tsx +1 -1
- package/src/components/widgets/finance/FinanceWidgetProviders.tsx +1 -1
- package/src/components/widgets/index.tsx +1 -0
- package/src/components/widgets/redemption/RedemptionWidgetProviders.tsx +1 -1
- package/src/hooks/contracts/BlockNumberProvider.tsx +126 -0
- package/src/hooks/contracts/useBlockNumber.tsx +2 -127
- package/src/stories/ConnectWallet.stories.tsx +1 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ChainId } from "@uniswap/sdk-core";
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
ReactNode,
|
|
6
|
+
useCallback,
|
|
7
|
+
useEffect,
|
|
8
|
+
useMemo,
|
|
9
|
+
useState
|
|
10
|
+
} from "react";
|
|
11
|
+
import { useIsWindowVisible } from "../uniswap/useIsWindowVisible";
|
|
12
|
+
import { RPC_PROVIDERS } from "../../lib/const/providers";
|
|
13
|
+
import { useChainId, useProvider } from "../connection/connection";
|
|
14
|
+
|
|
15
|
+
export const MISSING_PROVIDER = Symbol();
|
|
16
|
+
export const BlockNumberContext = createContext<
|
|
17
|
+
| {
|
|
18
|
+
fastForward(block: number): void;
|
|
19
|
+
block?: number;
|
|
20
|
+
mainnetBlock?: number;
|
|
21
|
+
}
|
|
22
|
+
| typeof MISSING_PROVIDER
|
|
23
|
+
>(MISSING_PROVIDER);
|
|
24
|
+
|
|
25
|
+
export function BlockNumberProvider({ children }: { children: ReactNode }) {
|
|
26
|
+
const activeChainId = useChainId();
|
|
27
|
+
const provider = useProvider();
|
|
28
|
+
|
|
29
|
+
const [{ chainId, block, mainnetBlock }, setChainBlock] = useState<{
|
|
30
|
+
chainId?: number;
|
|
31
|
+
block?: number;
|
|
32
|
+
mainnetBlock?: number;
|
|
33
|
+
}>({
|
|
34
|
+
chainId: activeChainId
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const onChainBlock = useCallback((chainId: number, block: number) => {
|
|
38
|
+
setChainBlock((chainBlock) => {
|
|
39
|
+
if (chainBlock.chainId === chainId) {
|
|
40
|
+
if (!chainBlock.block || chainBlock.block < block) {
|
|
41
|
+
return {
|
|
42
|
+
chainId,
|
|
43
|
+
block,
|
|
44
|
+
mainnetBlock:
|
|
45
|
+
chainId === ChainId.MAINNET ? block : chainBlock.mainnetBlock
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
} else if (chainId === ChainId.MAINNET) {
|
|
49
|
+
if (!chainBlock.mainnetBlock || chainBlock.mainnetBlock < block) {
|
|
50
|
+
return { ...chainBlock, mainnetBlock: block };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return chainBlock;
|
|
54
|
+
});
|
|
55
|
+
}, []);
|
|
56
|
+
|
|
57
|
+
const windowVisible = useIsWindowVisible();
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
let stale = false;
|
|
60
|
+
|
|
61
|
+
if (provider && activeChainId && windowVisible) {
|
|
62
|
+
// If chainId hasn't changed, don't clear the block. This prevents re-fetching still valid data.
|
|
63
|
+
setChainBlock((chainBlock) =>
|
|
64
|
+
chainBlock.chainId === activeChainId
|
|
65
|
+
? chainBlock
|
|
66
|
+
: { chainId: activeChainId, mainnetBlock: chainBlock.mainnetBlock }
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
provider
|
|
70
|
+
.getBlockNumber()
|
|
71
|
+
.then((block) => {
|
|
72
|
+
if (!stale) onChainBlock(activeChainId, block);
|
|
73
|
+
})
|
|
74
|
+
.catch((error) => {
|
|
75
|
+
console.error(
|
|
76
|
+
`Failed to get block number for chainId ${activeChainId}`,
|
|
77
|
+
error
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const onBlock = (block: number) => onChainBlock(activeChainId, block);
|
|
82
|
+
provider.on("block", onBlock);
|
|
83
|
+
return () => {
|
|
84
|
+
stale = true;
|
|
85
|
+
provider.removeListener("block", onBlock);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return void 0;
|
|
90
|
+
}, [activeChainId, provider, windowVisible, onChainBlock]);
|
|
91
|
+
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (mainnetBlock === undefined) {
|
|
94
|
+
RPC_PROVIDERS[ChainId.MAINNET]
|
|
95
|
+
.getBlockNumber()
|
|
96
|
+
.then((block) => {
|
|
97
|
+
onChainBlock(ChainId.MAINNET, block);
|
|
98
|
+
})
|
|
99
|
+
// swallow errors - it's ok if this fails, as we'll try again if we activate mainnet
|
|
100
|
+
.catch(() => undefined);
|
|
101
|
+
}
|
|
102
|
+
}, [mainnetBlock, onChainBlock]);
|
|
103
|
+
|
|
104
|
+
const value = useMemo(
|
|
105
|
+
() => ({
|
|
106
|
+
fastForward: (update: number) => {
|
|
107
|
+
if (block && update > block) {
|
|
108
|
+
setChainBlock({
|
|
109
|
+
chainId: activeChainId,
|
|
110
|
+
block: update,
|
|
111
|
+
mainnetBlock:
|
|
112
|
+
activeChainId === ChainId.MAINNET ? update : mainnetBlock
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
block: chainId === activeChainId ? block : undefined,
|
|
117
|
+
mainnetBlock
|
|
118
|
+
}),
|
|
119
|
+
[activeChainId, block, chainId, mainnetBlock]
|
|
120
|
+
);
|
|
121
|
+
return (
|
|
122
|
+
<BlockNumberContext.Provider value={value}>
|
|
123
|
+
{children}
|
|
124
|
+
</BlockNumberContext.Provider>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
@@ -1,27 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
createContext,
|
|
5
|
-
ReactNode,
|
|
6
|
-
useCallback,
|
|
7
|
-
useContext,
|
|
8
|
-
useEffect,
|
|
9
|
-
useMemo,
|
|
10
|
-
useState
|
|
11
|
-
} from "react";
|
|
12
|
-
import { useIsWindowVisible } from "../uniswap/useIsWindowVisible";
|
|
13
|
-
import { RPC_PROVIDERS } from "../../lib/const/providers";
|
|
14
|
-
import { useChainId, useProvider } from "../connection/connection";
|
|
15
|
-
|
|
16
|
-
const MISSING_PROVIDER = Symbol();
|
|
17
|
-
const BlockNumberContext = createContext<
|
|
18
|
-
| {
|
|
19
|
-
fastForward(block: number): void;
|
|
20
|
-
block?: number;
|
|
21
|
-
mainnetBlock?: number;
|
|
22
|
-
}
|
|
23
|
-
| typeof MISSING_PROVIDER
|
|
24
|
-
>(MISSING_PROVIDER);
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import { BlockNumberContext, MISSING_PROVIDER } from "./BlockNumberProvider";
|
|
25
3
|
|
|
26
4
|
function useBlockNumberContext() {
|
|
27
5
|
const blockNumber = useContext(BlockNumberContext);
|
|
@@ -41,106 +19,3 @@ export function useBlockNumber(): number | undefined {
|
|
|
41
19
|
export function useMainnetBlockNumber(): number | undefined {
|
|
42
20
|
return useBlockNumberContext().mainnetBlock;
|
|
43
21
|
}
|
|
44
|
-
|
|
45
|
-
export function BlockNumberProvider({ children }: { children: ReactNode }) {
|
|
46
|
-
const activeChainId = useChainId();
|
|
47
|
-
const provider = useProvider();
|
|
48
|
-
|
|
49
|
-
const [{ chainId, block, mainnetBlock }, setChainBlock] = useState<{
|
|
50
|
-
chainId?: number;
|
|
51
|
-
block?: number;
|
|
52
|
-
mainnetBlock?: number;
|
|
53
|
-
}>({
|
|
54
|
-
chainId: activeChainId
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const onChainBlock = useCallback((chainId: number, block: number) => {
|
|
58
|
-
setChainBlock((chainBlock) => {
|
|
59
|
-
if (chainBlock.chainId === chainId) {
|
|
60
|
-
if (!chainBlock.block || chainBlock.block < block) {
|
|
61
|
-
return {
|
|
62
|
-
chainId,
|
|
63
|
-
block,
|
|
64
|
-
mainnetBlock:
|
|
65
|
-
chainId === ChainId.MAINNET ? block : chainBlock.mainnetBlock
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
} else if (chainId === ChainId.MAINNET) {
|
|
69
|
-
if (!chainBlock.mainnetBlock || chainBlock.mainnetBlock < block) {
|
|
70
|
-
return { ...chainBlock, mainnetBlock: block };
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return chainBlock;
|
|
74
|
-
});
|
|
75
|
-
}, []);
|
|
76
|
-
|
|
77
|
-
const windowVisible = useIsWindowVisible();
|
|
78
|
-
useEffect(() => {
|
|
79
|
-
let stale = false;
|
|
80
|
-
|
|
81
|
-
if (provider && activeChainId && windowVisible) {
|
|
82
|
-
// If chainId hasn't changed, don't clear the block. This prevents re-fetching still valid data.
|
|
83
|
-
setChainBlock((chainBlock) =>
|
|
84
|
-
chainBlock.chainId === activeChainId
|
|
85
|
-
? chainBlock
|
|
86
|
-
: { chainId: activeChainId, mainnetBlock: chainBlock.mainnetBlock }
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
provider
|
|
90
|
-
.getBlockNumber()
|
|
91
|
-
.then((block) => {
|
|
92
|
-
if (!stale) onChainBlock(activeChainId, block);
|
|
93
|
-
})
|
|
94
|
-
.catch((error) => {
|
|
95
|
-
console.error(
|
|
96
|
-
`Failed to get block number for chainId ${activeChainId}`,
|
|
97
|
-
error
|
|
98
|
-
);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
const onBlock = (block: number) => onChainBlock(activeChainId, block);
|
|
102
|
-
provider.on("block", onBlock);
|
|
103
|
-
return () => {
|
|
104
|
-
stale = true;
|
|
105
|
-
provider.removeListener("block", onBlock);
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return void 0;
|
|
110
|
-
}, [activeChainId, provider, windowVisible, onChainBlock]);
|
|
111
|
-
|
|
112
|
-
useEffect(() => {
|
|
113
|
-
if (mainnetBlock === undefined) {
|
|
114
|
-
RPC_PROVIDERS[ChainId.MAINNET]
|
|
115
|
-
.getBlockNumber()
|
|
116
|
-
.then((block) => {
|
|
117
|
-
onChainBlock(ChainId.MAINNET, block);
|
|
118
|
-
})
|
|
119
|
-
// swallow errors - it's ok if this fails, as we'll try again if we activate mainnet
|
|
120
|
-
.catch(() => undefined);
|
|
121
|
-
}
|
|
122
|
-
}, [mainnetBlock, onChainBlock]);
|
|
123
|
-
|
|
124
|
-
const value = useMemo(
|
|
125
|
-
() => ({
|
|
126
|
-
fastForward: (update: number) => {
|
|
127
|
-
if (block && update > block) {
|
|
128
|
-
setChainBlock({
|
|
129
|
-
chainId: activeChainId,
|
|
130
|
-
block: update,
|
|
131
|
-
mainnetBlock:
|
|
132
|
-
activeChainId === ChainId.MAINNET ? update : mainnetBlock
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
block: chainId === activeChainId ? block : undefined,
|
|
137
|
-
mainnetBlock
|
|
138
|
-
}),
|
|
139
|
-
[activeChainId, block, chainId, mainnetBlock]
|
|
140
|
-
);
|
|
141
|
-
return (
|
|
142
|
-
<BlockNumberContext.Provider value={value}>
|
|
143
|
-
{children}
|
|
144
|
-
</BlockNumberContext.Provider>
|
|
145
|
-
);
|
|
146
|
-
}
|
|
@@ -20,7 +20,7 @@ import { bosonButtonThemeKeys } from "../components/ui/ThemedButton";
|
|
|
20
20
|
import { CSSProperties, createGlobalStyle } from "styled-components";
|
|
21
21
|
import { Wallet } from "phosphor-react";
|
|
22
22
|
import { ReduxProvider } from "../components/widgets/ReduxProvider";
|
|
23
|
-
import { BlockNumberProvider } from "../hooks/contracts/
|
|
23
|
+
import { BlockNumberProvider } from "../hooks/contracts/BlockNumberProvider";
|
|
24
24
|
|
|
25
25
|
const successButtonTheme: ConnectWalletProps["connectWalletButtonTheme"] =
|
|
26
26
|
bosonButtonThemes()["primary"];
|