utils/customEvent.js

/**
 * Module for dispatching events from an HTML element
 *
 * @module customEvent
 * @prop STICKY_ATTACHED - name of event fired when a sticky element is attached
 * @prop STICKY_DETACHED - name of event fired when a sticky element is detached
 */
const customEvent = {
	IN_VIEW: 'inView',
	IN_BOUNDS: 'inBounds',
	LOADED: 'loaded',
	MORE_LOADED: 'moreLoaded',
	STICKY_ATTACHED: 'stickyAttached', // when sticky element is first attached
	STICKY_DETACHED: 'stickyDetached', // when sticky element has been completely detached
	STICKY_ON: 'stickyOn', // when an attached sticky element is visually stuck
	STICKY_OFF: 'stickyOff', // when an attached sticky element is visually unstuck
	REGION_CHANGE: 'regionChange',
	NAV_TRANSITIONED: 'navTransitioned',
	NAV_TITLE_AND_SOCIAL: 'navTitleAndSocial',
	TRANSITION_COMPLETED: 'transitionCompleted',
	AUTO_PLAY_FAILED: 'autoPlayFailed',
	SNACKBAR_DISMISSED: 'snackbarDismissed',
	SNACKBAR_ACCEPTED: 'snackbarAccepted',
	VIDEO_PLAYER_READY: 'videoReady',
	SCROLL_DIRECTION_CHANGED: 'scrollDirectionChanged',
	SCROLLED_TO_TOP: 'scrolledToTop',
	SCROLLED: 'scrolled',

	/**
	 * Register ad related data to be retrieved for ad bidding.
	 * @method fire
	 * @param {HTMLElement} target - Element to trigger event for
	 * @param {String} name - name of event
	 * @param {Object} data - details to be fired with event
	 */
	fire( target, name, data ) {
		let evt;
		if ( 'function' === typeof CustomEvent ) {
			evt = new CustomEvent( name, {
				detail: data,
			});
		} else {
			evt = window.document.createEvent( 'Event' );
			evt.initEvent( name, true, true );
			evt.detail = data;
		}

		target.dispatchEvent( evt );
	},
};

export default customEvent;