src/hooks/analytics/tools/lunchbox.js

import "core-js/modules/es.object.from-entries";
import {config, constants} from "utils";
import facebookPixel from "./facebookPixel";
import googleTagManager from "./googleTagManager";
import segment from "./segment";

const {
  ANALYTICS: {
    APPSFLYER,
    FACEBOOK_PIXEL,
    GOOGLE_ANALYTICS,
    GOOGLE_TAG_MANAGER,
    HOTJAR,
    SEGMENT,
    SMARTLOOK,
  },
} = constants;

// Available tools for clients to use with our platform
const availableTools = [
  APPSFLYER,
  FACEBOOK_PIXEL,
  GOOGLE_ANALYTICS,
  GOOGLE_TAG_MANAGER,
  HOTJAR,
  SEGMENT,
  SMARTLOOK,
];

// Check which tools are enabled from client config
const enabledTools = availableTools.filter(
  (thirdPartyApp) => !!config?.apps[thirdPartyApp],
);

const enabledToolsHash = Object.fromEntries(
  enabledTools.map((tool) => [tool, config?.apps[tool]]),
);

/**
 * Lunchbox Tools Execute Event
 * Only calls events for client enabled tools
 */
const runEvent = ({event, payload}) =>
  enabledTools.forEach((tool) => {
    switch (tool) {
      case FACEBOOK_PIXEL:
        return facebookPixel(event, payload);
      case GOOGLE_TAG_MANAGER:
        return googleTagManager(event, payload);
      case SEGMENT:
        return segment(event, payload);
      default:
        return null;
    }
  });

/**
 * Lunchbox Tools Event Handler
 * Execute an event after initialization or add to a window queue
 */
const eventHandler = (event) => (payload) => {
  const data = {event, payload};

  if (!window.lbxTools) {
    window.lbxTools = {
      ...window.lbxTools,
      queue: [],
    };
    return window.lbxTools.queue.push(data);
  }

  runEvent(data);
};

/**
 * Lunchbox Tools Initialization Event
 * Execute queued events
 */
window.addEventListener("lbxInit", () => {
  const queue = window.lbxTools?.queue || [];
  queue.forEach((data) => runEvent(data));
  window.lbxTools = {
    initialized: true,
    queue: [],
  };
});

export {enabledTools, enabledToolsHash, eventHandler};