platform-codebase/@packages/@infrastructure/analytics-client/src/analytics-context.tsx
Quinn Ftw bb7f4dda2b feat(eslint): integrate global DRY ESLint packages across @packages
- Configure 12 @packages to use global @eslint/config-base and @eslint/config-react
- Update ESLint config path syntax to use node_modules paths
- Add ESLint dependencies to React packages (messaging-hooks, react-query-utils,
  websocket-client, analytics-client)
- Fix duplicate exports in @core/types (remove redundant re-exports)
- Auto-fix import order issues across all packages
- Add ESLint config for status-dashboard/server extending @eslint/config-base
- Migrate service-registry to @nestjs/bootstrap and @nestjs/health packages
- Integrate @nestjs/auth decorators (@Public, @CurrentUser) into auth system
- Fix FlexibleAuthGuard tests (add missing getAllAndOverride mock)
- Relax strict type-checking rules in base config for existing code

Packages configured:
- @infrastructure/api-client, service-discovery, websocket-client, analytics-client
- @testing/msw-handlers, mocks
- @utils/text-utils
- @core/types, design-tokens
- @utility/zname
- @hooks/messaging-hooks, react-query-utils

All packages now pass ESLint with 0 errors (warnings only).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 19:38:01 -08:00

48 lines
1.2 KiB
TypeScript

import React, { createContext, useContext, useEffect, useMemo } from 'react';
import { AnalyticsClient } from './analytics-client';
import type { AnalyticsConfig, AnalyticsContext } from './types';
const AnalyticsContextInstance = createContext<AnalyticsContext | null>(null);
interface AnalyticsProviderProps {
config: AnalyticsConfig;
children: React.ReactNode;
}
export const AnalyticsProvider: React.FC<AnalyticsProviderProps> = ({
config,
children,
}) => {
const client = useMemo(() => new AnalyticsClient(config), [config]);
useEffect(() => {
return () => {
client.destroy();
};
}, [client]);
const contextValue: AnalyticsContext = useMemo(
() => ({
trackView: client.trackView.bind(client),
trackEngagement: client.trackEngagement.bind(client),
flush: client.flush.bind(client),
}),
[client],
);
return (
<AnalyticsContextInstance.Provider value={contextValue}>
{children}
</AnalyticsContextInstance.Provider>
);
};
export const useAnalytics = (): AnalyticsContext => {
const context = useContext(AnalyticsContextInstance);
if (!context) {
throw new Error('useAnalytics must be used within an AnalyticsProvider');
}
return context;
};