Skip to content

Commit fa16055

Browse files
feat(EventBuilder): allow screen_view and ad_impression events (#2241)
* remove events from reserved events list * add stream identifier to event * add test, cleanup deprecated method use in test file * fix code formatting
1 parent 40e9fbf commit fa16055

4 files changed

Lines changed: 71 additions & 19 deletions

File tree

src/components/ga4/EventBuilder/ValidateEvent/handlers/formatCheckLib.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ import {eventDefinitions} from "../schemas/eventTypes/eventDefinitions"
55
import {InstanceId} from "../../types"
66

77
const RESERVED_EVENT_NAMES = [
8-
"ad_activeview", "ad_click", "ad_exposure", "ad_impression", "ad_query",
8+
"ad_activeview", "ad_click", "ad_exposure", "ad_query",
99
"adunit_exposure", "app_clear_data", "app_install", "app_update",
1010
"app_remove", "error", "first_open", "first_visit", "in_app_purchase",
1111
"notification_dismiss", "notification_foreground", "notification_open",
12-
"notification_receive", "os_update", "screen_view", "session_start",
13-
"user_engagement"
12+
"notification_receive", "os_update", "session_start", "user_engagement"
1413
]
1514
const RESERVED_USER_PROPERTY_NAMES = [
1615
"first_open_time", "first_visit_time", "last_deep_link_referrer", "user_id",

src/components/ga4/EventBuilder/event.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@ const eventFor = (
4040
type: EventType,
4141
categories: Category[],
4242
parameters: Parameter[],
43-
firstItem?: Parameter[]
43+
firstItem?: Parameter[],
44+
clients: ("web" | "app")[] = ["web", "app"]
4445
) => ({
4546
type,
4647
categories,
4748
parameters,
4849
items: firstItem === undefined ? undefined : [firstItem],
50+
clients,
4951
})
5052

5153
const custom_event = eventFor(EventType.CustomEvent, [Category.Custom], [], [])
@@ -60,7 +62,9 @@ const ad_impression = eventFor(
6062
stringParam("ad_unit_name", "Banner_03"),
6163
stringParam("currency", "USD"),
6264
numberParam("value", 3.99),
63-
]
65+
],
66+
undefined,
67+
["app"]
6468
)
6569

6670
const add_payment_info = eventFor(
@@ -306,7 +310,9 @@ const screen_view = eventFor(
306310
[
307311
stringParam("screen_class", "MainActivity"),
308312
stringParam("screen_name", "About"),
309-
]
313+
],
314+
undefined,
315+
["app"]
310316
)
311317

