tutorbookapp/tutorbook

View on GitHub
components/segment.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import { useEffect, useRef } from 'react';
import { SegmentAnalytics } from '@segment/analytics.js-core';
import { dequal } from 'dequal/lite';

import Intercom from 'lib/intercom';
import { useOrg } from 'lib/context/org';
import { useUser } from 'lib/context/user';

declare global {
  interface Window {
    analytics: SegmentAnalytics.AnalyticsJS;
  }
}

export interface SegmentProps {
  intercom?: boolean;
}

export default function Segment({ intercom }: SegmentProps): null {
  const { org } = useOrg();
  const { user } = useUser();

  const prevIdentity = useRef<Record<string, unknown>>();
  useEffect(() => {
    const identity = user.toSegment();
    if (dequal(prevIdentity.current, identity)) return;
    if (user.id) window.analytics?.alias(user.id);
    window.analytics?.identify(user.id, identity);
    prevIdentity.current = identity;
  }, [user]);

  useEffect(() => {
    Intercom('update', {
      user_hash: user.hash,
      hide_default_launcher: !intercom,
    });
  }, [user.hash, intercom]);

  const prevGroup = useRef<Record<string, unknown>>();
  useEffect(() => {
    const group = org?.toSegment();
    if (!org || !group || dequal(prevGroup.current, group)) return;
    // The `orgId` prop is required for Segment to create Mixpanel groups.
    // @see {@link https://bit.ly/3kWrJPw}
    window.analytics?.group(org.id, { ...group, orgId: group.id });
    prevGroup.current = group;
  }, [org]);

  return null;
}