Skip to content

Commit

Permalink
refactor: alternative refactoring variant for event segments
Browse files Browse the repository at this point in the history
  • Loading branch information
PKulkoRaccoonGang committed Nov 23, 2023
1 parent 2d5d06a commit 03d8133
Show file tree
Hide file tree
Showing 14 changed files with 105 additions and 105 deletions.
73 changes: 0 additions & 73 deletions www/segment-constants.js
Original file line number Diff line number Diff line change
@@ -1,73 +0,0 @@
/**
* Events are identified by the following structured pattern:
* openedx.paragon.event_environment.event_name.event_action.
*
*/

export const sendSelectedIconCopy = (context) => {
global.analytics.track('openedx.paragon.docs.icons-table.selected-icon.copied', context);
};

export const sendLeaveFeedbackClick = () => {
global.analytics.track('openedx.paragon.docs.leave_feedback.clicked');
};

export const sendPlaygroundClick = () => {
global.analytics.track('openedx.paragon.docs.menu.playground.visit_playground.clicked');
};

export const sendContrastCheckerClick = () => {
global.analytics.track('openedx.paragon.docs.menu.tools.visit_contrast_checker.clicked');
};

export const sendPlaygroundUrlCopy = () => {
global.analytics.track('openedx.paragon.docs.playground.copy-url.copied');
};

export const sendPageEditBtnClick = () => {
global.analytics.track('openedx.paragon.docs.page_edit.clicked');
};

export const sendShadowGeneratorLayerEnabled = () => {
global.analytics.track('openedx.paragon.docs.elevation.shadow-generator.layer.enabled');
};

export const sendShadowGeneratorLayerDisabled = () => {
global.analytics.track('openedx.paragon.docs.elevation.shadow-generator.layer.disabled');
};

export const sendShadowGeneratorLayerRemoved = () => {
global.analytics.track('openedx.paragon.docs.elevation.shadow-generator.layer.removed');
};

export const sendShadowGeneratorLayerAdded = () => {
global.analytics.track('openedx.paragon.docs.elevation.shadow-generator.layer.added');
};

export const sendShadowGeneratorUpdated = (context) => {
global.analytics.track('openedx.paragon.docs.elevation.shadow-generator.updated', context);
};

export const sendInsightsTabClick = (tabTitle) => {
global.analytics.track(`openedx.paragon.docs.insights.tabs.${tabTitle.toLowerCase().trim()}.clicked`);
};

export const sendComponentUsageLinkClick = (context) => {
global.analytics.track('openedx.paragon.docs.usage-insights.component-usage-link.clicked', context);
};

export const sendSettingsVisibility = (isOpen) => {
global.analytics.track(`openedx.paragon.docs.settings.${isOpen ? 'opened' : 'closed'}`);
};

export const sendSettingsChange = (settingName, context) => {
global.analytics.track(`openedx.paragon.docs.settings.${settingName}.changed`, context);
};

export const sendExampleWithHeading = (collapseIsOpen, context) => {
global.analytics.track(`openedx.paragon.docs.ui.example-code-block.${collapseIsOpen ? 'closed' : 'opened'}`, context);
};

export const sendExampleWithoutHeading = (collapseIsOpen, context) => {
global.analytics.track(`openedx.paragon.docs.ui.example-code-block.${collapseIsOpen ? 'closed' : 'opened'}`, context);
};
26 changes: 26 additions & 0 deletions www/segment-events/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Events are identified by the following structured pattern:
* openedx.paragon.event_environment.event_name.event_action.
*/