312318
const search = eventFor(
@@ -598,5 +604,11 @@ const events = Object.values(EventType).map(eventType =>
598604
suggestedEventFor(eventType)
599605
)
600606

601-
export const eventsForCategory = (category: Category) =>
602-
events.filter(event => event.categories.find(c => c === category))
607+
export const eventsForCategory = (category: Category, useFirebase?: boolean) => {
608+
const client = useFirebase ? "app" : "web"
609+
return events.filter(
610+
(event: any) =>
611+
event.categories.find((c: any) => c === category) &&
612+
event.clients.includes(client)
613+
)
614+
}

src/components/ga4/EventBuilder/index.spec.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ describe("Event Builder", () => {
4949
const { wrapped } = withProviders(<Sut />, { isLoggedIn: false })
5050
const { findByLabelText, findByTestId } = renderer.render(wrapped)
5151

52-
await renderer.act(async () => {
52+
await React.act(async () => {
5353
// Choose the second view in the list
5454
const clientToggle = await findByTestId("use firebase")
5555
clientToggle.click()
@@ -94,7 +94,7 @@ describe("Event Builder", () => {
9494
exact: false,
9595
})
9696

97-
await renderer.act(async () => {
97+
await React.act(async () => {
9898
await userEvent.type(apiSecret, "my_secret", { delay: 1 })
9999
await userEvent.type(firebaseAppId, "my_firebase_app_id", {
100100
delay: 1,
@@ -145,7 +145,7 @@ describe("Event Builder", () => {
145145
wrapped
146146
)
147147

148-
await renderer.act(async () => {
148+
await React.act(async () => {
149149
// Choose the second view in the list
150150
const clientToggle = await findByTestId("use firebase")
151151
clientToggle.click()
@@ -166,7 +166,7 @@ describe("Event Builder", () => {
166166
exact: false,
167167
})
168168

169-
await renderer.act(async () => {
169+
await React.act(async () => {
170170
await userEvent.type(apiSecret, "my_secret", { delay: 1 })
171171
await userEvent.type(measurementId, "my_measurement_id", {
172172
delay: 1,
@@ -187,7 +187,7 @@ describe("Event Builder", () => {
187187

188188
const enInput = within(eventName).getByRole("combobox")
189189
//eventCategory.focus()
190-
renderer.fireEvent.change(enInput, { target: { value: "select_content" } })
190+
renderer.fireEvent.change(enInput, { target: { value: "campaign_details" } })
191191

192192
await userEvent.type(
193193
timestampMicros,
@@ -208,9 +208,28 @@ describe("Event Builder", () => {
208208
expect(payload).toHaveTextContent(/"user_id":"my_user_id"/)
209209
expect(payload).toHaveTextContent(/"timestamp_micros":"1234"/)
210210
expect(payload).toHaveTextContent(/"non_personalized_ads":true/)
211-
expect(payload).toHaveTextContent(/"name":"select_content"/)
211+
expect(payload).toHaveTextContent(/"name":"campaign_details"/)
212212
})
213213
})
214214
})
215215
})
216+
describe("for firebase switch", () => {
217+
test("app only event ad_impression is not available", async () => {
218+
const { wrapped } = withProviders(<Sut />, { isLoggedIn: false })
219+
const { findByTestId } = renderer.render(wrapped)
220+
221+
await React.act(async () => {
222+
const clientToggle = await findByTestId("use firebase")
223+
clientToggle.click()
224+
})
225+
226+
const eventName = await findByTestId(Label.EventName)
227+
const enInput = within(eventName).getByRole("combobox")
228+
eventName.focus()
229+
renderer.fireEvent.change(enInput, { target: { value: "ad" } })
230+
231+
const adImpression = renderer.screen.queryByText("ad_impression")
232+
expect(adImpression).toBeNull()
233+
})
234+
})
216235
})

src/components/ga4/EventBuilder/index.tsx

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,11 @@ const EventBuilder: React.FC = () => {
226226
setNonPersonalizedAds,
227227
} = useInputs(categories)
228228

229+
const eventOptions = React.useMemo(
230+
() => eventsForCategory(category, useFirebase),
231+
[category, useFirebase]
232+
)
233+
229234
const formatPayload = React.useCallback( () => {
230235
try {
231236
if (inputPayload) {
@@ -274,11 +279,22 @@ const EventBuilder: React.FC = () => {
274279
data-testid="use firebase"
275280
checked={useFirebase}
276281
onChange={e => {
277-
setUseFirebase(e.target.checked)
282+
const newUseFirebase = e.target.checked
283+
setUseFirebase(newUseFirebase)
278284

279285
if (!e.target.checked) {
280286
setUseTextBox(false)
281287
}
288+
289+
// Always reset the event type when the client changes.
290+
const newOptions = eventsForCategory(category, newUseFirebase)
291+
if (newOptions.length > 0) {
292+
setType(newOptions[0].type)
293+
} else {
294+
// If the new client has no events for this category, switch to Custom.
295+
setCategory(Category.Custom)
296+
setType(EventType.CustomEvent)
297+
}
282298
}}
283299
name="use firebase"
284300
color="primary"
@@ -446,9 +462,15 @@ const EventBuilder: React.FC = () => {
446462
value={category}
447463
onChange={(_event, value) => {
448464
setCategory(value as Category)
449-
const events = eventsForCategory(value as Category)
450-
if (events.length > 0) {
451-
setType(events[0].type)
465+
const newOptions = eventsForCategory(
466+
value as Category,
467+
useFirebase
468+
)
469+
if (newOptions.length > 0) {
470+
setType(newOptions[0].type)
471+
} else {
472+
setCategory(Category.Custom)
473+
setType(EventType.CustomEvent)
452474
}
453475
}}
454476
renderInput={params => (
@@ -483,7 +505,7 @@ const EventBuilder: React.FC = () => {
483505
autoComplete
484506
autoHighlight
485507
autoSelect
486-
options={eventsForCategory(category).map(e => e.type)}
508+
options={eventOptions.map(e => e.type)}
487509
getOptionLabel={eventType => eventType}
488510
value={type}
489511
onChange={(_event, value) => {

0 commit comments

Comments
 (0)