ContextProvider.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { createTheme, StyledEngineProvider, ThemeProvider } from '@mui/material';
  2. import { deepPurple, pink } from '@mui/material/colors';
  3. import { WalletModalProvider as AntDesignWalletModalProvider } from '@solana/wallet-adapter-ant-design';
  4. import type { WalletError } from '@solana/wallet-adapter-base';
  5. import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
  6. import { WalletDialogProvider as MaterialUIWalletDialogProvider } from '@solana/wallet-adapter-material-ui';
  7. import { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react';
  8. import { WalletModalProvider as ReactUIWalletModalProvider } from '@solana/wallet-adapter-react-ui';
  9. import { WalletConnectWalletAdapter } from '@solana/wallet-adapter-walletconnect';
  10. import {
  11. GlowWalletAdapter,
  12. PhantomWalletAdapter,
  13. SlopeWalletAdapter,
  14. SolflareWalletAdapter,
  15. TorusWalletAdapter,
  16. } from '@solana/wallet-adapter-wallets';
  17. import { clusterApiUrl } from '@solana/web3.js';
  18. import { SnackbarProvider, useSnackbar } from 'notistack';
  19. import type { FC, ReactNode } from 'react';
  20. import { useCallback, useMemo } from 'react';
  21. import { AutoConnectProvider, useAutoConnect } from './AutoConnectProvider';
  22. const theme = createTheme({
  23. palette: {
  24. mode: 'dark',
  25. primary: {
  26. main: deepPurple[700],
  27. },
  28. secondary: {
  29. main: pink[700],
  30. },
  31. },
  32. components: {
  33. MuiButtonBase: {
  34. styleOverrides: {
  35. root: {
  36. justifyContent: 'flex-start',
  37. },
  38. },
  39. },
  40. MuiButton: {
  41. styleOverrides: {
  42. root: {
  43. textTransform: 'none',
  44. padding: '12px 16px',
  45. },
  46. startIcon: {
  47. marginRight: 8,
  48. },
  49. endIcon: {
  50. marginLeft: 8,
  51. },
  52. },
  53. },
  54. },
  55. });
  56. const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
  57. const { autoConnect } = useAutoConnect();
  58. // Can be set to 'devnet', 'testnet', or 'mainnet-beta'
  59. const network = WalletAdapterNetwork.Devnet;
  60. // You can also provide a custom RPC endpoint
  61. const endpoint = useMemo(() => clusterApiUrl(network), [network]);
  62. const wallets = useMemo(
  63. () => [
  64. new SolanaMobileWalletAdapter({
  65. appIdentity: { name: 'Solana Wallet Adapter Example App' },
  66. authorizationResultCache: createDefaultAuthorizationResultCache(),
  67. }),
  68. new PhantomWalletAdapter(),
  69. new GlowWalletAdapter(),
  70. new SlopeWalletAdapter(),
  71. new SolflareWalletAdapter({ network }),
  72. new TorusWalletAdapter(),
  73. new WalletConnectWalletAdapter({
  74. network,
  75. options: {
  76. relayUrl: 'wss://relay.walletconnect.com',
  77. // example WC dapp project ID
  78. projectId: 'e899c82be21d4acca2c8aec45e893598',
  79. metadata: {
  80. name: 'Example Dapp',
  81. description: 'Example Dapp',
  82. url: 'https://github.com/solana-labs/wallet-adapter',
  83. icons: ['https://avatars.githubusercontent.com/u/35608259?s=200'],
  84. },
  85. },
  86. }),
  87. ],
  88. []
  89. );
  90. const { enqueueSnackbar } = useSnackbar();
  91. const onError = useCallback(
  92. (error: WalletError) => {
  93. enqueueSnackbar(error.message ? `${error.name}: ${error.message}` : error.name, { variant: 'error' });
  94. console.error(error);
  95. },
  96. [enqueueSnackbar]
  97. );
  98. return (
  99. <ConnectionProvider endpoint={endpoint}>
  100. <WalletProvider wallets={wallets} onError={onError} autoConnect={autoConnect}>
  101. <MaterialUIWalletDialogProvider>
  102. <AntDesignWalletModalProvider>
  103. <ReactUIWalletModalProvider>{children}</ReactUIWalletModalProvider>
  104. </AntDesignWalletModalProvider>
  105. </MaterialUIWalletDialogProvider>
  106. </WalletProvider>
  107. </ConnectionProvider>
  108. );
  109. };
  110. export const ContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
  111. return (
  112. <StyledEngineProvider injectFirst>
  113. <ThemeProvider theme={theme}>
  114. <SnackbarProvider>
  115. <AutoConnectProvider>
  116. <WalletContextProvider>{children}</WalletContextProvider>
  117. </AutoConnectProvider>
  118. </SnackbarProvider>
  119. </ThemeProvider>
  120. </StyledEngineProvider>
  121. );
  122. };