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.
Files changed (70) hide show
  1. package/README.md +75 -0
  2. package/eslint.config.js +23 -0
  3. package/index.html +13 -0
  4. package/package.json +61 -0
  5. package/public/favicon.svg +1 -0
  6. package/public/icons.svg +24 -0
  7. package/src/App.css +184 -0
  8. package/src/App.tsx +35 -0
  9. package/src/assets/hero.png +0 -0
  10. package/src/assets/loading.png +0 -0
  11. package/src/assets/react.svg +1 -0
  12. package/src/assets/svg/close.svg +3 -0
  13. package/src/assets/svg/tick.svg +4 -0
  14. package/src/assets/vite.svg +1 -0
  15. package/src/assets/wallet/bitget.png +0 -0
  16. package/src/assets/wallet/coinbase.png +0 -0
  17. package/src/assets/wallet/endless.png +0 -0
  18. package/src/assets/wallet/luffa.png +0 -0
  19. package/src/assets/wallet/metamask.png +0 -0
  20. package/src/assets/wallet/okx.png +0 -0
  21. package/src/assets/wallet/phantom.png +0 -0
  22. package/src/assets/wallet/tron.png +0 -0
  23. package/src/assets/wallet/walletConnect.png +0 -0
  24. package/src/components/Button/index.tsx +9 -0
  25. package/src/components/ConnectModal/index.css +32 -0
  26. package/src/components/ConnectModal/index.tsx +77 -0
  27. package/src/components/ConnectModal/modal.tsx +261 -0
  28. package/src/components/ConnectModal/showConnectModal.tsx +20 -0
  29. package/src/components/ConnectModal/styles.ts +46 -0
  30. package/src/components/Modal.tsx +122 -0
  31. package/src/config/wallets.ts +98 -0
  32. package/src/contexts/Modal.tsx +33 -0
  33. package/src/contexts/Tables.tsx +32 -0
  34. package/src/hooks/store.ts +30 -0
  35. package/src/hooks/useIsMobile.ts +10 -0
  36. package/src/hooks/useSyncProvider.ts +4 -0
  37. package/src/hooks/useToast.tsx +163 -0
  38. package/src/hooks/useWallet.ts +66 -0
  39. package/src/index.css +111 -0
  40. package/src/index.ts +5 -0
  41. package/src/main.tsx +5 -0
  42. package/src/store/connectStore.ts +87 -0
  43. package/src/theme/components/Button.ts +100 -0
  44. package/src/theme/components/Checkbox.tsx +24 -0
  45. package/src/theme/components/Drawer.ts +60 -0
  46. package/src/theme/components/Input.ts +98 -0
  47. package/src/theme/components/Menu.ts +52 -0
  48. package/src/theme/components/Modal.ts +44 -0
  49. package/src/theme/components/NumberInput.ts +54 -0
  50. package/src/theme/components/Popover.ts +72 -0
  51. package/src/theme/components/Progress.ts +41 -0
  52. package/src/theme/components/Radio.tsx +66 -0
  53. package/src/theme/components/Switch.ts +30 -0
  54. package/src/theme/components/Table.ts +149 -0
  55. package/src/theme/components/Tabs.ts +90 -0
  56. package/src/theme/components/Tag.ts +21 -0
  57. package/src/theme/components/Textarea.ts +21 -0
  58. package/src/theme/components/Tooltip.ts +35 -0
  59. package/src/theme/index.ts +269 -0
  60. package/src/types/adapter.d.ts +43 -0
  61. package/src/types/global.d.ts +102 -0
  62. package/src/types/type.ts +100 -0
  63. package/src/web3/ethereum/index.ts +36 -0
  64. package/src/web3/index.ts +15 -0
  65. package/src/web3/solana/index.ts +104 -0
  66. package/src/web3/tron/index.ts +57 -0
  67. package/tsconfig.app.json +31 -0
  68. package/tsconfig.json +7 -0
  69. package/tsconfig.node.json +29 -0
  70. 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
+ }
@@ -0,0 +1,10 @@
1
+ import { useMediaQuery } from '@chakra-ui/react'
2
+
3
+ export const useIsMobile = (): boolean => {
4
+ let [isMobile] = useMediaQuery('(max-width: 890px)', {
5
+ ssr: true,
6
+ fallback: false,
7
+ })
8
+
9
+ return isMobile
10
+ }
@@ -0,0 +1,4 @@
1
+ import { useSyncExternalStore } from 'react'
2
+ import { store } from './store'
3
+
4
+ export const useSyncProviders = () => useSyncExternalStore(store.subscribe, store.value, store.value)