Skip to content

Commit 7cae7ef

Browse files
committed
add timestamp_micros to user properties
1 parent 8ef6d7d commit 7cae7ef

8 files changed

Lines changed: 98 additions & 68 deletions

File tree

src/components/ga4/EventBuilder/Items.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ const Items: React.FC<Props> = ({
8282
addNumberParam={() => addItemNumberParam(idx)}
8383
removeParam={(itemIdx: number) => removeItemParam(idx, itemIdx)}
8484
removeItem={() => removeItem(idx)}
85+
setParamTimestamp={() => {}}
86+
isUserProperty={false}
8587
/>
8688
</WithHelpText>
8789
))}

src/components/ga4/EventBuilder/Parameter.tsx

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

3-
import { styled } from '@mui/material/styles';
43
import TextField from "@mui/material/TextField"
54
import { Parameter as ParameterT } from "./types"
65
import { ShowAdvancedCtx } from "."
7-
import { IconButton, Tooltip } from "@mui/material"
6+
import { IconButton, Tooltip, Grid } from "@mui/material"
87
import { Delete } from "@mui/icons-material"
98

10-
const PREFIX = 'Parameter';
11-
12-
const classes = {
13-
parameter: `${PREFIX}-parameter`
14-
};
15-
16-
const Root = styled('section')((
17-
{
18-
theme
19-
}
20-
) => ({
21-
[`&.${classes.parameter}`]: {
22-
display: "flex",
23-
"&> *": {
24-
flexGrow: 1,
25-
},
26-
"&> :not(:first-child)": {
27-
marginLeft: theme.spacing(1),
28-
},
29-
}
30-
}));
31-
329
interface Props {
3310
parameter: ParameterT
3411
setParamName: (name: string) => void
3512
setParamValue: (value: string) => void
13+
setParamTimestamp: (value: number) => void
3614
removeParam: () => void
15+
isUserProperty: boolean
3716
}
3817

3918
const Parameter: React.FC<Props> = ({
4019
parameter,
4120
setParamName,
4221
setParamValue,
22+
setParamTimestamp,
4323
removeParam,
24+
isUserProperty,
4425
}) => {
45-
4626
const showAdvanced = React.useContext(ShowAdvancedCtx)
4727

4828
const [name, setName] = React.useState(parameter.name)
4929
const [value, setValue] = React.useState(parameter.value || "")
30+
const [timestamp, setTimestamp] = React.useState(
31+
parameter.timestamp_micros?.toString() || ""
32+
)
5033

5134
const inputs = (
52-
<Root className={classes.parameter}>
53-
<TextField
54-
id={`#/events/0/params/${name}`}
55-
variant="outlined"
56-
size="small"
57-
value={name}
58-
onChange={e => setName(e.target.value)}
59-
onBlur={() => setParamName(name)}
60-
label="name"
61-
/>
62-
<TextField
63-
variant="outlined"
64-
size="small"
65-
value={value || ""}
66-
InputLabelProps={{
67-
...(parameter.exampleValue === undefined ? {} : { shrink: true }),
68-
}}
69-
onChange={e => setValue(e.target.value)}
70-
onBlur={() => setParamValue(value)}
71-
label={`${parameter.type} value`}
72-
placeholder={parameter.exampleValue?.toString()}
73-
/>
74-
</Root>
35+
<Grid container spacing={1}>
36+
<Grid item xs>
37+
<TextField
38+
id={`#/events/0/params/${name}`}
39+
variant="outlined"
40+
size="small"
41+
value={name}
42+
onChange={e => setName(e.target.value)}
43+
onBlur={() => setParamName(name)}
44+
label="name"
45+
fullWidth
46+
/>
47+
</Grid>
48+
<Grid item xs>
49+
<TextField
50+
variant="outlined"
51+
size="small"
52+
value={value || ""}
53+
InputLabelProps={{
54+
...(parameter.exampleValue === undefined ? {} : { shrink: true }),
55+
}}
56+
onChange={e => setValue(e.target.value)}
57+
onBlur={() => setParamValue(value)}
58+
label={`${parameter.type} value`}
59+
placeholder={parameter.exampleValue?.toString()}
60+
fullWidth
61+
/>
62+
</Grid>
63+
{isUserProperty && (
64+
<Grid item xs>
65+
<TextField
66+
variant="outlined"
67+
size="small"
68+
value={timestamp}
69+
onChange={e => setTimestamp(e.target.value)}
70+
onBlur={() => setParamTimestamp(parseInt(timestamp, 10))}
71+
label="timestamp micros"
72+
helperText="The timestamp to be applied to the user property. Optional."
73+
fullWidth
74+
/>
75+
</Grid>
76+
)}
77+
</Grid>
7578
)
7679
if (showAdvanced) {
7780
return (
78-
<section /* className={formClasses.trashRow} */>
79-
<Tooltip title="remove parameter">
80-
<IconButton onClick={removeParam}>
81-
<Delete />
82-
</IconButton>
83-
</Tooltip>
84-
{inputs}
85-
</section>
81+
<Grid container spacing={1} alignItems="flex-start">
82+
<Grid item>
83+
<Tooltip title="remove parameter">
84+
<IconButton onClick={removeParam}>
85+
<Delete />
86+
</IconButton>
87+
</Tooltip>
88+
</Grid>
89+
<Grid item xs>
90+
{inputs}
91+
</Grid>
92+
</Grid>
8693
)
8794
}
8895
return inputs

src/components/ga4/EventBuilder/Parameters.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,26 @@ interface Props {
3535
parameters: ParameterT[]
3636
setParamName: (idx: number, name: string) => void
3737
setParamValue: (idx: number, value: string) => void
38+
setParamTimestamp: (idx: number, value: number) => void
3839
addStringParam: () => void
3940
addNumberParam: () => void
4041
removeParam: (idx: number) => void
4142
removeItem?: () => void
4243
addItemsParam?: () => void
44+
isUserProperty: boolean
4345
}
4446

4547
const Parameters: React.FC<Props> = ({
4648
parameters,
4749
setParamName,
4850
setParamValue,
51+
setParamTimestamp,
4952
addStringParam,
5053
addNumberParam,
5154
removeParam,
5255
addItemsParam,
5356
removeItem,
57+
isUserProperty,
5458
}) => {
5559
const showAdvanced = React.useContext(ShowAdvancedCtx)
5660

@@ -62,7 +66,9 @@ const Parameters: React.FC<Props> = ({
6266
parameter={parameter}
6367
setParamName={name => setParamName(idx, name)}
6468
setParamValue={value => setParamValue(idx, value)}
69+
setParamTimestamp={timestamp => setParamTimestamp(idx, timestamp)}
6570
removeParam={() => removeParam(idx)}
71+
isUserProperty={isUserProperty}
6672
/>
6773
))}
6874
<section className={classes.buttonRow} >

src/components/ga4/EventBuilder/ValidateEvent/schemas/userProperties.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@ export const userPropertiesSchema = {
88
"type": "object",
99
"required": ["value"],
1010
"additionalProperties": false,
11-
1211
"properties": {
1312
"value": {
1413
"maxLength": 36
1514
},
16-
"timestamp_micros": {
17-
"type": "number",
18-
"maxLength": 36
19-
}
15+
"timestamp_micros": {}
2016
}
2117
}
2218
},

