Giter VIP home page Giter VIP logo

Comments (2)

KrzysztofMadejski avatar KrzysztofMadejski commented on July 26, 2024 4

Implementing it was quite fast:

import { MatomoProvider, createInstance } from '@datapunt/matomo-tracker-react';
import { getRuntimeEnvVar } from 'helpers';
import { useEffect } from 'react';
import { useLocation } from 'react-router';

export const createClient = () => {
  const host = getRuntimeEnvVar('REACT_APP_RUNTIME_MATOMO_HOST');
  const siteId = parseInt(getRuntimeEnvVar('REACT_APP_RUNTIME_MATOMO_SITE_ID'));

  return createInstance({
    urlBase: host,
    siteId: siteId,
    // userId: 'UID76903202', // optional, default value: `undefined`. // TODO CDC-1389
    trackerUrl: `${host}/piwik.php`, // optional, default value: `${urlBase}matomo.php`
    srcUrl: `${host}/piwik.js`, // optional, default value: `${urlBase}matomo.js`
    heartBeat: { // optional, enabled by default
      active: true, // optional, default value: true
      seconds: 30 // optional, default value: `15
    },
    linkTracking: true, // optional, default value: true
    configurations: { // optional, default value: {}
      // any valid matomo configuration, all below are optional
      // disableCookies: true,
      setSecureCookie: true,
      setRequestMethod: 'POST'
      // TODO POST is default, but we would need to setup CORS: https://developer.matomo.org/api-reference/tracking-javascript
    }
  })
}

/**
 * MatomoRouterProvider provides Matomo hooks for children components
 * and it tracks page views on location change.
 * 
 * It should be embedded within <Router>
 */
export const MatomoRouterProvider = (
  {children}: {children: JSX.Element}) => {
  const isEnabled = getRuntimeEnvVar('REACT_APP_RUNTIME_MATOMO_ENABLED');
 
  if (!isEnabled) {
    return children;
  }

  const matomoClient = createClient();

  let location = useLocation();
  useEffect(() => {
    // track page view on each location change
    matomoClient.trackPageView()
  }, [location]);

  return (
    <MatomoProvider value={matomoClient}>
      {children}
    </MatomoProvider>
  )
}

/**
 * withMatomo is an HOC to wrap other component in order to provide Matomo to children
 * 
 * It does not integrate with react-router
 * 
 * @param Child 
 */
export const withMatomo = <T,>(Child: React.ComponentType<T>) => {
    const isEnabled = getRuntimeEnvVar('REACT_APP_RUNTIME_MATOMO_ENABLED');

    if (!isEnabled) {
      return Child;
    }

    const matomoClient = createClient();
  
    return (props: T) => (
        <MatomoProvider value={matomoClient}>
          <Child {...props}/>
        </MatomoProvider>
    );
}

from matomo-tracker.

jonkoops avatar jonkoops commented on July 26, 2024 1

We might be able to make this a separate package to connect the two together. At the moment we are busy with the new API design and migrating some internal applications, so this is on the back-burner for now.

As mentioned by @KrzysztofMadejski, it's pretty trivial to add this in the application code. So we are going to recommend doing so for now.

from matomo-tracker.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.