import type { AnalyticsAdapter, AnalyticsEvent, GroupPayload, IdentifyPayload, ScreenEvent, } from '../types'; export interface MixpanelAdapterOptions { /** * Pass the Mixpanel instance from `mixpanel-react-native`. * * Install peer dependency: * npm install mixpanel-react-native * * Usage: * import { Mixpanel } from 'mixpanel-react-native'; * const mixpanel = new Mixpanel('YOUR_TOKEN', true); * await mixpanel.init(); * createAnalytics({ adapters: [createMixpanelAdapter({ instance: mixpanel })] }); */ instance: any; /** Track screen views as events with a custom event name (default: 'Screen Viewed') */ screenEventName?: string; } export function createMixpanelAdapter(options: MixpanelAdapterOptions): AnalyticsAdapter { const { instance, screenEventName = 'Screen Viewed' } = options; return { name: 'mixpanel', async initialize() { // Mixpanel is initialized before being passed in }, async track(event: AnalyticsEvent) { instance.track(event.name, event.properties ?? {}); }, async screen(event: ScreenEvent) { instance.track(screenEventName, { screen_name: event.name, previous_screen: event.previousScreen, ...event.properties, }); }, async identify(payload: IdentifyPayload) { instance.identify(payload.userId); if (payload.traits) { instance.getPeople().set(payload.traits); } }, async group(payload: GroupPayload) { // Mixpanel groups require a group key — default to 'company' instance.setGroup('company', payload.groupId); if (payload.traits) { instance.getGroup('company', payload.groupId).set(payload.traits); } }, async alias(payload) { instance.alias(payload.newId, payload.previousId); }, async reset() { instance.reset(); }, async flush() { instance.flush(); }, }; }