diff --git a/packages/core-plugin-api/src/analytics/useAnalytics.test.tsx b/packages/core-plugin-api/src/analytics/useAnalytics.test.tsx index 3c932c02f7..22021026af 100644 --- a/packages/core-plugin-api/src/analytics/useAnalytics.test.tsx +++ b/packages/core-plugin-api/src/analytics/useAnalytics.test.tsx @@ -23,6 +23,17 @@ jest.mock('../apis'); const mocked = (f: Function) => f as jest.Mock; describe('useAnalytics', () => { + it('returns tracker with no implementation defined', () => { + // Simulate useApi() throwing an error. + mocked(useApi).mockImplementation(() => { + throw new Error(); + }); + + // Result should still have a captureEvent method. + const { result } = renderHook(() => useAnalytics()); + expect(result.current.captureEvent).toBeDefined(); + }); + it('returns tracker from defined analytics api', () => { const captureEvent = jest.fn(); diff --git a/packages/core-plugin-api/src/analytics/useAnalytics.tsx b/packages/core-plugin-api/src/analytics/useAnalytics.tsx index c3a1ae3b9c..02d1ecc3c3 100644 --- a/packages/core-plugin-api/src/analytics/useAnalytics.tsx +++ b/packages/core-plugin-api/src/analytics/useAnalytics.tsx @@ -15,17 +15,33 @@ */ import { useAnalyticsContext } from './AnalyticsContext'; -import { analyticsApiRef, AnalyticsTracker, useApi } from '../apis'; +import { + analyticsApiRef, + AnalyticsTracker, + AnalyticsApi, + useApi, +} from '../apis'; import { useRef } from 'react'; import { Tracker } from './Tracker'; +function useAnalyticsApi(): AnalyticsApi { + try { + return useApi(analyticsApiRef); + } catch { + return { captureEvent: () => {} }; + } +} + /** * Get a pre-configured analytics tracker. */ export function useAnalytics(): AnalyticsTracker { const trackerRef = useRef(null); - const analyticsApi = useApi(analyticsApiRef); const context = useAnalyticsContext(); + // Our goal is to make this API truly optional for any/all consuming code + // (including tests). This hook runs last to ensure hook order is, as much as + // possible, maintained. + const analyticsApi = useAnalyticsApi(); function getTracker(): Tracker { if (trackerRef.current === null) {