Skip to content

Commit 8494515

Browse files
fix: allow passing an api client for tracking events (#139)
1 parent 8215d9e commit 8494515

File tree

2 files changed

+88
-50
lines changed

2 files changed

+88
-50
lines changed

src/bundles/AiDrawer/AiDrawerManager.test.tsx

Lines changed: 68 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { act, render, screen } from "@testing-library/react"
22
import user from "@testing-library/user-event"
33
import { AiDrawerManager } from "./AiDrawerManager"
4-
import type { AiDrawerInitMessage } from "./AiDrawerManager"
4+
import type {
5+
AiDrawerInitMessage,
6+
AiDrawerManagerProps,
7+
} from "./AiDrawerManager"
58
import { ThemeProvider } from "../../components/ThemeProvider/ThemeProvider"
69
import * as React from "react"
710
import { http, HttpResponse } from "msw"
@@ -69,6 +72,17 @@ const assertTrackingEvent = (...data: unknown[]) => {
6972
})
7073
trackingEvent.mockClear()
7174
}
75+
const getTrackingClient = () => ({
76+
post: (url: string, data: unknown) => {
77+
fetch(url, {
78+
method: "POST",
79+
headers: {
80+
"Content-Type": "application/json",
81+
},
82+
body: JSON.stringify(data),
83+
})
84+
},
85+
})
7286

7387
describe("AiDrawerManager", () => {
7488
const server = setupServer(
@@ -95,12 +109,18 @@ describe("AiDrawerManager", () => {
95109

96110
afterAll(() => server.close())
97111

98-
const setup = async (message: AiDrawerInitMessage) => {
112+
const setup = async (
113+
message: AiDrawerInitMessage,
114+
props: Partial<AiDrawerManagerProps> = {},
115+
) => {
99116
server.listen()
100117

101-
render(<AiDrawerManager messageOrigin="http://localhost:6006" />, {
102-
wrapper: ThemeProvider,
103-
})
118+
render(
119+
<AiDrawerManager messageOrigin="http://localhost:6006" {...props} />,
120+
{
121+
wrapper: ThemeProvider,
122+
},
123+
)
104124

105125
await screen.findByTestId("ai-drawer-manager-waiting")
106126

@@ -330,26 +350,31 @@ describe("AiDrawerManager", () => {
330350
test("Sending Tracking Events [Video]", async () => {
331351
const blockUsageKey = faker.string.uuid()
332352
const eventPrefix = "ol_openedx_chat.drawer"
333-
await setup({
334-
type: "smoot-design::ai-drawer-open",
335-
payload: {
336-
blockType: "video",
337-
blockUsageKey,
338-
trackingUrl: TEST_TRACKING_EVENTS,
339-
chat: {
340-
entryScreenTitle: "Entry screen title",
341-
apiUrl: TEST_API_STREAMING,
342-
conversationStarters: [
343-
{ content: "Prompt 1" },
344-
{ content: "Prompt 2" },
345-
{ content: "Prompt 3" },
346-
],
347-
},
348-
summary: {
349-
apiUrl: CONTENT_FILE_URL,
353+
await setup(
354+
{
355+
type: "smoot-design::ai-drawer-open",
356+
payload: {
357+
blockType: "video",
358+
blockUsageKey,
359+
trackingUrl: TEST_TRACKING_EVENTS,
360+
chat: {
361+
entryScreenTitle: "Entry screen title",
362+
apiUrl: TEST_API_STREAMING,
363+
conversationStarters: [
364+
{ content: "Prompt 1" },
365+
{ content: "Prompt 2" },
366+
{ content: "Prompt 3" },
367+
],
368+
},
369+
summary: {
370+
apiUrl: CONTENT_FILE_URL,
371+
},
350372
},
351373
},
352-
})
374+
{
375+
getTrackingClient,
376+
},
377+
)
353378

354379
assertTrackingEvent({
355380
event_type: `${eventPrefix}.${TrackingEventType.Open}`,
@@ -403,23 +428,28 @@ describe("AiDrawerManager", () => {
403428
test("Sending Tracking Events [Problem]", async () => {
404429
const blockUsageKey = faker.string.uuid()
405430
const eventPrefix = "ol_openedx_chat.drawer"
406-
const { open } = await setup({
407-
type: "smoot-design::ai-drawer-open",
408-
payload: {
409-
blockType: "problem",
410-
blockUsageKey,
411-
trackingUrl: TEST_TRACKING_EVENTS,
412-
chat: {
413-
entryScreenTitle: "Entry screen title",
414-
apiUrl: TEST_API_STREAMING,
415-
conversationStarters: [
416-
{ content: "Prompt 1" },
417-
{ content: "Prompt 2" },
418-
{ content: "Prompt 3" },
419-
],
431+
const { open } = await setup(
432+
{
433+
type: "smoot-design::ai-drawer-open",
434+
payload: {
435+
blockType: "problem",
436+
blockUsageKey,
437+
trackingUrl: TEST_TRACKING_EVENTS,
438+
chat: {
439+
entryScreenTitle: "Entry screen title",
440+
apiUrl: TEST_API_STREAMING,
441+
conversationStarters: [
442+
{ content: "Prompt 1" },
443+
{ content: "Prompt 2" },
444+
{ content: "Prompt 3" },
445+
],
446+
},
420447
},
421448
},
422-
})
449+
{
450+
getTrackingClient,
451+
},
452+
)
423453

424454
assertTrackingEvent({
425455
event_type: `${eventPrefix}.${TrackingEventType.Open}`,

src/bundles/AiDrawer/AiDrawerManager.tsx

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,22 @@ type AiDrawerManagerProps = {
3636
*/
3737
/** @deprecated The AiDrawerManager now handles multiple AiDrawer instance removing the need to target */
3838
target?: string
39+
/**
40+
* Function that returns API Client for use with tracking events.
41+
*
42+
* E.g., getAuthenticatedHttpClient from @edx/frontend-platform/auth
43+
*/
44+
getTrackingClient?: () => {
45+
post: (url: string, data: Record<string, unknown>) => void
46+
}
3947
} & Pick<AiDrawerProps, "className" | "transformBody" | "fetchOpts">
4048

4149
const AiDrawerManager = ({
4250
className,
4351
messageOrigin,
4452
transformBody,
4553
fetchOpts,
54+
getTrackingClient,
4655
target,
4756
}: AiDrawerManagerProps) => {
4857
const [drawerStates, setDrawerStates] = useState<
@@ -117,22 +126,21 @@ const AiDrawerManager = ({
117126
[key]: { ...prev[key], open: false },
118127
}))
119128
}}
120-
onTrackingEvent={(event) => {
129+
onTrackingEvent={async (event) => {
121130
if (trackingUrl) {
131+
const trackingClient = getTrackingClient?.()
132+
if (!trackingClient) {
133+
console.warn("trackingClient is not provided")
134+
return
135+
}
122136
const { type, data } = event
123137
const prefix = "ol_openedx_chat.drawer"
124-
window.fetch(trackingUrl, {
125-
method: "POST",
126-
headers: {
127-
"Content-Type": "application/json",
138+
trackingClient.post(trackingUrl, {
139+
event_type: `${prefix}.${type}`,
140+
event_data: {
141+
...data,
142+
blockUsageKey: payload.blockUsageKey,
128143
},
129-
body: JSON.stringify({
130-
event_type: `${prefix}.${type}`,
131-
event_data: {
132-
...data,
133-
blockUsageKey: payload.blockUsageKey,
134-
},
135-
}),
136144
})
137145
}
138146
}}

0 commit comments

Comments
 (0)