export const ICON_COPIED = 'openedx.paragon.docs.icons-table.selected-icon.copied';
export const LEAVE_FEEDBACK_CLICKED = 'openedx.paragon.docs.leave_feedback.clicked';
export const PLAYGROUND_CLICKED = 'openedx.paragon.docs.menu.playground.visit_playground.clicked';
export const CONTRAST_CHECKER_CLICKED = 'openedx.paragon.docs.menu.tools.visit_contrast_checker.clicked';
export const PLAYGROUND_URL_COPIED = 'openedx.paragon.docs.playground.copy-url.copied';
export const PAGE_EDIT_BTN_CLICKED = 'openedx.paragon.docs.page_edit.clicked';
export const SHADOW_GENERATOR_LAYER_ENABLED = 'openedx.paragon.docs.elevation.shadow-generator.layer.enabled';
export const SHADOW_GENERATOR_LAYER_DISABLED = 'openedx.paragon.docs.elevation.shadow-generator.layer.disabled';
export const SHADOW_GENERATOR_LAYER_REMOVED = 'openedx.paragon.docs.elevation.shadow-generator.layer.removed';
export const SHADOW_GENERATOR_LAYER_ADDED = 'openedx.paragon.docs.elevation.shadow-generator.layer.added';
export const SHADOW_GENERATOR_LAYER_UPDATED = 'openedx.paragon.docs.elevation.shadow-generator.layer.updated';
export const COMPONENT_USAGE_LINK_CLICKED = 'openedx.paragon.docs.usage-insights.component-usage-link.clicked';
export const INSIGHTS_TAB_CLICKED = 'openedx.paragon.docs.insights.tab.clicked';
export const SETTINGS_OPENED = 'openedx.paragon.docs.settings.opened';
export const SETTINGS_CLOSED = 'openedx.paragon.docs.settings.closed';
export const SETTINGS_CHANGED = 'openedx.paragon.docs.setting.changed';
export const EXAMPLE_CODE_BLOCK_WITH_HEADING_CLOSED = 'openedx.paragon.docs.ui.example-code-block.closed';
export const EXAMPLE_CODE_BLOCK_WITH_HEADING_OPENED = 'openedx.paragon.docs.ui.example-code-block.opened';

export const EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_CLOSED = 'openedx.paragon.docs.ui.example-code-block.without-heading.closed';
export const EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_OPENED = 'openedx.paragon.docs.ui.example-code-block.without-heading.opened';
24 changes: 24 additions & 0 deletions www/segment-events/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
export {
ICON_COPIED,
LEAVE_FEEDBACK_CLICKED,
PLAYGROUND_CLICKED,
CONTRAST_CHECKER_CLICKED,
PLAYGROUND_URL_COPIED,
PAGE_EDIT_BTN_CLICKED,
SHADOW_GENERATOR_LAYER_ENABLED,
SHADOW_GENERATOR_LAYER_DISABLED,
SHADOW_GENERATOR_LAYER_REMOVED,
SHADOW_GENERATOR_LAYER_ADDED,
SHADOW_GENERATOR_LAYER_UPDATED,
COMPONENT_USAGE_LINK_CLICKED,
INSIGHTS_TAB_CLICKED,
SETTINGS_OPENED,
SETTINGS_CLOSED,
SETTINGS_CHANGED,
EXAMPLE_CODE_BLOCK_WITH_HEADING_CLOSED,
EXAMPLE_CODE_BLOCK_WITH_HEADING_OPENED,
EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_CLOSED,
EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_OPENED,
} from './constants';

export { sendUserAnalyticsEvent } from './utils';
9 changes: 9 additions & 0 deletions www/segment-events/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
function sendUserAnalyticsEvent(eventName, context) {
if (context) {
return global.analytics.track(eventName, context);
}

return global.analytics.track(eventName);
}

module.exports = { sendUserAnalyticsEvent };
14 changes: 11 additions & 3 deletions www/src/components/CodeBlock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,13 @@ import { FormattedMessage, useIntl } from 'react-intl';
import * as ParagonReact from '~paragon-react';
import * as ParagonIcons from '~paragon-icons';
import { ContentCopy } from '~paragon-icons';
import { sendExampleWithHeading, sendExampleWithoutHeading } from '../../segment-constants';
import {
EXAMPLE_CODE_BLOCK_WITH_HEADING_CLOSED,
EXAMPLE_CODE_BLOCK_WITH_HEADING_OPENED,
EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_CLOSED,
EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_OPENED,
sendUserAnalyticsEvent,
} from '../../segment-events';
import MiyazakiCard from './exampleComponents/MiyazakiCard';
import HipsterIpsum from './exampleComponents/HipsterIpsum';
import ExamplePropsForm from './exampleComponents/ExamplePropsForm';
Expand Down Expand Up @@ -65,14 +71,16 @@ function CollapsibleLiveEditor({ children, clickToCopy, handleCodeChange }: Coll
const headingElement = getCodeBlockHeading(e.target);

if (!headingElement) {
sendExampleWithoutHeading(collapseIsOpen, {
sendUserAnalyticsEvent(collapseIsOpen
? EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_CLOSED : EXAMPLE_CODE_BLOCK_WITHOUT_HEADING_OPENED, {
value: `${componentNameAndCategory}id-not-generated`,
});

return;
}

sendExampleWithHeading(collapseIsOpen, {
sendUserAnalyticsEvent(collapseIsOpen
? EXAMPLE_CODE_BLOCK_WITH_HEADING_CLOSED : EXAMPLE_CODE_BLOCK_WITH_HEADING_OPENED, {
value: `${componentNameAndCategory}${headingElement.id}`,
});
};
Expand Down
4 changes: 2 additions & 2 deletions www/src/components/IconsTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import debounce from 'lodash.debounce';
import { Icon, SearchField, Toast } from '~paragon-react';
import * as IconComponents from '~paragon-icons';
import { sendSelectedIconCopy } from '../../segment-constants';
import { ICON_COPIED, sendUserAnalyticsEvent } from '../../segment-events';

const WINDOW_HEIGHT = 2400;
const ROW_HEIGHT = 100;
Expand Down Expand Up @@ -76,7 +76,7 @@ function IconsTable({ iconNames }) {
const copyToClipboard = (content) => {
navigator.clipboard.writeText(content);
setShowToast(true);
sendSelectedIconCopy({ name: currentIcon });
sendUserAnalyticsEvent(ICON_COPIED, { name: currentIcon });
};

const handleChangeSearchValue = useMemo(() => debounce(setSearchValue, 500, { leading: false }), []);
Expand Down
4 changes: 2 additions & 2 deletions www/src/components/LeaveFeedback.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { AnchorHTMLAttributes } from 'react';
import PropTypes from 'prop-types';
import { Nav, Button, Hyperlink } from '~paragon-react';
import { useLocation } from '@reach/router';
import { sendLeaveFeedbackClick } from '../../segment-constants';
import { LEAVE_FEEDBACK_CLICKED, sendUserAnalyticsEvent } from '../../segment-events';

export interface LeaveFeedbackProps extends Partial<AnchorHTMLAttributes<HTMLAnchorElement>> {
isNavLink?: boolean;
Expand All @@ -13,7 +13,7 @@ function LeaveFeedback({ isNavLink, ...props }: LeaveFeedbackProps) {
const FEEDBACK_URL = `https://github.com/openedx/paragon/issues/new?title=%5Bparagon-openedx.netlify.app%5D%20Feedback%20(on%20${location.pathname})&amp;labels=docs&template=feedback_template.md`;
const leaveFeedbackLinkTitle = 'Leave feedback';

const handleLinkFeedbackClick = () => sendLeaveFeedbackClick();
const handleLinkFeedbackClick = () => sendUserAnalyticsEvent(LEAVE_FEEDBACK_CLICKED);

if (isNavLink) {
return (
Expand Down
6 changes: 3 additions & 3 deletions www/src/components/Menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import classNames from 'classnames';
import Search from './Search';
import { SettingsContext } from '../context/SettingsContext';
import { THEMES } from '../../theme-config';
import { sendPlaygroundClick, sendContrastCheckerClick } from '../../segment-constants';
import { PLAYGROUND_CLICKED, sendUserAnalyticsEvent, CONTRAST_CHECKER_CLICKED } from '../../segment-events';
import { FOUNDATION_PAGES } from '../config';

// MDX transforms markdown generated by gatsby-transformer-react-docgen
Expand Down Expand Up @@ -146,9 +146,9 @@ function MenuComponentListCategory({ children, title }: IMenuComponentListCatego
);
}

const handlePlaygroundClick = () => sendPlaygroundClick();
const handlePlaygroundClick = () => sendUserAnalyticsEvent(PLAYGROUND_CLICKED);

const handleContrastCheckerClick = () => sendContrastCheckerClick();
const handleContrastCheckerClick = () => sendUserAnalyticsEvent(CONTRAST_CHECKER_CLICKED);

MenuComponentListCategory.propTypes = {
children: PropTypes.node.isRequired,
Expand Down
4 changes: 2 additions & 2 deletions www/src/components/PageEditBtn/index.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { AnchorHTMLAttributes } from 'react';
import PropTypes from 'prop-types';
import { Button, Hyperlink, Nav } from '~paragon-react';
import { sendPageEditBtnClick } from '../../../segment-constants';
import { PAGE_EDIT_BTN_CLICKED, sendUserAnalyticsEvent } from '../../../segment-events';

export interface PageEditBtnProps extends Partial<AnchorHTMLAttributes<HTMLAnchorElement>> {
githubEditPath?: string,
Expand All @@ -11,7 +11,7 @@ export interface PageEditBtnProps extends Partial<AnchorHTMLAttributes<HTMLAncho
function PageEditBtn({ githubEditPath, isNavLink, ...props }: PageEditBtnProps) {
const pageEditLinkTitle = 'Edit this page';

const handlePageEditBtnClick = () => sendPageEditBtnClick();
const handlePageEditBtnClick = () => sendUserAnalyticsEvent(PAGE_EDIT_BTN_CLICKED);

if (isNavLink) {
return (
Expand Down
6 changes: 4 additions & 2 deletions www/src/components/insights/UsagesList.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Hyperlink } from '~paragon-react';
import { sendComponentUsageLinkClick } from '../../../segment-constants';
import { COMPONENT_USAGE_LINK_CLICKED, sendUserAnalyticsEvent } from '../../../segment-events';

type UsagesType = {
filePath: string,
Expand All @@ -22,7 +22,9 @@ export default function UsagesList({
projectName,
} : UsagesListPropTypes) {
const handleUsageLinkClick = (linkToUsage) => {
sendComponentUsageLinkClick({ project: projectName, component: componentName, linkToUsage });
sendUserAnalyticsEvent(COMPONENT_USAGE_LINK_CLICKED, {
project: projectName, component: componentName, linkToUsage,
});
};

return (
Expand Down
8 changes: 5 additions & 3 deletions www/src/context/SettingsContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import { IntlProvider } from 'react-intl';
import { messages } from '~paragon-react';

import { THEMES, DEFAULT_THEME } from '../../theme-config';
import { sendSettingsVisibility, sendSettingsChange } from '../../segment-constants';
import {
SETTINGS_OPENED, SETTINGS_CLOSED, SETTINGS_CHANGED, sendUserAnalyticsEvent,
} from '../../segment-events';

export interface IDefaultValue {
settings: {
Expand Down Expand Up @@ -45,12 +47,12 @@ function SettingsContextProvider({ children }) {
}
setSettings(prevState => ({ ...prevState, [key]: value }));
global.localStorage.setItem('pgn__settings', JSON.stringify({ ...settings, [key]: value }));
sendSettingsChange(key, { [key]: value });
sendUserAnalyticsEvent(SETTINGS_CHANGED, { [key]: value });
};

const toggleSettings = (value: boolean) => {
setShowSettings(value);
sendSettingsVisibility();
sendUserAnalyticsEvent(value ? SETTINGS_OPENED : SETTINGS_CLOSED);
};

// this hook will be called after the first render, so we can safely access localStorage
Expand Down
23 changes: 12 additions & 11 deletions www/src/pages/foundations/elevation.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@ import SEO from '../../components/SEO';
import Layout from '../../components/PageLayout';
import { SettingsContext } from '../../context/SettingsContext';
import {
sendShadowGeneratorLayerAdded,
sendShadowGeneratorLayerDisabled,
sendShadowGeneratorLayerEnabled,
sendShadowGeneratorLayerRemoved,
sendShadowGeneratorUpdated,
} from '../../../segment-constants';
sendUserAnalyticsEvent,
SHADOW_GENERATOR_LAYER_DISABLED,
SHADOW_GENERATOR_LAYER_ENABLED,
SHADOW_GENERATOR_LAYER_REMOVED,
SHADOW_GENERATOR_LAYER_ADDED,
SHADOW_GENERATOR_LAYER_UPDATED,
} from '../../../segment-events';

const boxShadowSides = ['down', 'up', 'right', 'left', 'centered'];
const boxShadowLevels = [1, 2, 3, 4, 5];
Expand Down Expand Up @@ -93,7 +94,7 @@ function BoxShadowToolkit({
});

const updateBoxShadowModel = (property, value) => {
sendShadowGeneratorUpdated({ property, value });
sendUserAnalyticsEvent(SHADOW_GENERATOR_LAYER_UPDATED, { property, value });

const newBoxShadowModel = {
...boxShadowModel,
Expand Down Expand Up @@ -203,20 +204,20 @@ function BoxShadowGenerator() {
};

const addNewBoxShadowLayer = () => {
sendShadowGeneratorLayerAdded();
sendUserAnalyticsEvent(SHADOW_GENERATOR_LAYER_ADDED);
setBoxShadows([
...boxShadows,
{ id: boxShadows[boxShadows.length - 1].id + 1, enabled: true, style: DEFAULT_BOX_SHADOW },
]);
};

const removeBoxShadowLayer = (toolkitId) => {
sendShadowGeneratorLayerRemoved();
sendUserAnalyticsEvent(SHADOW_GENERATOR_LAYER_REMOVED);
setBoxShadows(boxShadows.filter((shadow) => shadow.id !== toolkitId));
};

const disableBoxShadowLayer = (toolkitId) => {
sendShadowGeneratorLayerDisabled();
sendUserAnalyticsEvent(SHADOW_GENERATOR_LAYER_DISABLED);
const updatedBoxShadows = boxShadows
.map((shadow) => {
if (shadow.id === toolkitId) {
Expand All @@ -228,7 +229,7 @@ function BoxShadowGenerator() {
};

const enableBoxShadowLayer = (toolkitId) => {
sendShadowGeneratorLayerEnabled();
sendUserAnalyticsEvent(SHADOW_GENERATOR_LAYER_ENABLED);
const updatedBoxShadows = boxShadows
.map((shadow) => {
if (shadow.id === toolkitId) {
Expand Down
5 changes: 3 additions & 2 deletions www/src/pages/insights.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ import ComponentsUsage from '../components/insights/ComponentsUsage';

// @ts-ignore
import dependentProjectsAnalysis from '../../../dependent-usage.json'; // eslint-disable-line
import { sendInsightsTabClick } from '../../segment-constants';

import { sendUserAnalyticsEvent, INSIGHTS_TAB_CLICKED } from '../../segment-events';
import { INSIGHTS_TABS, INSIGHTS_PAGES } from '../config';
import componentsUsage from '../utils/componentsUsage';
import { IInsightsContext } from '../types/types';
Expand Down Expand Up @@ -64,7 +65,7 @@ export default function InsightsPage({ pageContext: { tab, githubEditPath } }: I

const handleOnSelect = (value: string) => {
if (value !== tab) {
sendInsightsTabClick(value);
sendUserAnalyticsEvent(INSIGHTS_TAB_CLICKED, { tabName: value });
navigate(INSIGHTS_PAGES.find(item => item.tab === value).path);
}
};
Expand Down
4 changes: 2 additions & 2 deletions www/src/pages/playground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import localforage from 'localforage';
import SEO from '../components/SEO';
import { SiteTitle } from '../components/header';
import { storageKey } from '../../playroom/constants';
import { sendPlaygroundUrlCopy } from '../../segment-constants';
import { PLAYGROUND_URL_COPIED, sendUserAnalyticsEvent } from '../../segment-events';

const FEEDBACK_URL = 'https://github.com/openedx/paragon/issues/new?assignees=&labels=playground&template=feedback_template.md&title=[Playground]';

Expand Down Expand Up @@ -74,7 +74,7 @@ export default function Playground({ location }) {
onClick={() => {
setCopyUrlState('copied');
navigator.clipboard.writeText(location.href);
sendPlaygroundUrlCopy();
sendUserAnalyticsEvent(PLAYGROUND_URL_COPIED);
}}
labels={{
default: 'Copy URL',
Expand Down

0 comments on commit 03d8133

Please sign in to comment.