/**
* WordPress dependencies
*/
import { render } from '@safe-wordpress/element';
import domReady from '@safe-wordpress/dom-ready';
/**
* External dependencies
*/
import type { Post, PostId, PostStatus } from '@nelio-content/types';
/**
* External dependencies
*/
import {
PostEngagementAnalytics,
PostPageviewsAnalytics,
PremiumDialog,
} from '@nelio-content/components';
/**
* Internal dependencies
*/
import './style.scss';
import { SocialTimeline } from './social-timeline';
import { SocialMediaLink } from './social-media-link';
import { manageCustomStatuses } from './custom-status';
type Settings = {
readonly customStatuses: ReadonlyArray< PostStatus >;
};
export function initPage( { customStatuses }: Settings ): void {
initSocialFeatures();
initAnalyticsFeatures();
manageCustomStatuses( customStatuses );
}
function initSocialFeatures() {
domReady( () => {
const links = Array.from(
document.querySelectorAll< HTMLElement >(
'.nelio-content-share-post'
)
);
if ( ! links.length ) {
return;
}
const layout = document.createElement( 'div' );
document.body.appendChild( layout );
render(
<>
>,
layout
);
links
.map( ( l ) => [ l.dataset.postId, l ] as const )
.filter( ( l ): l is [ string, HTMLElement ] => !! l[ 0 ] )
.map( ( [ n, e ] ) => [ Number.parseInt( n ) || 0, e ] as const )
.filter( ( l ): l is [ PostId, HTMLElement ] => !! l[ 0 ] )
.forEach( ( [ postId, element ] ) =>
render( , element )
);
} );
}
function initAnalyticsFeatures() {
domReady( () => {
const analytics = Array.from(
document.querySelectorAll< HTMLElement >(
'.nelio-content-post-list-analytics'
)
);
analytics
.map( ( element ) => ( {
element,
postId: getPostId( element ),
statistics: getStatistics( element ),
type: element.dataset.analyticsType,
} ) )
.filter(
(
item
): item is {
readonly element: HTMLElement;
readonly postId: PostId;
readonly statistics: Post[ 'statistics' ];
readonly type: 'pageviews' | 'engagement';
} =>
!! item.postId &&
!! item.statistics &&
( 'pageviews' === item.type || 'engagement' === item.type )
)
.forEach( ( { element, postId, statistics, type } ) =>
render(
'pageviews' === type ? (
) : (
),
element
)
);
} );
}
function getPostId( element: HTMLElement ): PostId | 0 {
return ( Number.parseInt( element.dataset.postId || '' ) || 0 ) as
| PostId
| 0;
}
function getStatistics(
element: HTMLElement
): Post[ 'statistics' ] | undefined {
try {
const statistics = JSON.parse( element.dataset.statistics || '' ) as
| Post[ 'statistics' ]
| undefined;
return statistics?.engagement && statistics?.pageviews
? statistics
: undefined;
} catch ( _ ) {
return undefined;
}
}