@goodhood/tracking
Declarative tracking for react apps
Split up tracking payload setup from the actual tracking call. Avoids leaking data across the whole app.
npm i @goodhood/tracking
import { TrackingProvider } from '@goodhood/tracking';
const handleEvent = (payload) => {
sendAnalyticsEvent(payload);
};
<TrackingProvider onEvent={handleEvent}>
...
</TrackingProvider>
npm run start
trackingProvider.track(payload)
event
keyuseTrack
returns a function that forwards to trackingProvider.track(payload)
import { useTrack } from '@goodhood/tracking';
export default {
const track = useTrack();
return (
<button
type="button"
onClick={() => { track({ event: 'button-clicked' }); }}
>
track now
</button>
);
}
class ClassComponent extends PureComponent {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.provider.track({ event: 'button-clicked' });
}
render() {
return (
<>
<Provider ref={(provider) => { this.provider = provider; }} />
<button type="button" onClick={this.handleClick} className="ui-button ui-button-primary">
press me to track (check console)
</button>
</>
);
}
}
TrackingTrigger
accepts any kind of props. All props will be forwarded as payload to track(payload)
.
import { TrackingTrigger } from '@goodhood/tracking';
<TrackingTrigger event="pageload" additional-data={123} />
<Provider email="fun@mail.at">
<Provider funnel="Post creation" any-kind-of-prop="oh yes">
<TrackButton />
</Provider>
</Provider>
TrackingProvider
TrackingProvider
accepts the following props:
onEvent
: Called whenever the provider receives a track(payload)
call. Either directly or coming from a TrackingProvider
inside children.transform
: Allows to change payloads before they are sent to the parent TrackingProvider
(or to onEvent
) (check stories for detailed examples)TrackingProvider
allows imperative access to:
track(payload)
as described above