edsadapter 0.0.1
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 +75 -0
- package/eslint.config.js +23 -0
- package/index.html +13 -0
- package/package.json +61 -0
- package/public/favicon.svg +1 -0
- package/public/icons.svg +24 -0
- package/src/App.css +184 -0
- package/src/App.tsx +35 -0
- package/src/assets/hero.png +0 -0
- package/src/assets/loading.png +0 -0
- package/src/assets/react.svg +1 -0
- package/src/assets/svg/close.svg +3 -0
- package/src/assets/svg/tick.svg +4 -0
- package/src/assets/vite.svg +1 -0
- package/src/assets/wallet/bitget.png +0 -0
- package/src/assets/wallet/coinbase.png +0 -0
- package/src/assets/wallet/endless.png +0 -0
- package/src/assets/wallet/luffa.png +0 -0
- package/src/assets/wallet/metamask.png +0 -0
- package/src/assets/wallet/okx.png +0 -0
- package/src/assets/wallet/phantom.png +0 -0
- package/src/assets/wallet/tron.png +0 -0
- package/src/assets/wallet/walletConnect.png +0 -0
- package/src/components/Button/index.tsx +9 -0
- package/src/components/ConnectModal/index.css +32 -0
- package/src/components/ConnectModal/index.tsx +77 -0
- package/src/components/ConnectModal/modal.tsx +261 -0
- package/src/components/ConnectModal/showConnectModal.tsx +20 -0
- package/src/components/ConnectModal/styles.ts +46 -0
- package/src/components/Modal.tsx +122 -0
- package/src/config/wallets.ts +98 -0
- package/src/contexts/Modal.tsx +33 -0
- package/src/contexts/Tables.tsx +32 -0
- package/src/hooks/store.ts +30 -0
- package/src/hooks/useIsMobile.ts +10 -0
- package/src/hooks/useSyncProvider.ts +4 -0
- package/src/hooks/useToast.tsx +163 -0
- package/src/hooks/useWallet.ts +66 -0
- package/src/index.css +111 -0
- package/src/index.ts +5 -0
- package/src/main.tsx +5 -0
- package/src/store/connectStore.ts +87 -0
- package/src/theme/components/Button.ts +100 -0
- package/src/theme/components/Checkbox.tsx +24 -0
- package/src/theme/components/Drawer.ts +60 -0
- package/src/theme/components/Input.ts +98 -0
- package/src/theme/components/Menu.ts +52 -0
- package/src/theme/components/Modal.ts +44 -0
- package/src/theme/components/NumberInput.ts +54 -0
- package/src/theme/components/Popover.ts +72 -0
- package/src/theme/components/Progress.ts +41 -0
- package/src/theme/components/Radio.tsx +66 -0
- package/src/theme/components/Switch.ts +30 -0
- package/src/theme/components/Table.ts +149 -0
- package/src/theme/components/Tabs.ts +90 -0
- package/src/theme/components/Tag.ts +21 -0
- package/src/theme/components/Textarea.ts +21 -0
- package/src/theme/components/Tooltip.ts +35 -0
- package/src/theme/index.ts +269 -0
- package/src/types/adapter.d.ts +43 -0
- package/src/types/global.d.ts +102 -0
- package/src/types/type.ts +100 -0
- package/src/web3/ethereum/index.ts +36 -0
- package/src/web3/index.ts +15 -0
- package/src/web3/solana/index.ts +104 -0
- package/src/web3/tron/index.ts +57 -0
- package/tsconfig.app.json +31 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +29 -0
- package/vite.config.ts +31 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import React, { useCallback, useEffect } from "react";
|
|
2
|
+
import {
|
|
3
|
+
Flex,
|
|
4
|
+
useDisclosure,
|
|
5
|
+
ChakraProvider,
|
|
6
|
+
Box,
|
|
7
|
+
Button,
|
|
8
|
+
} from "@chakra-ui/react";
|
|
9
|
+
import Modal, { Body, Content, CloseButton, Header } from "../Modal";
|
|
10
|
+
import theme from "../../theme";
|
|
11
|
+
import { walletList } from "../../config/wallets";
|
|
12
|
+
import { Img, LeftBox, LeftDesc, RightBox, Title, WalletName } from "./styles";
|
|
13
|
+
import {
|
|
14
|
+
isLuffa,
|
|
15
|
+
isLuffaMiniProgramWebview,
|
|
16
|
+
} from "@luffalab/luffa-endless-sdk";
|
|
17
|
+
import { WalletEndNameEnum, WalletLink, WalletType } from "../../types/type";
|
|
18
|
+
import useConnectStore from "../../store/connectStore";
|
|
19
|
+
import { UserResponseStatus } from "@endlesslab/endless-web3-sdk";
|
|
20
|
+
import { getPublicKey } from "../../web3/solana";
|
|
21
|
+
import { getAddress } from "../../web3/tron";
|
|
22
|
+
import { useIsMobile } from "../../hooks/useIsMobile";
|
|
23
|
+
import { useSyncProviders } from "../../hooks/useSyncProvider";
|
|
24
|
+
import { handleEvmConnect } from "../../web3/ethereum";
|
|
25
|
+
|
|
26
|
+
export interface IConnectModal {
|
|
27
|
+
remove: () => void;
|
|
28
|
+
logo: string;
|
|
29
|
+
chain: string;
|
|
30
|
+
walletType: WalletType;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const ConnectModal: React.FC<IConnectModal> = ({
|
|
34
|
+
remove,
|
|
35
|
+
logo,
|
|
36
|
+
chain,
|
|
37
|
+
walletType,
|
|
38
|
+
}) => {
|
|
39
|
+
const { isOpen, onOpen, onClose } = useDisclosure();
|
|
40
|
+
const isMobile = useIsMobile();
|
|
41
|
+
const providers = useSyncProviders();
|
|
42
|
+
const {
|
|
43
|
+
jssdk,
|
|
44
|
+
updateAddress,
|
|
45
|
+
updateWalletName,
|
|
46
|
+
setChain,
|
|
47
|
+
updateWalletIcon,
|
|
48
|
+
updateWalletType,
|
|
49
|
+
} = useConnectStore();
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
onOpen();
|
|
52
|
+
}, []);
|
|
53
|
+
|
|
54
|
+
const _onClose = async () => {
|
|
55
|
+
onClose();
|
|
56
|
+
remove();
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const isDisabled = useCallback(
|
|
60
|
+
(chains: string[]) => {
|
|
61
|
+
return (
|
|
62
|
+
!!chain && chain !== "0x1" && !chains.includes(chain.split(":")[0])
|
|
63
|
+
);
|
|
64
|
+
},
|
|
65
|
+
[chain],
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const connectHandle = async (type: WalletType, name: string, img: string) => {
|
|
69
|
+
updateWalletName(name);
|
|
70
|
+
if (
|
|
71
|
+
(type === WalletType.ENDLESS ||
|
|
72
|
+
(type === WalletType.LUFFA &&
|
|
73
|
+
(isLuffa() || isLuffaMiniProgramWebview()))) &&
|
|
74
|
+
jssdk
|
|
75
|
+
) {
|
|
76
|
+
const connectRes = await jssdk.connect();
|
|
77
|
+
if (connectRes.status === UserResponseStatus.APPROVED) {
|
|
78
|
+
const walletAddress = connectRes.args.account;
|
|
79
|
+
updateAddress(walletAddress);
|
|
80
|
+
updateWalletType(WalletType.ENDLESS);
|
|
81
|
+
updateWalletIcon(img);
|
|
82
|
+
const chainArg = await jssdk.getNetwork();
|
|
83
|
+
if (chainArg.status === UserResponseStatus.APPROVED && chainArg.args) {
|
|
84
|
+
setChain(chainArg.args.chainId.toString());
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await updateWalletType(type);
|
|
88
|
+
onClose();
|
|
89
|
+
} else if (
|
|
90
|
+
type === WalletType.LUFFA &&
|
|
91
|
+
!isLuffa() &&
|
|
92
|
+
!isLuffaMiniProgramWebview()
|
|
93
|
+
) {
|
|
94
|
+
const linkUrl = window.location.href;
|
|
95
|
+
// showQrCodeModal(linkUrl);
|
|
96
|
+
return onClose();
|
|
97
|
+
} else if (type === WalletType.PHANTOM) {
|
|
98
|
+
await updateWalletType(type);
|
|
99
|
+
getPublicKey(img);
|
|
100
|
+
onClose();
|
|
101
|
+
} else if (type === WalletType.TRONLINK) {
|
|
102
|
+
await updateWalletType(type);
|
|
103
|
+
getAddress(img);
|
|
104
|
+
onClose();
|
|
105
|
+
} else {
|
|
106
|
+
await updateWalletType(type);
|
|
107
|
+
const currentType = type as unknown as keyof typeof WalletType;
|
|
108
|
+
const method = WalletType[currentType];
|
|
109
|
+
const curProvider = providers.find((wallet) => wallet.info.name === name);
|
|
110
|
+
|
|
111
|
+
if (isMobile && !window.ethereum) {
|
|
112
|
+
if (name === WalletEndNameEnum.OKX) {
|
|
113
|
+
const currentURl = window.location.href;
|
|
114
|
+
return (window.location.href =
|
|
115
|
+
"https://www.okx.com/download?deeplink=" +
|
|
116
|
+
encodeURIComponent(
|
|
117
|
+
"okx://wallet/dapp/url?dappUrl=" + encodeURIComponent(currentURl),
|
|
118
|
+
));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (name === WalletEndNameEnum.BITGET) {
|
|
122
|
+
const currentURl = window.location.href;
|
|
123
|
+
const url = `https://bkcode.vip?action=dapp&url=${encodeURIComponent(currentURl)}`;
|
|
124
|
+
return (window.location.href = url);
|
|
125
|
+
}
|
|
126
|
+
if (name === WalletEndNameEnum.METAMASK) {
|
|
127
|
+
const currentURl = window.location.href;
|
|
128
|
+
window.location.href = `https://metamask.app.link/dapp/${currentURl}`;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (name === WalletEndNameEnum.COINBASE) {
|
|
132
|
+
const currentURl = window.location.href;
|
|
133
|
+
const isAndroid = /Android/i.test(navigator.userAgent);
|
|
134
|
+
const url = isAndroid
|
|
135
|
+
? `cbwallet://dapp?url=${encodeURIComponent(currentURl)}`
|
|
136
|
+
: `https://go.cb-w.com/dapp?cb_url=${encodeURIComponent(currentURl)}`;
|
|
137
|
+
window.location.href = url;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (curProvider) {
|
|
141
|
+
handleEvmConnect(curProvider, img);
|
|
142
|
+
} else {
|
|
143
|
+
window.open(
|
|
144
|
+
WalletLink[method as unknown as keyof typeof WalletLink],
|
|
145
|
+
"_blank",
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
onClose();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
<ChakraProvider theme={theme}>
|
|
154
|
+
<Modal isOpen={isOpen} onClose={_onClose}>
|
|
155
|
+
<Content
|
|
156
|
+
w={{ sm: "100%", xl: "800px" }}
|
|
157
|
+
maxW={{ sm: "100%", xl: "700px" }}
|
|
158
|
+
color="a4"
|
|
159
|
+
>
|
|
160
|
+
<CloseButton top="10px" right="10px" />
|
|
161
|
+
<Header borderBottom="none" fontSize="18px">
|
|
162
|
+
Connect Wallet
|
|
163
|
+
</Header>
|
|
164
|
+
<Body maxH="600px">
|
|
165
|
+
<Flex flexDir="column" w="100%" gap="12px">
|
|
166
|
+
<Flex hideBelow="xl" p={{ sm: "0.2rem 0.1rem", xl: "0px 0px" }}>
|
|
167
|
+
<LeftBox>
|
|
168
|
+
<Img src={logo} boxSize="36px" />
|
|
169
|
+
<Title>Connect Wallet</Title>
|
|
170
|
+
<LeftDesc>
|
|
171
|
+
Please select a wallet to link, and keep your private key
|
|
172
|
+
and seed phrase safe.
|
|
173
|
+
</LeftDesc>
|
|
174
|
+
</LeftBox>
|
|
175
|
+
<RightBox>
|
|
176
|
+
<Title mt="4px">Popular</Title>
|
|
177
|
+
<Box
|
|
178
|
+
mt="14px"
|
|
179
|
+
display="flex"
|
|
180
|
+
alignItems="center"
|
|
181
|
+
flexWrap="wrap"
|
|
182
|
+
>
|
|
183
|
+
{walletList
|
|
184
|
+
.filter((item) =>
|
|
185
|
+
isLuffa() || isLuffaMiniProgramWebview()
|
|
186
|
+
? item.walletName !== WalletEndNameEnum.ENDLESS &&
|
|
187
|
+
item.show
|
|
188
|
+
: item.show,
|
|
189
|
+
)
|
|
190
|
+
.map((item, index) => {
|
|
191
|
+
return item.type === walletType ? (
|
|
192
|
+
<Button
|
|
193
|
+
justifyContent="flex-start"
|
|
194
|
+
textAlign="left"
|
|
195
|
+
key={item.type}
|
|
196
|
+
w="205px"
|
|
197
|
+
color="#000"
|
|
198
|
+
h="48px"
|
|
199
|
+
ml={(index + 2) % 2 !== 0 ? "16px" : "0px"}
|
|
200
|
+
mt={index > 1 ? "16px" : "0px"}
|
|
201
|
+
bg="#F5F5F5"
|
|
202
|
+
border="1px solid #E5E5E5"
|
|
203
|
+
onClick={() => {
|
|
204
|
+
connectHandle(
|
|
205
|
+
item.type,
|
|
206
|
+
item.walletName,
|
|
207
|
+
item.imgUrl,
|
|
208
|
+
);
|
|
209
|
+
}}
|
|
210
|
+
isDisabled={isDisabled(item.chains)}
|
|
211
|
+
_hover={{
|
|
212
|
+
bg: "#F5F5F5",
|
|
213
|
+
border: "1px solid #222",
|
|
214
|
+
}}
|
|
215
|
+
>
|
|
216
|
+
{item.img}
|
|
217
|
+
<WalletName ml="12px">{item.walletName}</WalletName>
|
|
218
|
+
</Button>
|
|
219
|
+
) : (
|
|
220
|
+
<Button
|
|
221
|
+
color="#000"
|
|
222
|
+
w="205px"
|
|
223
|
+
bg="#F5F5F5"
|
|
224
|
+
border="1px solid #E5E5E5"
|
|
225
|
+
key={item.type}
|
|
226
|
+
h="48px"
|
|
227
|
+
mt={index > 1 ? "16px" : "0px"}
|
|
228
|
+
ml={(index + 2) % 2 !== 0 ? "16px" : "0px"}
|
|
229
|
+
justifyContent="flex-start"
|
|
230
|
+
_hover={{
|
|
231
|
+
bg: "#F5F5F5",
|
|
232
|
+
border: "1px solid #222",
|
|
233
|
+
}}
|
|
234
|
+
onClick={() => {
|
|
235
|
+
if (item.type === WalletType.ENDLESS) {
|
|
236
|
+
_onClose();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
connectHandle(
|
|
240
|
+
item.type,
|
|
241
|
+
item.walletName,
|
|
242
|
+
item.imgUrl,
|
|
243
|
+
);
|
|
244
|
+
}}
|
|
245
|
+
isDisabled={isDisabled(item.chains)}
|
|
246
|
+
>
|
|
247
|
+
{item.img}
|
|
248
|
+
<WalletName ml="12px">{item.walletName}</WalletName>
|
|
249
|
+
</Button>
|
|
250
|
+
);
|
|
251
|
+
})}
|
|
252
|
+
</Box>
|
|
253
|
+
</RightBox>
|
|
254
|
+
</Flex>
|
|
255
|
+
</Flex>
|
|
256
|
+
</Body>
|
|
257
|
+
</Content>
|
|
258
|
+
</Modal>
|
|
259
|
+
</ChakraProvider>
|
|
260
|
+
);
|
|
261
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createRoot } from "react-dom/client";
|
|
2
|
+
import { ConnectModal, type IConnectModal } from "./modal";
|
|
3
|
+
|
|
4
|
+
export const showDetailModal = (props?: Omit<IConnectModal, "remove">) => {
|
|
5
|
+
const domNode = document.createElement("div");
|
|
6
|
+
document.body.append(domNode);
|
|
7
|
+
|
|
8
|
+
const root = createRoot(domNode);
|
|
9
|
+
|
|
10
|
+
const remove = () => {
|
|
11
|
+
root.unmount();
|
|
12
|
+
domNode.remove();
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
root.render(<ConnectModal remove={remove} {...(props as any)} />);
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
remove,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Box, chakra } from "@chakra-ui/react";
|
|
2
|
+
|
|
3
|
+
export const LeftBox = chakra(Box, {
|
|
4
|
+
baseStyle: {
|
|
5
|
+
p: '24px',
|
|
6
|
+
bg: '#000',
|
|
7
|
+
h: '400px',
|
|
8
|
+
w: '234px',
|
|
9
|
+
},
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
export const WalletName = chakra(Box, {
|
|
13
|
+
baseStyle: {
|
|
14
|
+
fontSize: '14px',
|
|
15
|
+
fontWeight: '600',
|
|
16
|
+
lineHeight: '14px' /* 16px */,
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
export const RightBox = chakra(Box, {
|
|
21
|
+
baseStyle: {
|
|
22
|
+
p: '24px',
|
|
23
|
+
w: '600px',
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
export const Title = chakra(Box, {
|
|
28
|
+
baseStyle: {
|
|
29
|
+
fontSize: '16px',
|
|
30
|
+
fontWeight: '600',
|
|
31
|
+
lineHeight: '16px' /* 16px */,
|
|
32
|
+
mt: '24px',
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
export const LeftDesc = chakra(Box, {
|
|
37
|
+
baseStyle: {
|
|
38
|
+
color: '#999',
|
|
39
|
+
fontSize: '12px',
|
|
40
|
+
fontWeight: '500',
|
|
41
|
+
lineHeight: '1.4em' /* 16px */,
|
|
42
|
+
mt: '8px',
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
export const Img = chakra('img')
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
type ChakraProps,
|
|
4
|
+
Modal as ChakraModal,
|
|
5
|
+
ModalOverlay,
|
|
6
|
+
ModalContent,
|
|
7
|
+
ModalHeader,
|
|
8
|
+
ModalCloseButton,
|
|
9
|
+
ModalBody,
|
|
10
|
+
ModalFooter,
|
|
11
|
+
Drawer,
|
|
12
|
+
DrawerOverlay,
|
|
13
|
+
DrawerHeader,
|
|
14
|
+
DrawerCloseButton,
|
|
15
|
+
DrawerContent,
|
|
16
|
+
DrawerBody,
|
|
17
|
+
DrawerFooter,
|
|
18
|
+
type ModalProps as ChakraModalProps,
|
|
19
|
+
type DrawerProps as ChakraDrawerProps,
|
|
20
|
+
type DrawerProps,
|
|
21
|
+
type ModalBodyProps,
|
|
22
|
+
} from '@chakra-ui/react'
|
|
23
|
+
import { useIsMobile } from '../hooks/useIsMobile'
|
|
24
|
+
import ModalContextProvider, { useModalContext } from '../contexts/Modal'
|
|
25
|
+
|
|
26
|
+
interface ModalProps {
|
|
27
|
+
isOpen: boolean
|
|
28
|
+
isModal?: boolean
|
|
29
|
+
variant?: string
|
|
30
|
+
onClose: () => void
|
|
31
|
+
children: React.ReactNode
|
|
32
|
+
}
|
|
33
|
+
const Modal = (props: ModalProps & ChakraModalProps & ChakraDrawerProps & DrawerProps) => {
|
|
34
|
+
const { isModal = false, variant = 'base', isOpen, onClose, children, ...rest } = props
|
|
35
|
+
const isMobile = useIsMobile()
|
|
36
|
+
const _isModal = isModal || !isMobile
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<ModalContextProvider isModal={_isModal}>
|
|
40
|
+
{_isModal ? (
|
|
41
|
+
<ChakraModal
|
|
42
|
+
variant={variant}
|
|
43
|
+
trapFocus={false}
|
|
44
|
+
isOpen={isOpen}
|
|
45
|
+
onClose={onClose}
|
|
46
|
+
autoFocus={false}
|
|
47
|
+
isCentered
|
|
48
|
+
{...rest}
|
|
49
|
+
>
|
|
50
|
+
<ModalOverlay />
|
|
51
|
+
{children}
|
|
52
|
+
</ChakraModal>
|
|
53
|
+
) : (
|
|
54
|
+
<Drawer
|
|
55
|
+
variant={variant}
|
|
56
|
+
trapFocus={false}
|
|
57
|
+
placement="bottom"
|
|
58
|
+
onClose={onClose}
|
|
59
|
+
isOpen={isOpen}
|
|
60
|
+
autoFocus={false}
|
|
61
|
+
{...rest}
|
|
62
|
+
>
|
|
63
|
+
<DrawerOverlay />
|
|
64
|
+
{children}
|
|
65
|
+
</Drawer>
|
|
66
|
+
)}
|
|
67
|
+
</ModalContextProvider>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
interface Props {
|
|
72
|
+
children: React.ReactNode
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const Content = (props: Props & ChakraProps) => {
|
|
76
|
+
const { children, ...rest } = props
|
|
77
|
+
const { isModal } = useModalContext()
|
|
78
|
+
|
|
79
|
+
// const [show, setShow] = useState(false)
|
|
80
|
+
// useEffect(() => {
|
|
81
|
+
// const timer = setTimeout(() => {
|
|
82
|
+
// setShow(true)
|
|
83
|
+
// }, 0)
|
|
84
|
+
|
|
85
|
+
// return () => clearTimeout(timer)
|
|
86
|
+
// }, [isModal])
|
|
87
|
+
|
|
88
|
+
// if (!show) return null
|
|
89
|
+
|
|
90
|
+
return isModal ? (
|
|
91
|
+
<ModalContent {...rest}>{children}</ModalContent>
|
|
92
|
+
) : (
|
|
93
|
+
<DrawerContent minH="70vh" {...rest}>
|
|
94
|
+
{children}
|
|
95
|
+
</DrawerContent>
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export const Header = (props: Props & ChakraProps) => {
|
|
100
|
+
const { children, ...rest } = props
|
|
101
|
+
const { isModal } = useModalContext()
|
|
102
|
+
return isModal ? <ModalHeader {...rest}>{children}</ModalHeader> : <DrawerHeader {...rest}>{children}</DrawerHeader>
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const Body = (props: Props & ChakraProps & ModalBodyProps) => {
|
|
106
|
+
const { children, ...rest } = props
|
|
107
|
+
const { isModal } = useModalContext()
|
|
108
|
+
return isModal ? <ModalBody {...rest}>{children}</ModalBody> : <DrawerBody {...rest}>{children}</DrawerBody>
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export const Footer = (props: Props & ChakraProps) => {
|
|
112
|
+
const { children, ...rest } = props
|
|
113
|
+
const { isModal } = useModalContext()
|
|
114
|
+
return isModal ? <ModalFooter {...rest}>{children}</ModalFooter> : <DrawerFooter {...rest}>{children}</DrawerFooter>
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export const CloseButton = (props: ChakraProps) => {
|
|
118
|
+
const { isModal } = useModalContext()
|
|
119
|
+
return isModal ? <ModalCloseButton {...props} /> : <DrawerCloseButton {...props} />
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default React.memo(Modal)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import Luffa from '../assets/wallet/luffa.png'
|
|
3
|
+
import Endless from '../assets/wallet/endless.png'
|
|
4
|
+
import Metamask from '../assets/wallet/metamask.png'
|
|
5
|
+
import okx from '../assets/wallet/okx.png'
|
|
6
|
+
import tron from '../assets/wallet/tron.png'
|
|
7
|
+
import phantom from '../assets/wallet/phantom.png'
|
|
8
|
+
import bitget from '../assets/wallet/bitget.png'
|
|
9
|
+
import coinbase from '../assets/wallet/coinbase.png'
|
|
10
|
+
import walletconnect from '../assets/wallet/walletConnect.png'
|
|
11
|
+
import { WalletEndNameEnum, WalletType } from '../types/type'
|
|
12
|
+
import { chakra } from '@chakra-ui/react'
|
|
13
|
+
|
|
14
|
+
const Img = chakra('img')
|
|
15
|
+
|
|
16
|
+
export const walletList = [
|
|
17
|
+
{
|
|
18
|
+
walletName: WalletEndNameEnum.ENDLESS,
|
|
19
|
+
type: WalletType.ENDLESS,
|
|
20
|
+
chains: ['endless', 'eds'],
|
|
21
|
+
token_symbol: 'Endless-',
|
|
22
|
+
imgUrl: Endless,
|
|
23
|
+
img: React.createElement(Img, { src: Endless, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
24
|
+
show: true,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
walletName: WalletEndNameEnum.LUFFA,
|
|
28
|
+
type: WalletType.LUFFA,
|
|
29
|
+
chains: ['endless', 'eds'],
|
|
30
|
+
token_symbol: 'Endless-',
|
|
31
|
+
imgUrl: Luffa,
|
|
32
|
+
img: React.createElement(Img, { src: Luffa, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
33
|
+
show: true,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
walletName: WalletEndNameEnum.METAMASK,
|
|
37
|
+
type: WalletType.METAMASK,
|
|
38
|
+
token_symbol: 'Ethereum-',
|
|
39
|
+
chains: ['eip155'],
|
|
40
|
+
imgUrl: Metamask,
|
|
41
|
+
img: React.createElement(Img, { src: Metamask, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
42
|
+
show: true,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
walletName: WalletEndNameEnum.PHANTOM,
|
|
46
|
+
type: WalletType.PHANTOM,
|
|
47
|
+
chains: ['solana'],
|
|
48
|
+
token_symbol: 'Solana-',
|
|
49
|
+
imgUrl: phantom,
|
|
50
|
+
img: React.createElement(Img, { src: phantom, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
51
|
+
show: true,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
walletName: WalletEndNameEnum.OKX,
|
|
55
|
+
type: WalletType.OKX,
|
|
56
|
+
token_symbol: 'Ethereum-',
|
|
57
|
+
chains: ['eip155'],
|
|
58
|
+
imgUrl: okx,
|
|
59
|
+
img: React.createElement(Img, { src: okx, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
60
|
+
show: true,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
walletName: WalletEndNameEnum.TRONLINK,
|
|
64
|
+
type: WalletType.TRONLINK,
|
|
65
|
+
token_symbol: 'Tron-',
|
|
66
|
+
chains: ['tron'],
|
|
67
|
+
imgUrl: tron,
|
|
68
|
+
img: React.createElement(Img, { src: tron, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
69
|
+
show: true,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
walletName: WalletEndNameEnum.WC,
|
|
73
|
+
type: WalletType.WC,
|
|
74
|
+
token_symbol: 'Ethereum-',
|
|
75
|
+
chains: ['eip155'],
|
|
76
|
+
imgUrl: walletconnect,
|
|
77
|
+
img: React.createElement(Img, { src: walletconnect, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
78
|
+
show: true,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
walletName: WalletEndNameEnum.COINBASE,
|
|
82
|
+
type: WalletType.COINBASE,
|
|
83
|
+
token_symbol: 'Ethereum-',
|
|
84
|
+
chains: ['eip155'],
|
|
85
|
+
imgUrl: coinbase,
|
|
86
|
+
img: React.createElement(Img, { src: coinbase, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
87
|
+
show: true,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
walletName: WalletEndNameEnum.BITGET,
|
|
91
|
+
type: WalletType.BITGET,
|
|
92
|
+
chains: ['eip155'],
|
|
93
|
+
token_symbol: 'Ethereum-',
|
|
94
|
+
imgUrl: bitget,
|
|
95
|
+
img: React.createElement(Img, { src: bitget, boxSize: { sm: '.29rem', xl: '24px' }, borderRadius: '50%' }),
|
|
96
|
+
show: true,
|
|
97
|
+
},
|
|
98
|
+
]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React, { createContext, useContext } from 'react'
|
|
2
|
+
|
|
3
|
+
interface ModalContextProps {
|
|
4
|
+
isModal: boolean
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const ModalContext = createContext<ModalContextProps>(null!)
|
|
8
|
+
|
|
9
|
+
interface ModalContextProviderProps {
|
|
10
|
+
children: React.ReactNode
|
|
11
|
+
isModal: boolean
|
|
12
|
+
}
|
|
13
|
+
const ModalContextProvider: React.FC<ModalContextProviderProps> = ({ children, isModal }) => {
|
|
14
|
+
return (
|
|
15
|
+
<ModalContext.Provider
|
|
16
|
+
value={{
|
|
17
|
+
isModal,
|
|
18
|
+
}}
|
|
19
|
+
>
|
|
20
|
+
{children}
|
|
21
|
+
</ModalContext.Provider>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function useModalContext() {
|
|
26
|
+
const ctx = useContext(ModalContext)
|
|
27
|
+
if (ctx === undefined) {
|
|
28
|
+
throw new Error('useModalContext must be used within ModalContextProviderƒ')
|
|
29
|
+
}
|
|
30
|
+
return ctx
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default ModalContextProvider
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React, { createContext, useContext } from 'react'
|
|
2
|
+
|
|
3
|
+
interface ModalContextProviderProps {
|
|
4
|
+
children: React.ReactNode
|
|
5
|
+
list: any[]
|
|
6
|
+
isLoading: boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const TablesContext = createContext<Omit<ModalContextProviderProps, 'children'>>(null!)
|
|
10
|
+
|
|
11
|
+
const TablesContextProvider: React.FC<ModalContextProviderProps> = ({ children, list, isLoading }) => {
|
|
12
|
+
return (
|
|
13
|
+
<TablesContext.Provider
|
|
14
|
+
value={{
|
|
15
|
+
list,
|
|
16
|
+
isLoading,
|
|
17
|
+
}}
|
|
18
|
+
>
|
|
19
|
+
{children}
|
|
20
|
+
</TablesContext.Provider>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function useTablesContext() {
|
|
25
|
+
const ctx = useContext(TablesContext)
|
|
26
|
+
if (ctx === undefined) {
|
|
27
|
+
throw new Error('useTablesContext must be used within TablesContextProvider')
|
|
28
|
+
}
|
|
29
|
+
return ctx
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default TablesContextProvider
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { EIP6963ProviderDetail, EIP6963AnnounceProviderEvent } from "../types/type"
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
interface WindowEventMap {
|
|
5
|
+
'eip6963:announceProvider': CustomEvent
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// An array to store the detected wallet providers.
|
|
10
|
+
let providers: EIP6963ProviderDetail[] = []
|
|
11
|
+
|
|
12
|
+
export const store = {
|
|
13
|
+
value: () => providers,
|
|
14
|
+
subscribe: (callback: () => void) => {
|
|
15
|
+
function onAnnouncement(event: EIP6963AnnounceProviderEvent) {
|
|
16
|
+
if (providers.map((p) => p.info.uuid).includes(event.detail.info.uuid)) return
|
|
17
|
+
providers = [...providers, event.detail]
|
|
18
|
+
callback()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Listen for eip6963:announceProvider and call onAnnouncement when the event is triggered.
|
|
22
|
+
window.addEventListener('eip6963:announceProvider', onAnnouncement)
|
|
23
|
+
|
|
24
|
+
// Dispatch the event, which triggers the event listener in the MetaMask wallet.
|
|
25
|
+
window.dispatchEvent(new Event('eip6963:requestProvider'))
|
|
26
|
+
|
|
27
|
+
// Return a function that removes the event listern.
|
|
28
|
+
return () => window.removeEventListener('eip6963:announceProvider', onAnnouncement)
|
|
29
|
+
},
|
|
30
|
+
}
|