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