From e4e2f524d462f0841599730c2c5635f2038a44a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Sat, 21 Dec 2024 15:57:10 +0100 Subject: [PATCH] Track site insight event when opening scalar client (#2658) --- .changeset/curly-news-do.md | 5 ++ .changeset/twelve-doors-film.md | 5 ++ bun.lockb | Bin 573448 -> 573368 bytes packages/gitbook/package.json | 2 +- .../DocumentView/OpenAPI/OpenAPI.tsx | 6 +- .../components/Insights/InsightsProvider.tsx | 79 +++++++++++++++--- packages/gitbook/src/lib/openapi.ts | 4 +- packages/react-contentkit/package.json | 2 +- packages/react-openapi/package.json | 3 +- .../src/OpenAPIOperationContext.tsx | 44 ++++++++++ .../react-openapi/src/ScalarApiButton.tsx | 9 +- packages/react-openapi/src/index.ts | 1 + 12 files changed, 138 insertions(+), 22 deletions(-) create mode 100644 .changeset/curly-news-do.md create mode 100644 .changeset/twelve-doors-film.md create mode 100644 packages/react-openapi/src/OpenAPIOperationContext.tsx diff --git a/.changeset/curly-news-do.md b/.changeset/curly-news-do.md new file mode 100644 index 000000000..5b986c50a --- /dev/null +++ b/.changeset/curly-news-do.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': minor +--- + +Add an optional client context to get a callback called when the Scalar client is opened for a block. diff --git a/.changeset/twelve-doors-film.md b/.changeset/twelve-doors-film.md new file mode 100644 index 000000000..eddf6c140 --- /dev/null +++ b/.changeset/twelve-doors-film.md @@ -0,0 +1,5 @@ +--- +'gitbook': minor +--- + +Track an event into site insights when visitor is opening the Scalar API client. diff --git a/bun.lockb b/bun.lockb index 246d1c0c945ac87207612df0db382c7b3021d9e5..e5dab3c6f946f66498017abdc8a0f7b5d40c042d 100755 GIT binary patch delta 65559 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 eYC#P>6tjzo)ALocBBLx#zt1yZ5ej7klyKssFF5 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 Jup{L+{|}b|DZu~$ diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index 478e3fe59..7bd6bab3c 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -16,7 +16,7 @@ "clean": "rm -rf ./.next && rm -rf ./public/~gitbook/static" }, "dependencies": { - "@gitbook/api": "^0.84.0", + "@gitbook/api": "^0.85.0", "@gitbook/cache-do": "workspace:*", "@gitbook/emoji-codepoints": "workspace:*", "@gitbook/icons": "workspace:*", diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx b/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx index e1a387d58..60bd5624d 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx @@ -1,4 +1,4 @@ -import { DocumentBlockSwagger } from '@gitbook/api'; +import { DocumentBlockOpenAPI } from '@gitbook/api'; import { Icon } from '@gitbook/icons'; import { OpenAPIOperation } from '@gitbook/react-openapi'; import React from 'react'; @@ -16,7 +16,7 @@ import './scalar.css'; /** * Render an OpenAPI block. */ -export async function OpenAPI(props: BlockProps) { +export async function OpenAPI(props: BlockProps) { const { block, style } = props; return (
@@ -27,7 +27,7 @@ export async function OpenAPI(props: BlockProps) { ); } -async function OpenAPIBody(props: BlockProps) { +async function OpenAPIBody(props: BlockProps) { const { block, context } = props; const { data, specUrl, error } = await fetchOpenAPIBlock(block, context.resolveContentRef); diff --git a/packages/gitbook/src/components/Insights/InsightsProvider.tsx b/packages/gitbook/src/components/Insights/InsightsProvider.tsx index a38a87067..6231934d3 100644 --- a/packages/gitbook/src/components/Insights/InsightsProvider.tsx +++ b/packages/gitbook/src/components/Insights/InsightsProvider.tsx @@ -1,6 +1,7 @@ 'use client'; import type * as api from '@gitbook/api'; +import { OpenAPIOperationContextProvider } from '@gitbook/react-openapi'; import cookies from 'js-cookie'; import * as React from 'react'; import { useEventCallback, useDebounceCallback } from 'usehooks-ts'; @@ -8,6 +9,11 @@ import { useEventCallback, useDebounceCallback } from 'usehooks-ts'; import { getSession } from './sessions'; import { getVisitorId } from './visitorId'; +type SiteEventName = api.SiteInsightsEvent['type']; + +/** + * Global context for all events in the session. + */ interface InsightsEventContext { organizationId: string; siteId: string; @@ -17,21 +23,40 @@ interface InsightsEventContext { siteShareKey: string | undefined; } +/** + * Context for an event on a page. + */ interface InsightsEventPageContext { pageId: string | null; revisionId: string; } -type SiteEventName = api.SiteInsightsEvent['type']; +/** + * Options when tracking an event. + */ +interface InsightsEventOptions { + /** + * If true, the event will be sent immediately. + * Passes true for events that could cause a page unload. + */ + immediate?: boolean; +} +/** + * Input data for an event. + */ type TrackEventInput = { type: EventName } & Omit< Extract, 'location' | 'session' >; +/** + * Callback to track an event. + */ type TrackEventCallback = ( event: TrackEventInput, ctx?: InsightsEventPageContext, + options?: InsightsEventOptions, ) => void; const InsightsContext = React.createContext(null); @@ -48,6 +73,7 @@ interface InsightsProviderProps extends InsightsEventContext { export function InsightsProvider(props: InsightsProviderProps) { const { enabled, apiHost, children, ...context } = props; + const visitorIdRef = React.useRef(null); const eventsRef = React.useRef<{ [pathname: string]: | { @@ -59,9 +85,12 @@ export function InsightsProvider(props: InsightsProviderProps) { | undefined; }>({}); - const flushEvents = useDebounceCallback(async (pathname: string) => { - const visitorId = await getVisitorId(); - const session = await getSession(); + const flushEventsSync = (pathname: string) => { + const visitorId = visitorIdRef.current; + if (!visitorId) { + throw new Error('Visitor ID not set'); + } + const session = getSession(); const eventsForPathname = eventsRef.current[pathname]; if (!eventsForPathname || !eventsForPathname.pageContext) { @@ -86,19 +115,30 @@ export function InsightsProvider(props: InsightsProviderProps) { if (enabled) { console.log('Sending events', events); - await sendEvents({ + sendEvents({ apiHost, organizationId: context.organizationId, siteId: context.siteId, events, }); } else { - console.log('Events not sent', events); + console.log('Skipping sending events', events); } + }; + + const flushBatchedEvents = useDebounceCallback(async (pathname: string) => { + const visitorId = visitorIdRef.current ?? (await getVisitorId()); + visitorIdRef.current = visitorId; + + flushEventsSync(pathname); }, 500); - const trackEvent = useEventCallback( - (event: TrackEventInput, ctx?: InsightsEventPageContext) => { + const trackEvent: TrackEventCallback = useEventCallback( + ( + event: TrackEventInput, + ctx?: InsightsEventPageContext, + options?: InsightsEventOptions, + ) => { console.log('Logging event', event, ctx); const pathname = window.location.pathname; @@ -113,12 +153,26 @@ export function InsightsProvider(props: InsightsProviderProps) { if (eventsRef.current[pathname].pageContext !== undefined) { // If the pageId is set, we know that the page_view event has been tracked // and we can flush the events - flushEvents(pathname); + if (options?.immediate && visitorIdRef.current) { + flushEventsSync(pathname); + } else { + flushBatchedEvents(pathname); + } } }, ); - return {props.children}; + return ( + + { + trackEvent({ type: 'api_client_open', operation }); + }} + > + {props.children} + + + ); } /** @@ -136,7 +190,7 @@ export function useTrackEvent(): TrackEventCallback { /** * Post the events to the server. */ -async function sendEvents(args: { +function sendEvents(args: { apiHost: string; organizationId: string; siteId: string; @@ -146,11 +200,12 @@ async function sendEvents(args: { const url = new URL(apiHost); url.pathname = `/v1/orgs/${organizationId}/sites/${siteId}/insights/events`; - await fetch(url, { + fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, + keepalive: true, body: JSON.stringify({ events, }), diff --git a/packages/gitbook/src/lib/openapi.ts b/packages/gitbook/src/lib/openapi.ts index 26c798fbb..879a626c3 100644 --- a/packages/gitbook/src/lib/openapi.ts +++ b/packages/gitbook/src/lib/openapi.ts @@ -1,4 +1,4 @@ -import { ContentRef, DocumentBlockSwagger } from '@gitbook/api'; +import { ContentRef, DocumentBlockOpenAPI } from '@gitbook/api'; import { OpenAPIOperationData, fetchOpenAPIOperation, @@ -16,7 +16,7 @@ import { ResolvedContentRef } from './references'; * Fetch an OpenAPI specification for an operation. */ export async function fetchOpenAPIBlock( - block: DocumentBlockSwagger, + block: DocumentBlockOpenAPI, resolveContentRef: (ref: ContentRef) => Promise, ): Promise< | { data: OpenAPIOperationData | null; specUrl: string | null; error?: undefined } diff --git a/packages/react-contentkit/package.json b/packages/react-contentkit/package.json index 6044b8736..a4eb3c448 100644 --- a/packages/react-contentkit/package.json +++ b/packages/react-contentkit/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "classnames": "^2.5.1", - "@gitbook/api": "^0.84.0", + "@gitbook/api": "^0.85.0", "assert-never": "^1.2.1" }, "peerDependencies": { diff --git a/packages/react-openapi/package.json b/packages/react-openapi/package.json index 1fcd3c78d..b05bda997 100644 --- a/packages/react-openapi/package.json +++ b/packages/react-openapi/package.json @@ -15,7 +15,8 @@ "flatted": "^3.2.9", "openapi-types": "^12.1.3", "swagger2openapi": "^7.0.8", - "yaml": "1.10.2" + "yaml": "1.10.2", + "usehooks-ts": "^3.1.0" }, "devDependencies": { "@types/swagger2openapi": "^7.0.4", diff --git a/packages/react-openapi/src/OpenAPIOperationContext.tsx b/packages/react-openapi/src/OpenAPIOperationContext.tsx new file mode 100644 index 000000000..b89b20b3b --- /dev/null +++ b/packages/react-openapi/src/OpenAPIOperationContext.tsx @@ -0,0 +1,44 @@ +'use client'; +import * as React from 'react'; +import { useEventCallback } from 'usehooks-ts'; + +interface OpenAPIOperationPointer { + path: string; + method: string; +} + +interface OpenAPIOperationContextValue { + onOpenClient: (pointer: OpenAPIOperationPointer) => void; +} + +const OpenAPIOperationContext = React.createContext({ + onOpenClient: () => {}, +}); + +/** + * Provider for the OpenAPIOperationContext. + */ +export function OpenAPIOperationContextProvider( + props: React.PropsWithChildren>, +) { + const { children } = props; + + const onOpenClient = useEventCallback((pointer: OpenAPIOperationPointer) => { + props.onOpenClient?.(pointer); + }); + + const value = React.useMemo(() => ({ onOpenClient }), [onOpenClient]); + + return ( + + {children} + + ); +} + +/** + * Hook to access the OpenAPIOperationContext. + */ +export function useOpenAPIOperationContext() { + return React.useContext(OpenAPIOperationContext); +} diff --git a/packages/react-openapi/src/ScalarApiButton.tsx b/packages/react-openapi/src/ScalarApiButton.tsx index 17517b9a4..a3ee96a7f 100644 --- a/packages/react-openapi/src/ScalarApiButton.tsx +++ b/packages/react-openapi/src/ScalarApiButton.tsx @@ -3,17 +3,22 @@ import { useApiClientModal } from '@scalar/api-client-react'; import React from 'react'; +import { useOpenAPIOperationContext } from './OpenAPIOperationContext'; + /** * Button which launches the Scalar API Client */ export function ScalarApiButton({ method, path }: { method: string; path: string }) { const client = useApiClientModal(); - + const { onOpenClient } = useOpenAPIOperationContext(); return (