@atlaskit/analytics-next
Version:
React components, HOCs and hooks to assist with tracking user activity with React components
72 lines (68 loc) • 3.55 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePlatformLeafEventHandler = usePlatformLeafEventHandler;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = require("react");
var _useAnalyticsEvents2 = require("./useAnalyticsEvents");
var _useTrackedRef = require("./useTrackedRef");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
// WARNING: This hook will only function correctly for leaf node components - as in
// no children inside the component will require analytics themselves.
// Ignoring this warning will mean the analytics context of child components will not
// include the context of this component, .e.g, lost data.
// If you are going to have child components that require analytics use withAnalytics
// or AnalyticsContext component instead.
function usePlatformLeafEventHandler(_ref) {
var fn = _ref.fn,
action = _ref.action,
componentName = _ref.componentName,
actionSubject = _ref.actionSubject,
packageName = _ref.packageName,
packageVersion = _ref.packageVersion,
analyticsData = _ref.analyticsData;
var _useAnalyticsEvents = (0, _useAnalyticsEvents2.useAnalyticsEvents)(),
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
// We put analyticsData and fn in a ref so that we don't need to break
// memoization.
// Generally these could be defined by consumers inline
// and so we do this to avoid breaking memoization of useCallback
var dataRef = (0, _useTrackedRef.useTrackedRef)(analyticsData);
var fnRef = (0, _useTrackedRef.useTrackedRef)(fn);
var handler = (0, _react.useCallback)(function (value) {
var analyticsEvent = createAnalyticsEvent({
action: action,
actionSubject: actionSubject || componentName,
attributes: {
componentName: componentName,
packageName: packageName,
packageVersion: packageVersion
}
});
// To avoid wrapping this component in AnalyticsContext we manually
// push the parent context's meta data into the context.
// Note: this new 'context'
var context = _objectSpread({
componentName: componentName,
packageName: packageName,
packageVersion: packageVersion
}, dataRef.current);
analyticsEvent.context.push(context);
// fire an event on the atlaskit channel
var clone = analyticsEvent.clone();
if (clone) {
clone.fire('atlaskit');
}
fnRef.current(value, analyticsEvent);
}, [
// These are strings and won't change
action, componentName, actionSubject, packageName, packageVersion,
// This function is memoized in the context
createAnalyticsEvent,
// these are a stable ref because of the useTrackedRef hook
dataRef, fnRef]);
return handler;
}