src/components/ga4/EventBuilder/ValidateEvent/usePayload.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,19 @@ const objectifyUserProperties = (acc: {}, p: Parameter) => {
2828
if (p.type === ParameterType.Number) {
2929
value = tryParseNum(value)
3030
}
31+
32+
if (p.name === "" || value === "" || value === undefined) {
33+
return acc
34+
}
35+
36+
const newProp: { value: any; timestamp_micros?: number } = { value }
37+
if (p.timestamp_micros) {
38+
newProp.timestamp_micros = p.timestamp_micros
39+
}
40+
3141
return {
3242
...acc,
33-
...(p.name !== "" && value !== "" && value !== undefined
34-
? {
35-
[p.name]: {
36-
value,
37-
},
38-
}
39-
: {}),
43+
[p.name]: newProp,
4044
}
4145
}
4246

src/components/ga4/EventBuilder/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const EventBuilder: React.FC = () => {
169169
removeUserProperty,
170170
setUserPropertyName,
171171
setUserPropertyValue,
172+
setUserPropertyTimestamp,
172173
} = useUserProperties()
173174

174175
const {
@@ -591,6 +592,8 @@ const EventBuilder: React.FC = () => {
591592
setParamName={setParamName}
592593
setParamValue={setParamValue}
593594
addItemsParam={items === undefined ? addItemsParam : undefined}
595+
setParamTimestamp={() => {}}
596+
isUserProperty={false}
594597
/>
595598
{items !== undefined && (
596599
<>
@@ -619,6 +622,8 @@ const EventBuilder: React.FC = () => {
619622
addNumberParam={addNumberUserProperty}
620623
setParamName={setUserPropertyName}
621624
setParamValue={setUserPropertyValue}
625+
setParamTimestamp={setUserPropertyTimestamp}
626+
isUserProperty={true}
622627
/>
623628
</>
624629
)}

src/components/ga4/EventBuilder/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,14 @@ export interface NumberParameter {
6767
name: string
6868
value: string | undefined
6969
exampleValue?: number
70+
timestamp_micros?: number
7071
}
7172
export interface StringParameter {
7273
type: ParameterType.String
7374
name: string
7475
value: string | undefined
7576
exampleValue?: string
77+
timestamp_micros?: number
7678
}
7779

7880
export type Parameter = NumberParameter | StringParameter

src/components/ga4/EventBuilder/useUserProperties.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,21 @@ const useUserProperties = () => {
4343
[updateUserProperty]
4444
)
4545

46+
const setUserPropertyTimestamp = useCallback(
47+
(idx: number, timestamp_micros: number) => {
48+
updateUserProperty(idx, old => ({ ...old, timestamp_micros }))
49+
},
50+
[updateUserProperty]
51+
)
52+
4653
return {
4754
userProperties: userProperties || [],
4855
addStringUserProperty,
4956
addNumberUserProperty,
5057
removeUserProperty,
5158
setUserPropertyValue,
5259
setUserPropertyName,
60+
setUserPropertyTimestamp,
5361
}
5462
}
5563

0 commit comments

Comments
 (0)