ContextProvider.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 { FakeWalletAdapter } from '@solana/wallet-adapter-wallets';
  10. import { clusterApiUrl } from '@solana/web3.js';
  11. import { SnackbarProvider, useSnackbar } from 'notistack';
  12. import type { FC, ReactNode } from 'react';
  13. import { useCallback, useMemo } from 'react';
  14. import { AutoConnectProvider, useAutoConnect } from './AutoConnectProvider';
  15. const theme = createTheme({
  16. palette: {
  17. mode: 'dark',
  18. primary: {
  19. main: deepPurple[700],
  20. },
  21. secondary: {
  22. main: pink[700],
  23. },
  24. },
  25. components: {
  26. MuiButtonBase: {
  27. styleOverrides: {
  28. root: {
  29. justifyContent: 'flex-start',
  30. },
  31. },
  32. },
  33. MuiButton: {
  34. styleOverrides: {
  35. root: {
  36. textTransform: 'none',
  37. padding: '12px 16px',
  38. },
  39. startIcon: {
  40. marginRight: 8,
  41. },
  42. endIcon: {
  43. marginLeft: 8,
  44. },
  45. },
  46. },
  47. },
  48. });
  49. const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
  50. const { autoConnect } = useAutoConnect();
  51. // Can be set to 'devnet', 'testnet', or 'mainnet-beta'
  52. const network = WalletAdapterNetwork.Devnet;
  53. // You can also provide a custom RPC endpoint
  54. const endpoint = useMemo(() => clusterApiUrl(network), [network]);
  55. const wallets = useMemo(
  56. () => [
  57. /**
  58. * Select the wallets you wish to support, by instantiating wallet adapters here.
  59. *
  60. * Common adapters can be found in the npm package `@solana/wallet-adapter-wallets`.
  61. * That package supports tree shaking and lazy loading -- only the wallets you import
  62. * will be compiled into your application, and only the dependencies of wallets that
  63. * your users connect to will be loaded.
  64. */
  65. new FakeWalletAdapter(),
  66. ],
  67. []
  68. );
  69. const { enqueueSnackbar } = useSnackbar();
  70. const onError = useCallback(
  71. (error: WalletError) => {
  72. enqueueSnackbar(error.message ? `${error.name}: ${error.message}` : error.name, { variant: 'error' });
  73. console.error(error);
  74. },
  75. [enqueueSnackbar]
  76. );
  77. return (
  78. <ConnectionProvider endpoint={endpoint}>
  79. <WalletProvider wallets={wallets} onError={onError} autoConnect={autoConnect}>
  80. <MaterialUIWalletDialogProvider>
  81. <AntDesignWalletModalProvider>
  82. <ReactUIWalletModalProvider>{children}</ReactUIWalletModalProvider>
  83. </AntDesignWalletModalProvider>
  84. </MaterialUIWalletDialogProvider>
  85. </WalletProvider>
  86. </ConnectionProvider>
  87. );
  88. };
  89. export const ContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
  90. return (
  91. <StyledEngineProvider injectFirst>
  92. <ThemeProvider theme={theme}>
  93. <SnackbarProvider>
  94. <AutoConnectProvider>
  95. <WalletContextProvider>{children}</WalletContextProvider>
  96. </AutoConnectProvider>
  97. </SnackbarProvider>
  98. </ThemeProvider>
  99. </StyledEngineProvider>
  100. );
  101. };