Skip to content

Commit 6660de6

Browse files
committed
Merge remote-tracking branch 'origin/main' into event-builder-updates
2 parents 5969cf3 + fa16055 commit 6660de6

6 files changed

Lines changed: 73 additions & 20 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
@@ -50,7 +50,7 @@ describe("Event Builder", () => {
5050
const { wrapped } = withProviders(<Sut />, { isLoggedIn: false })
5151
const { findByLabelText, findByTestId } = renderer.render(wrapped)
5252

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

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

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

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

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

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

src/components/ga4/EventBuilder/index.tsx

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

208+
const eventOptions = React.useMemo(
209+
() => eventsForCategory(category, useFirebase),
210+
[category, useFirebase]
211+
)
212+
208213
const [user_location_city, setUserLocationCity] = React.useState("")
209214
const [user_location_region_id, setUserLocationRegionId] = React.useState("")
210215
const [user_location_country_id, setUserLocationCountryId] = React.useState("")
@@ -258,11 +263,22 @@ const EventBuilder: React.FC = () => {
258263
data-testid="use firebase"
259264
checked={useFirebase}
260265
onChange={e => {
261-
setUseFirebase(e.target.checked)
266+
const newUseFirebase = e.target.checked
267+
setUseFirebase(newUseFirebase)
262268

263269
if (!e.target.checked) {
264270
setUseTextBox(false)
265271
}
272+
273+
// Always reset the event type when the client changes.
274+
const newOptions = eventsForCategory(category, newUseFirebase)
275+
if (newOptions.length > 0) {
276+
setType(newOptions[0].type)
277+
} else {
278+
// If the new client has no events for this category, switch to Custom.
279+
setCategory(Category.Custom)
280+
setType(EventType.CustomEvent)
281+
}
266282
}}
267283
name="use firebase"
268284
color="primary"
@@ -430,9 +446,15 @@ const EventBuilder: React.FC = () => {
430446
value={category}
431447
onChange={(_event, value) => {
432448
setCategory(value as Category)
433-
const events = eventsForCategory(value as Category)
434-
if (events.length > 0) {
435-
setType(events[0].type)
449+
const newOptions = eventsForCategory(
450+
value as Category,
451+
useFirebase
452+
)
453+
if (newOptions.length > 0) {
454+
setType(newOptions[0].type)
455+
} else {
456+
setCategory(Category.Custom)
457+
setType(EventType.CustomEvent)
436458
}
437459
}}
438460
renderInput={params => (
@@ -467,7 +489,7 @@ const EventBuilder: React.FC = () => {
467489
autoComplete
468490
autoHighlight
469491
autoSelect
470-
options={eventsForCategory(category).map(e => e.type)}
492+
options={eventOptions.map(e => e.type)}
471493
getOptionLabel={eventType => eventType}
472494
value={type}
473495
onChange={(_event, value) => {

src/components/ga4/EventBuilder/useInputs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const useInputs = (categories: Category[]) => {
1414
)
1515

1616
const [useTextBox, setUseTextBox] = useHydratedPersistantBoolean(
17-
StorageKey.eventBuilderUseFirebase,
17+
StorageKey.eventBuilderUseTextBox,
1818
UrlParam.UseTextBox,
1919
false
2020
)

src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ export enum StorageKey {
243243
eventBuilderTimestampMicros = "ga4/event-builder/timestamp-micros",
244244
eventBuilderNonPersonalizedAds = "ga4/event-builder/non-personalized-ads",
245245
eventBuilderUseFirebase = "ga4/event-builder/use-firebase",
246+
eventBuilderUseTextBox = "ga4/event-builder/use-text-box",
246247
ga4EventBuilderEvents = "ga4/event-builder/events",
247248
ga4EventBuilderLastEventType = "ga4/event-builder/last-event-type",
248249
ga4EventBuilderParameters = "ga4/event-builder/parameters",

0 commit comments

Comments
 (0)