Files
web/apps/base-docs/src/theme/Root.jsx
Brendan from DeFi b6df0ab1cb Feat: Implement Amplitude Experiment infra (#639)
* Added Amplitude Experiments Initialization to initCCA

* create useVariant hook to pull experimental variants

* refactored useVariant to create simpler interface

* linted

* automated defaultDeploymentKey logic

* added defaultDeploymentKey for prod env

* Created ExperimentsContext for web app

* added more specificity to amplitude domains for CSP

* additional properties on eventData

* added amplitude deployment keys to constants

* deleted unused useVariant hook

* refactored experiment initialization in initCCA

* refactored Experiments context

* refactored usage of Experiments provider

* refactored ampDeploymentKey logic

* removed experiment initialization from initCCA

* restored index page to prior state

* refactored initCCA to pull constants into dedicated file

* created Experiments context in base-docs

* implemented experiments context in base-docs Root

* moved Experiments context to libs

* updated Experiments context integration in base-web

* fixed import statement

* deleted unused context in favor of shared version in libs

* implemented shared experiments context

* moved Experiments context to be innermost context provider in base-web

* removed unused imports from initCCA

* refactored Amplitude Experiments package into libs

* fixed yarn issue

* added type declaration for

* refactored window type declaration
2024-07-23 09:18:38 -07:00

227 lines
6.2 KiB
JavaScript

/* eslint-disable */
import '@rainbow-me/rainbowkit/styles.css';
import React, { useState, useEffect, useCallback, useRef } from 'react';
import {
connectorsForWallets,
getDefaultConfig,
RainbowKitProvider,
cssStringFromTheme,
lightTheme,
darkTheme,
Theme,
} from '@rainbow-me/rainbowkit';
import {
coinbaseWallet,
metaMaskWallet,
rainbowWallet,
walletConnectWallet,
} from '@rainbow-me/rainbowkit/wallets';
import { createConfig, WagmiProvider, http } from 'wagmi';
import { baseSepolia } from 'wagmi/chains';
import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
import { Provider as CookieManagerProvider, Region } from '@coinbase/cookie-manager';
import { cookieManagerConfig } from '../utils/cookieManagerConfig';
import { CookieBanner } from '@coinbase/cookie-banner';
import { WalletAvatar } from '../components/WalletAvatar';
import { createClient } from 'viem';
import useSprig from 'base-ui/hooks/useSprig';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import ExperimentsProvider from 'base-ui/contexts/Experiments';
coinbaseWallet.preference = 'all';
const connectors = connectorsForWallets(
[
{
groupName: 'Recommended',
wallets: [coinbaseWallet],
},
{
groupName: 'Others',
wallets: [rainbowWallet, metaMaskWallet, walletConnectWallet],
},
],
{ appName: 'Base Developer Documentation', projectId: '582a2fc8f61e81e0bd0d18b32229595f' },
);
const config = createConfig({
autoConnect: true,
connectors,
chains: [baseSepolia],
client({ chain }) {
return createClient({ chain, transport: http() });
},
ssr: true,
});
const queryClient = new QueryClient();
const cookieBannerTheme = {
colors: {
primary: '#1652F0',
positive: '#05B169',
negative: '#DF5F67',
warning: '#F4C622',
background: '#FFFFFF',
backgroundMuted: '#EEF0F3',
onBackground: '#050F1A',
onBackgroundMuted: '#0A0B0D',
onPrimary: '#FFFFFF',
overlay: 'rgba(17,52,83,0.6)',
},
border: {
border: '1px solid #D8D8D8',
borderRadius: '4px',
},
fontSize: {
sm: '14px',
md: '16px',
},
fontWeight: {
regular: '400',
bold: '500',
},
size: {
xs: '8px',
sm: '16px',
md: '24px',
lg: '32px',
},
breakpoints: {
phone: 560,
desktop: 992,
tablet: 768,
},
zIndex: {
high: 2,
overlay: 1000,
},
};
const customTheme = {
colors: {
accentColor: 'var(--base-docs-color-fg)',
accentColorForeground: 'var(--base-docs-color-bg)',
actionButtonBorder: 'var(--base-docs-color-line-heavy)',
actionButtonBorderMobile: 'var(--base-docs-color-line-heavy)',
actionButtonSecondaryBackground: 'var(--base-docs-color-bg)',
closeButton: 'var(--base-docs-color-fg)',
closeButtonBackground: 'var(--base-docs-color-bg)',
connectionIndicator: 'var(--positive)',
error: 'var(--negative)',
generalBorder: 'var(--base-docs-color-line-heavy)',
generalBorderDim: 'var(--base-docs-color-line)',
modalBackground: 'var(--base-docs-color-fg-negative)',
modalBorder: 'var(--base-docs-color-line-heavy)',
modalText: 'var(--base-docs-color-fg)',
modalTextDim: 'var(--base-docs-color-fg-muted)',
modalTextSecondary: 'var(--base-docs-color-fg-secondary)',
profileAction: 'var(--base-docs-color-bg)',
profileActionHover: 'var(--base-docs-color-bg-alt)',
profileForeground: 'var(--base-docs-color-fg-negative)',
selectedOptionBorder: 'var(--base-docs-color-line-heavy)',
},
fonts: {
body: 'CoinbaseMono',
},
radii: {
actionButton: '3px',
connectButton: '3px',
menuButton: '3px',
modal: '3px',
modalMobile: '3px',
},
};
export default function Root({ children }) {
const [mounted, setMounted] = useState(false);
// Cookie Consent Manager Provider Configuration
const trackingPreference = useRef();
const setTrackingPreference = useCallback((newPreference) => {
const priorConsent = trackingPreference.current?.consent;
trackingPreference.current = newPreference;
if (!priorConsent) {
// The first time the modal appears, this function is called with nothing present in
// trackingPreference.current. To avoid an infinite refresh loop, we return early on
// the first call.
return;
}
const newConsent = newPreference.consent;
// Check if the preferences have changed.
const diff = [
...priorConsent.filter((elem) => !newConsent.includes(elem)),
...newConsent.filter((elem) => !priorConsent.includes(elem)),
];
// Reload if the preferences have changed.
if (diff.length > 0) {
window.location.reload();
}
}, []);
const {
siteConfig: { customFields },
} = useDocusaurusContext();
const sprigEnvironmentId = customFields?.sprigEnvironmentId;
const handleLogError = useCallback((err) => console.error(err), []);
useEffect(() => setMounted(true), []);
useSprig(sprigEnvironmentId);
if (!mounted) return null;
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<RainbowKitProvider modalSize="compact" theme={customTheme} avatar={WalletAvatar}>
<style
dangerouslySetInnerHTML={{
__html: `
:root {
${cssStringFromTheme(darkTheme)}
}
html[data-theme='light'] {
${cssStringFromTheme(lightTheme, {
extends: darkTheme,
})}
}
html[data-theme='dark'] {
${cssStringFromTheme(darkTheme, {
extends: darkTheme,
})}
}
`,
}}
/>
<ExperimentsProvider>
<CookieManagerProvider
projectName="base_docs"
locale="en"
region={Region.DEFAULT}
log={console.log}
onError={handleLogError}
onPreferenceChange={setTrackingPreference}
config={cookieManagerConfig}
>
{children}
<CookieBanner companyName="Base" link="/cookie-policy" theme={cookieBannerTheme} />
</CookieManagerProvider>
</ExperimentsProvider>
</RainbowKitProvider>
</QueryClientProvider>
</WagmiProvider>
);
}