@redocly/theme
Version:
Shared UI components lib
67 lines (57 loc) • 2.13 kB
text/typescript
import { useMemo } from 'react';
import type { DisplayBanner } from '@redocly/theme/components/Banner/Banner';
import { useThemeHooks } from './use-theme-hooks';
const noop = (): void => {};
const noopLink = (_href: string): void => {};
export type BannerTelemetryActions = {
sendBannerViewedMessage: () => void;
sendBannerDismissedMessage: () => void;
sendBannerLinkClickedMessage: (href: string) => void;
};
function getCurrentPageUri(): string {
return window.location.href;
}
export function useBannerTelemetry(
displayBanner: DisplayBanner | undefined,
): BannerTelemetryActions {
const { useTelemetry } = useThemeHooks();
const telemetry = useTelemetry();
return useMemo(() => {
if (!displayBanner) {
return {
sendBannerViewedMessage: noop,
sendBannerDismissedMessage: noop,
sendBannerLinkClickedMessage: noopLink,
};
}
const bannerUri = 'urn:redocly:realm:ui:banner:banner-id';
const payload = {
id: 'banner-id' as const,
object: 'banner' as const,
uri: bannerUri,
trackingId: displayBanner.trackingId,
hash: displayBanner.hash,
color: displayBanner.color,
target: displayBanner.target,
dismissible: displayBanner.dismissible,
};
return {
sendBannerViewedMessage: () => {
const pageUri = getCurrentPageUri();
const page = { id: pageUri, object: 'page' as const, uri: pageUri };
telemetry.sendBannerViewedMessage([payload, page]);
},
sendBannerDismissedMessage: () => {
const pageUri = getCurrentPageUri();
const page = { id: pageUri, object: 'page' as const, uri: pageUri };
const { dismissible: _, ...dismissedPayload } = payload;
telemetry.sendBannerDismissedMessage([dismissedPayload, page]);
},
sendBannerLinkClickedMessage: (href: string) => {
const pageUri = getCurrentPageUri();
const page = { id: pageUri, object: 'page' as const, uri: pageUri };
telemetry.sendBannerLinkClickedMessage([{ ...payload, href }, page]);
},
};
}, [displayBanner, telemetry]);
}