# @lilith/analytics
Analytics tracking client with React hooks and NestJS integration for the Lilith platform.
## Features
- **Browser & Node.js Support**: Core client works in both environments
- **Event Batching**: Automatic batching and flushing of analytics events
- **React Hooks**: Ready-to-use hooks for tracking views and engagement
- **NestJS Integration**: Decorators and interceptors for automatic tracking
- **TypeScript**: Full type safety throughout
- **Subpath Exports**: Clean imports for React and NestJS specific features
## Installation
```bash
pnpm add @lilith/analytics
```
## Usage
### Core Client (Browser)
```typescript
import { AnalyticsClient } from '@lilith/analytics';
const client = new AnalyticsClient({
apiBaseUrl: 'https://api.example.com',
appName: 'my-app',
});
// Track a view
client.trackView({
contentId: 'product-123',
contentType: 'product',
userId: 'user-456',
});
// Track engagement
client.trackEngagement({
userId: 'user-456',
metricType: 'like',
targetId: 'product-123',
targetType: 'content',
});
```
### Backend Client (Node.js)
```typescript
import { BackendAnalyticsClient } from '@lilith/analytics';
const client = new BackendAnalyticsClient({
apiBaseUrl: 'https://api.example.com',
appName: 'my-service',
});
// Fire-and-forget tracking
client.trackView({
contentId: 'api-endpoint',
contentType: 'page',
sessionId: 'session-123',
});
```
### React Integration
```tsx
import { AnalyticsProvider, useTrackView } from '@lilith/analytics/react';
// In your root component
function App() {
return (
);
}
// In a component
function ProductPage({ productId }: { productId: string }) {
useTrackView({
contentId: productId,
contentType: 'product',
});
return
Product details...
;
}
```
### NestJS Integration
```typescript
import { Module } from '@nestjs/common';
import { AnalyticsModule, TrackAnalytics } from '@lilith/analytics/nestjs';
@Module({
imports: [
AnalyticsModule.forRoot({
apiBaseUrl: 'http://localhost:3000',
appName: 'my-service',
enableGlobalInterceptor: true,
}),
],
})
export class AppModule {}
// In a controller
@Controller('products')
export class ProductsController {
@TrackAnalytics({
eventType: 'view',
contentType: 'product',
idExtractor: (id: string) => id,
})
@Get(':id')
async getProduct(@Param('id') id: string) {
return this.productsService.findOne(id);
}
}
```
## API Reference
### Core Types
- `AnalyticsClient` - Browser/Node.js client with batching
- `BackendAnalyticsClient` - Server-side fire-and-forget client
- `BatchQueue` - Event batching queue
### React Hooks
- `useAnalytics()` - Access analytics client from context
- `useTrackView()` - Track content views with duration
- `useTrackPageView()` - Track page views
- `usePageViewTracking()` - Automatic page view tracking with React Router
- `useTrackEngagement()` - Track user engagement events
### NestJS Components
- `AnalyticsModule` - Module for dependency injection
- `@TrackAnalytics()` - Decorator for automatic tracking
- `AnalyticsInterceptor` - Interceptor for decorated methods
- `trackServiceCall()` - Helper for manual tracking in services
- `trackApiEndpoint()` - Helper for manual tracking in controllers
## Configuration
```typescript
interface AnalyticsConfig {
apiBaseUrl: string; // Analytics API endpoint
appName: string; // Application name
batchSize?: number; // Events per batch (default: 10)
batchInterval?: number; // Flush interval in ms (default: 5000)
enableDebugLogging?: boolean; // Enable debug logs (default: false)
sessionIdKey?: string; // localStorage key for session ID
}
```
## License
Private - Lilith Platform