import AnalyticsProvider, { initializeAnalytics, } from 'components/AnalyticsProvider' initializeAnalytics() import ErrorTrackingProvider from 'components/ErrorTrackingProvider' import '/styles/globals.css' import 'react-responsive-modal/styles.css' import { globalCss } from 'stitches.config'; import { JetBrains_Mono, Noto_Sans } from '@next/font/google' import type { AppContext, AppProps } from 'next/app' import { default as NextApp } from 'next/app' import { ThemeProvider, useTheme } from 'next-themes' import { darkTheme, globalReset } from 'stitches.config' import '@rainbow-me/rainbowkit/styles.css' import { RainbowKitProvider, getDefaultWallets, darkTheme as rainbowDarkTheme, lightTheme as rainbowLightTheme, } from '@rainbow-me/rainbowkit' import { WagmiConfig, createConfig, configureChains } from 'wagmi' import * as Tooltip from '@radix-ui/react-tooltip' import { publicProvider } from 'wagmi/providers/public' import { alchemyProvider } from 'wagmi/providers/alchemy' import { ReservoirKitProvider, darkTheme as reservoirDarkTheme, lightTheme as reservoirLightTheme, ReservoirKitTheme, CartProvider, } from '@reservoir0x/reservoir-kit-ui' import { FC, useContext, useEffect, useState } from 'react' import { HotkeysProvider } from 'react-hotkeys-hook' import ToastContextProvider from 'context/ToastContextProvider' import supportedChains from 'utils/chains' import { useMarketplaceChain } from 'hooks' import ChainContextProvider from 'context/ChainContextProvider' import { WebsocketContextProvider } from 'context/WebsocketContextProvider' import ReferralContextProvider, { ReferralContext, } from 'context/ReferralContextProvider' import { chainPaymentTokensMap } from 'utils/paymentTokens' //CONFIGURABLE: Use nextjs to load your own custom font: https://nextjs.org/docs/basic-features/font-optimization const notoSans = JetBrains_Mono({ subsets: ['latin'], weight: '400', style: 'normal', }) export const NORMALIZE_ROYALTIES = process.env.NEXT_PUBLIC_NORMALIZE_ROYALTIES ? process.env.NEXT_PUBLIC_NORMALIZE_ROYALTIES === 'true' : false const WALLET_CONNECT_PROJECT_ID = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID || 'ba6ad5e684eb7860b86fe7c710a53f9b' const { chains, publicClient } = configureChains(supportedChains, [ alchemyProvider({ apiKey: 'pU8La4a61LOjz00p1QuTyeVtfy_YP9VI'}), publicProvider(), ]) const { connectors } = getDefaultWallets({ appName: 'NFT Explorer', projectId: WALLET_CONNECT_PROJECT_ID, chains, }) const wagmiClient = createConfig({ autoConnect: true, connectors, publicClient, }) //CONFIGURABLE: Here you can override // any of the theme tokens provided by RK: https://docs.reservoir.tools/docs/reservoirkit-ui-theming-and-customization const reservoirKitThemeOverrides = { headlineFont: notoSans.style.fontFamily, font: notoSans.style.fontFamily, primaryColor: '#39ad35', primaryHoverColor: '#5ae779', } function AppWrapper(props: AppProps & { baseUrl: string }) { return ( ) } function MyApp({ Component, pageProps, baseUrl, }: AppProps & { baseUrl: string }) { globalReset() const { theme } = useTheme() const marketplaceChain = useMarketplaceChain() const [reservoirKitTheme, setReservoirKitTheme] = useState< ReservoirKitTheme | undefined >() const [rainbowKitTheme, setRainbowKitTheme] = useState< | ReturnType | ReturnType | undefined >() useEffect(() => { if (theme == 'dark') { setReservoirKitTheme(reservoirDarkTheme(reservoirKitThemeOverrides)) setRainbowKitTheme( rainbowDarkTheme({ borderRadius: 'small', }) ) } else { setReservoirKitTheme(reservoirLightTheme(reservoirKitThemeOverrides)) setRainbowKitTheme( rainbowLightTheme({ borderRadius: 'small', }) ) } }, [theme]) const { feesOnTop } = useContext(ReferralContext) const FunctionalComponent = Component as FC let source = process.env.NEXT_PUBLIC_MARKETPLACE_SOURCE if (!source && process.env.NEXT_PUBLIC_HOST_URL) { try { const url = new URL(process.env.NEXT_PUBLIC_HOST_URL) source = url.host } catch (e) {} } return ( { return { id, name, baseApiUrl: proxyApi ? `${baseUrl}${proxyApi}` : reservoirBaseUrl, active: marketplaceChain.id === id, checkPollingInterval: checkPollingInterval, paymentTokens: chainPaymentTokensMap[id], } } ), logLevel: 4, source: source, normalizeRoyalties: NORMALIZE_ROYALTIES, //CONFIGURABLE: Set your marketplace fee and recipient, (fee is in BPS) // Note that this impacts orders created on your marketplace (offers/listings) // marketplaceFee: 250, // marketplaceFeeRecipient: "0xabc" disablePoweredByReservoir: true, }} theme={reservoirKitTheme} > ) } AppWrapper.getInitialProps = async (appContext: AppContext) => { // calls page's `getInitialProps` and fills `appProps.pageProps` const appProps = await NextApp.getInitialProps(appContext) let baseUrl = '' if (appContext.ctx.req?.headers.host) { const host = appContext.ctx.req?.headers.host baseUrl = `${host.includes('localhost') ? 'http' : 'https'}://${host}` } else if (process.env.NEXT_PUBLIC_HOST_URL) { baseUrl = process.env.NEXT_PUBLIC_HOST_URL || '' } baseUrl = baseUrl.replace(/\/$/, '') return { ...appProps, baseUrl } } export default AppWrapper