React and Next.js Integration
Install
npm install @drivemetadata-ai/sdk
React
Wrap your application once:
import { DmdProvider } from '@drivemetadata-ai/sdk/react';
export function App() {
return (
<DmdProvider
config={{
clientId: 'client_xxx',
workspaceId: 'workspace_xxx',
appId: 'app_xxx',
token: 'public_token',
consent: { analytics: 'granted', advertising: 'denied' }
}}
>
<Routes />
</DmdProvider>
);
}
Track events:
import { useTrackEvent } from '@drivemetadata-ai/sdk/react';
export function CTAButton() {
const track = useTrackEvent();
return (
<button onClick={() => track('CTA Clicked', { location: 'pricing' })}>
Start
</button>
);
}
Use the complete browser client surface from hooks:
import {
useAlias,
useDmdFlush,
useGroup,
useIdentify,
usePage,
useReset,
useTrackEvent
} from '@drivemetadata-ai/sdk/react';
export function AnalyticsActions() {
const track = useTrackEvent();
const page = usePage();
const identify = useIdentify();
const group = useGroup();
const alias = useAlias();
const flush = useDmdFlush();
const reset = useReset();
async function onCheckout() {
identify('user_123', { plan: 'enterprise' });
group('account_123', { tier: 'enterprise' });
alias('anonymous_123', 'user_123');
page('Checkout');
track('Checkout Started', { source: 'cart' });
await flush();
}
return (
<>
<button onClick={onCheckout}>Track checkout</button>
<button onClick={reset}>Reset</button>
</>
);
}
Next.js App Router
Create a client provider:
'use client';
import { DmdProvider, useDmdAppRouterPageTracking } from '@drivemetadata-ai/sdk/next';
import { usePathname, useSearchParams } from 'next/navigation';
export function AnalyticsProvider({ children }: { children: React.ReactNode }) {
const pathname = usePathname();
const searchParams = useSearchParams();
useDmdAppRouterPageTracking(pathname, searchParams.toString(), {
name: 'Route Viewed'
});
return (
<DmdProvider
config={{
clientId: process.env.NEXT_PUBLIC_DMD_CLIENT_ID!,
workspaceId: process.env.NEXT_PUBLIC_DMD_WORKSPACE_ID!,
appId: process.env.NEXT_PUBLIC_DMD_APP_ID!,
token: process.env.NEXT_PUBLIC_DMD_TOKEN!,
consent: { analytics: 'granted', advertising: 'denied' }
}}
>
{children}
</DmdProvider>
);
}
Use it in app/layout.tsx:
import { AnalyticsProvider } from './AnalyticsProvider';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<AnalyticsProvider>{children}</AnalyticsProvider>
</body>
</html>
);
}
Next.js Pages Router
Use a provider in _app.tsx:
import type { AppProps } from 'next/app';
import { useRouter } from 'next/router';
import { DmdProvider, useDmdPagesRouterPageTracking } from '@drivemetadata-ai/sdk/next';
function AnalyticsPageTracking() {
const router = useRouter();
useDmdPagesRouterPageTracking(router);
return null;
}
export default function App({ Component, pageProps }: AppProps) {
return (
<DmdProvider config={config}>
<AnalyticsPageTracking />
<Component {...pageProps} />
</DmdProvider>
);
}
SSR Safety
@drivemetadata-ai/sdk/react and @drivemetadata-ai/sdk/next can be imported during server rendering, but SDK initialization must run in the browser. In Next.js App Router, place DmdProvider inside a file that starts with 'use client'.
If consent is omitted, analytics defaults to pending; call consent.update() or pass an explicit consent object after your consent manager resolves.