Skip to content

Commit 647574d

Browse files
authored
Merge branch 'main' into redirect-fix
2 parents 66b4264 + fa16055 commit 647574d

11 files changed

Lines changed: 114 additions & 51 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public
6262
.DS_Store
6363

6464
# Yarn
65+
yarn.lock
6566
yarn-error.log
6667
.pnp/
6768
.pnp.js

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@
105105
"react-server-dom-webpack@0.0.0-experimental-c8b778b7f-20220825": {
106106
"react": "^18.2.0"
107107
}
108+
},
109+
"resolutions": {
110+
"@types/react": "^18.2.0",
111+
"@types/react-dom": "^18.2.0"
108112
},
109113
"scripts": {
110114
"lint": "eslint 'src/**/*' 'lib/**/*' 'gatsby/**/*'",

src/components/ExternalLink.tsx

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import * as React from "react"
22

3-
import { styled } from '@mui/material/styles';
3+
import { styled } from "@mui/material/styles"
44

5-
import { Tooltip } from "@mui/material"
5+
import { Tooltip } from "@mui/material"
66

77
import { Launch } from "@mui/icons-material"
88
import clsx from "classnames"
9-
import {PropsWithChildren} from 'react';
9+
import { PropsWithChildren } from "react"
1010

11-
const PREFIX = 'ExternalLink';
11+
const PREFIX = "ExternalLink"
1212

1313
const classes = {
1414
link: `${PREFIX}-link`,
1515
icon: `${PREFIX}-icon`,
16-
hover: `${PREFIX}-hover`
17-
};
16+
hover: `${PREFIX}-hover`,
17+
}
1818

19-
const Root = styled('div')(() => ({
19+
const Root = styled("span")(() => ({
2020
[`& .${classes.link}`]: {
2121
display: "inline-flex",
2222
alignItems: "center",
@@ -32,36 +32,40 @@ const Root = styled('div')(() => ({
3232
opacity: 1.0,
3333
},
3434
opacity: 0.3,
35-
}
36-
}));
35+
},
36+
}))
3737

3838
type Props = {
3939
href: string
4040
title?: string
4141
hover?: true | undefined
4242
}
4343

44-
const ExternalLink: React.FC<PropsWithChildren<Props>> = ({ href, title, children, hover }) => {
45-
44+
const ExternalLink: React.FC<PropsWithChildren<Props>> = ({
45+
href,
46+
title,
47+
children,
48+
hover,
49+
}) => {
4650
return (
47-
<Root>
48-
<Tooltip title={title || ""}>
49-
<a
50-
className={clsx({ [classes.hover]: hover }, classes.link)}
51-
href={href}
52-
target="_blank"
53-
rel="noreferrer"
54-
>
55-
{children}
56-
<Launch
57-
className={clsx({ [classes.icon]: children !== undefined })}
58-
color="action"
59-
fontSize={children === undefined ? undefined : "inherit"}
60-
/>
61-
</a>
62-
</Tooltip>
63-
</Root>
64-
);
51+
<Root>
52+
<Tooltip title={title || ""}>
53+
<a
54+
className={clsx({ [classes.hover]: hover }, classes.link)}
55+
href={href}
56+
target="_blank"
57+
rel="noreferrer"
58+
>
59+
{children}
60+
<Launch
61+
className={clsx({ [classes.icon]: children !== undefined })}
62+
color="action"
63+
fontSize={children === undefined ? undefined : "inherit"}
64+
/>
65+
</a>
66+
</Tooltip>
67+
</Root>
68+
)
6569
}
6670

6771
export default ExternalLink

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/ValidateEvent/useValidateEvent.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ const sendHit = async (
5555
instanceId: InstanceId,
5656
api_secret: string
5757
): Promise<void> => {
58-
const url = `https://www.google-analytics.com/mp/collect?${instanceQueryParamFor(
58+
const url = `https://www.google-analytics.com/mp/collect?api_secret=${api_secret}${instanceQueryParamFor(
5959
instanceId
60-
)}&api_secret=${api_secret}`
60+
)}`
6161
const body = Object.assign({}, payload, {
6262
validationBehavior: "ENFORCE_RECOMMENDATIONS",
6363
})

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) => {

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)