From 20b512da481694d220571bfee3699b906caea3e9 Mon Sep 17 00:00:00 2001 From: Cataldo Mazzilli Date: Tue, 17 Sep 2024 11:25:01 +0200 Subject: [PATCH] feat: expose postHog capture function Refs: SHELL-244 (#505) --- api-extractor/carbonio-shell-ui.api.md | 3 +++ src/boot/loader.test.tsx | 6 ++---- src/boot/posthog.test.tsx | 11 +++++++++++ src/boot/posthog.tsx | 12 ++++++++++-- src/tests/posthog-utils.ts | 3 ++- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/api-extractor/carbonio-shell-ui.api.md b/api-extractor/carbonio-shell-ui.api.md index f0a3f93ef..0ec53920f 100644 --- a/api-extractor/carbonio-shell-ui.api.md +++ b/api-extractor/carbonio-shell-ui.api.md @@ -20,6 +20,7 @@ import type { FC } from 'react'; import type { i18n } from 'i18next'; import type { LinkProps } from 'react-router-dom'; import type { ModalProps } from '@zextras/carbonio-design-system'; +import type { PostHog } from 'posthog-js'; import { default as React_2 } from 'react'; import type { TFunction } from 'i18next'; import type { To } from 'history'; @@ -1468,6 +1469,8 @@ export type Tags = Record; // @public (undocumented) interface Tracker { + // (undocumented) + capture: InstanceType['capture']; // (undocumented) enableTracker: (enable: boolean) => void; // (undocumented) diff --git a/src/boot/loader.test.tsx b/src/boot/loader.test.tsx index fb637c71b..3b5922404 100644 --- a/src/boot/loader.test.tsx +++ b/src/boot/loader.test.tsx @@ -128,7 +128,6 @@ describe('Loader', () => { const componentsRes = waitForResponse('get', '/static/iris/components.json'); const getInfoRes = waitForResponse('post', '/service/soap/GetInfoRequest'); const enableTrackerFn = jest.fn(); - const resetFn = jest.fn(); server.use( http.post( '/service/soap/GetInfoRequest', @@ -137,7 +136,7 @@ describe('Loader', () => { ); jest .spyOn(posthog, 'useTracker') - .mockReturnValue({ enableTracker: enableTrackerFn, reset: resetFn }); + .mockReturnValue({ enableTracker: enableTrackerFn, reset: jest.fn(), capture: jest.fn() }); setup( @@ -195,7 +194,6 @@ describe('Loader', () => { const componentsRes = waitForResponse('get', '/static/iris/components.json'); const getInfoRes = waitForResponse('post', '/service/soap/GetInfoRequest'); const enableTrackerFn = jest.fn(); - const resetFn = jest.fn(); server.use( http.post( '/service/soap/GetInfoRequest', @@ -204,7 +202,7 @@ describe('Loader', () => { ); jest .spyOn(posthog, 'useTracker') - .mockReturnValue({ enableTracker: enableTrackerFn, reset: resetFn }); + .mockReturnValue({ enableTracker: enableTrackerFn, reset: jest.fn(), capture: jest.fn() }); setup( diff --git a/src/boot/posthog.test.tsx b/src/boot/posthog.test.tsx index da505ac5c..0acd4ad5a 100644 --- a/src/boot/posthog.test.tsx +++ b/src/boot/posthog.test.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { act, waitFor } from '@testing-library/react'; import { renderHook } from '@testing-library/react-hooks'; +import type { CaptureOptions } from 'posthog-js'; import * as posthogJsReact from 'posthog-js/react'; import type * as PostHogReact from 'posthog-js/react'; @@ -57,6 +58,16 @@ describe('Posthog', () => { expect(posthog.reset).toHaveBeenCalled(); }); + it('should call capture ', () => { + const posthog = spyOnPosthog(); + const { result } = renderHook(() => useTracker()); + const eventName = 'event name'; + const properties = { prop1: 'prop1value', prop2: 'prop2value' }; + const options: CaptureOptions = { send_instantly: true }; + result.current.capture(eventName, properties, options); + expect(posthog.capture).toHaveBeenCalledWith(eventName, properties, options); + }); + it('should invoke posthog provider with trackers disabled by default', () => { const mockProvider = jest.spyOn(posthogJsReact, 'PostHogProvider'); setup(); diff --git a/src/boot/posthog.tsx b/src/boot/posthog.tsx index d3d036959..d3e0129b4 100644 --- a/src/boot/posthog.tsx +++ b/src/boot/posthog.tsx @@ -5,7 +5,7 @@ */ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import type { PostHogConfig } from 'posthog-js'; +import type { PostHog, PostHogConfig } from 'posthog-js'; import { PostHogProvider, usePostHog } from 'posthog-js/react'; import { useAccountStore } from '../store/account'; @@ -36,6 +36,7 @@ export const TrackerProvider = ({ interface Tracker { enableTracker: (enable: boolean) => void; reset: () => void; + capture: InstanceType['capture']; } const hashToSHA256 = async (value: string): Promise => { @@ -97,5 +98,12 @@ export const useTracker = (): Tracker => { postHog.reset(); }, [postHog]); - return { enableTracker, reset }; + const capture = useCallback['capture']>( + (eventName, properties, options) => { + postHog.capture(eventName, properties, options); + }, + [postHog] + ); + + return { enableTracker, reset, capture }; }; diff --git a/src/tests/posthog-utils.ts b/src/tests/posthog-utils.ts index 199328863..db40372e5 100644 --- a/src/tests/posthog-utils.ts +++ b/src/tests/posthog-utils.ts @@ -20,7 +20,8 @@ export const spyOnPosthog = (): Partial>; jest .spyOn(posthogJsReact, 'usePostHog')