This library is used to track impressions using a react useImpressionTracker hook.
See unit tests for a detailed example for both the React Hook and Higher Order Component (HOC).
import{useImpressionTracker}from'impression-tracker-react-hook';import{createEventLogger}from'promoted-snowplow-logger';exportconsthandleError=process.env.NODE_ENV!=='production' ? (err)=>{throwerr;} : console.error;exportconsteventLogger=createEventLogger({enabled: true,
handleError,});constHookedExampleComponent=({// Set insertionId and/or contentId.
insertionId,
contentId,}: Props)=>{// ref needs to be set on the div to observe.// impressionId can be passed directly into a logAction call.// logImpressionFunctor can be called to force an impression.const[ref,impressionId,logImpressionFunctor]=useImpressionTracker({enable: true,
insertionId,
contentId,
handleError,logImpression: eventLogger.logImpression,});return<divref={ref}>{text}</div>;};interfaceProps{
...
// TODO - set this ref on the div.impressionRef: (node?: Element|null)=>void;// Optional props.impressionId: string;// In case you want to log an impression early.logImpressionFunctor: ()=>void;}classExampleComponentextendsReact.Component<Props>{
...
render(){
...
return<divref={this.props.impressionRef}>{text}</div>;}}constWrappedExampleComponent=withImpressionTracker(ExampleComponent,{
handleError,isEnabled: ()=>impressionLoggingEnabled,getContentId: props=>props.contentId,getInsertionId: props=>props.insertionId,// Can be changed to modify the impression.logImpression: eventLogger.logImpression,});constWrappedExampleComponent=compose(
...,composableImpressionTracker({
handleError,isEnabled: ()=>impressionLoggingEnabled,getContentId: props=>props.contentId,getInsertionId: props=>props.insertionId,// Can be changed to modify the impression.logImpression: eventLogger.logImpression,}))(ExampleComponent);Uses
- TypeScript support
- React support
- CSS Modules with PostCSS
- ESLint (with React and Prettier)
- Unit tests (Jest and Testing Library)
- Minified output with Terser
- Bundle size validation with size-limit
- Flexible builds with Rollup
- CHANGELOG.md template
- Run most commands:
npm run finish - Build the project:
npm run build- Validate output bundle size with
npm run size
- Validate output bundle size with
- Lint the project:
npm run lint - Run unit tests:
npm testornpm test
Broken - We previously had an npm run updateLink command to use npm link for local development. This fails with a Error: Cannot find module 'react'.
For now, just copy/paste the impression tracker code into the client code and test it out.
We use a GitHub action that runs semantic-release to determine how to update versions. Just do a normal code review and this should work. Depending on the message prefixes (e.g. feat: , fix: , clean: , docs: ), it'll update the version appropriately.
When doing a breaking change, add BREAKING CHANGE: to the PR. The colon is important.
The base of this repository is a combination of the following repos: