docbrown/app/javascript/packs/articlePage.jsx
Ridhwana 9dee48dbc2
Add tracking for the registration flow - "Clicked on Create Account" (#18459)
* refactor: move trackEvents to a utilities folder so that it can be re-used

* feat: add a function called trackCommentClicks and use it on the articlePage

* feat: update the auth widget to take the correct properties

* feat: add create account tracking method for hamburger

* feat: add create account tracking method for sidebar left

* feat: whoops, sidebar tracking info added

* feat: add the feed card create account tracking

* feat: whoops add the id to the dom

* feat: add top nav create account tracking

* feat: create account tracking for the registration modal

* fix: callback instead of invoking + rename class

* fix: js-prepend

* feat: some showLogin event tracking

* use the tracking propert

* x - feed.jsx

* fix: oops I removed hidden

* track from the search login

* feat: add tracking for follow button

* fix: main_stories is only being called in view/articles and both are including the FollowButtons pack

* comments track

* feat: remove punc (.)

* chore: cahnge working

* chore: remove tracking-id from modal

* feat: remove ecmascript features

* refactor: rename some events

* feat: referrer page

* feat: add a secondary source for the follow buttons

* feat: remove file that is not used

* chore: rename key

* feat: use @utilities

* feat: add spec for create account clicks

* feat: add key referrer

* fix: tests

* fix: oops

* chore: add commented test

* test for tracking

* feat: update the change by 1

* feat: aggregate_failures

* feat: add data-no-instant back

* feat: try a different way of testing

* refactor: change secondary_source to referring_souce

* feat: change ahoy event test

* feat: add a version number to ahoy tracking

* feat: change the href to pathname

* feat: reply comment tracking

* fix: to be present syntax

* feat: use href instead of pathname

* chore: do not track tags and podcasts follow and remove referrer

* feat: add readinglist

* fix: remove referrer from test

* feat: fail gracefully in instances where there is no tracking data
2022-09-22 16:03:49 +02:00

164 lines
5.2 KiB
JavaScript

import { h, render } from 'preact';
import ahoy from 'ahoy.js';
import { Snackbar, addSnackbarItem } from '../Snackbar';
import { addFullScreenModeControl } from '../utilities/codeFullscreenModeSwitcher';
import { initializeDropdown } from '../utilities/dropdownUtils';
import { embedGists } from '../utilities/gist';
import { initializeUserSubscriptionLiquidTagContent } from '../liquidTags/userSubscriptionLiquidTag';
import { trackCommentClicks } from '@utilities/ahoy/trackEvents';
import { isNativeAndroid, copyToClipboard } from '@utilities/runtime';
const animatedImages = document.querySelectorAll('[data-animated="true"]');
if (animatedImages.length > 0) {
import('@utilities/animatedImageUtils').then(
({ initializePausableAnimatedImages }) => {
initializePausableAnimatedImages(animatedImages);
},
);
}
const fullscreenActionElements = document.getElementsByClassName(
'js-fullscreen-code-action',
);
if (fullscreenActionElements) {
addFullScreenModeControl(fullscreenActionElements);
}
// The Snackbar for the article page
const snackZone = document.getElementById('snack-zone');
if (snackZone) {
render(<Snackbar lifespan={3} />, snackZone);
}
// eslint-disable-next-line no-restricted-globals
top.addSnackbarItem = addSnackbarItem;
// Dropdown accessibility
function hideCopyLinkAnnouncerIfVisible() {
document.getElementById('article-copy-link-announcer').hidden = true;
}
// Initialize the share options
const shareDropdownButton = document.getElementById('article-show-more-button');
if (shareDropdownButton.dataset.initialized !== 'true') {
if (isNativeAndroid('shareText')) {
// Android native apps have enhanced sharing capabilities for Articles and don't use our standard dropdown
shareDropdownButton.addEventListener('click', () =>
AndroidBridge.shareText(location.href),
);
} else {
const { closeDropdown } = initializeDropdown({
triggerElementId: 'article-show-more-button',
dropdownContentId: 'article-show-more-dropdown',
onClose: hideCopyLinkAnnouncerIfVisible,
});
// We want to close the dropdown on link select (since they open in a new tab)
document
.querySelectorAll('#article-show-more-dropdown [href]')
.forEach((link) => {
link.addEventListener('click', (event) => {
closeDropdown(event);
});
});
}
shareDropdownButton.dataset.initialized = 'true';
}
// Initialize the copy to clipboard functionality
function showAnnouncer() {
document.getElementById('article-copy-link-announcer').hidden = false;
}
// Temporary Ahoy Stats for displaying comments section either on page load or after scrolling
function trackCommentsSectionDisplayed() {
const callback = (entries, observer) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
ahoy.track('Comment section viewable', { page: location.href });
observer.disconnect();
}
if (location.hash === '#comments') {
//handle focus event on text area
const element = document.getElementById('text-area');
const event = new FocusEvent('focus');
element.dispatchEvent(event);
}
});
};
const target = document.getElementById('comments');
const observer = new IntersectionObserver(callback, {});
observer.observe(target);
}
function copyArticleLink() {
const postUrlValue = document
.getElementById('copy-post-url-button')
.getAttribute('data-postUrl');
copyToClipboard(postUrlValue).then(() => {
showAnnouncer();
});
}
document
.getElementById('copy-post-url-button')
?.addEventListener('click', copyArticleLink);
// Comment Subscription
getCsrfToken().then(async () => {
const { user = null, userStatus } = document.body.dataset;
const root = document.getElementById('comment-subscription');
const isLoggedIn = userStatus === 'logged-in';
if (!root) {
return;
}
try {
const {
getCommentSubscriptionStatus,
setCommentSubscriptionStatus,
CommentSubscription,
} = await import('../CommentSubscription');
const { articleId } = document.getElementById('article-body').dataset;
let subscriptionType = 'not_subscribed';
if (isLoggedIn && user !== null) {
({ config: subscriptionType } = await getCommentSubscriptionStatus(
articleId,
));
}
const subscriptionRequestHandler = async (type) => {
const message = await setCommentSubscriptionStatus(articleId, type);
addSnackbarItem({ message, addCloseButton: true });
};
render(
<CommentSubscription
subscriptionType={subscriptionType}
positionType="static"
onSubscribe={subscriptionRequestHandler}
onUnsubscribe={subscriptionRequestHandler}
isLoggedIn={isLoggedIn}
/>,
root,
);
} catch (e) {
root.innerHTML =
'<p className="color-accent-danger">Unable to load Comment Subscription component.<br />Try refreshing the page.</p>';
}
});
const targetNode = document.querySelector('#comments');
targetNode && embedGists(targetNode);
initializeUserSubscriptionLiquidTagContent();
// Temporary Ahoy Stats for comment section clicks on controls
trackCommentClicks('comments', 'Comment section click');
trackCommentsSectionDisplayed();