import { ParselyAPIError, ParselyAPIErrorInfo } from './common.interface';
export interface ParselyPostsStatsResponse extends ParselyAPIError {
data: ParselyStatsMap | null;
}
interface ParselyStats {
page_views?: string;
visitors?: string;
avg_time?: string;
}
interface ParselyStatsMap {
[key: string]: ParselyStats;
}
document.addEventListener( 'DOMContentLoaded', (): void => {
showParselyPostsStatsResponse();
} );
/**
* Shows Parse.ly Post Stats or Error depending on response.
*/
export function showParselyPostsStatsResponse(): void {
updateParselyStatsPlaceholder();
if ( ! window.wpParselyPostsStatsResponse ) {
return;
}
const response: ParselyPostsStatsResponse = JSON.parse( window.wpParselyPostsStatsResponse );
if ( response?.error ) {
showParselyStatsError( response.error );
return;
}
if ( response?.data ) {
showParselyStats( response.data );
}
}
/**
* Replaces Parse.ly Stats placeholder from default to differentiate while the API request
* is in progress or completed.
*/
function updateParselyStatsPlaceholder(): void {
getAllPostStatsElements()?.forEach( ( statsElement: Element ): void => {
statsElement.innerHTML = '—';
} );
}
/**
* Shows Parse.ly Stats on available posts.
*
* @param {ParselyStatsMap} parselyStatsMap Object contains unique keys and Parse.ly Stats for posts.
*/
function showParselyStats( parselyStatsMap: ParselyStatsMap ): void {
if ( ! parselyStatsMap ) {
return;
}
getAllPostStatsElements()?.forEach( ( statsElement: Element ): void => {
const statsKey = statsElement.getAttribute( 'data-stats-key' );
if ( statsKey === null || parselyStatsMap[ statsKey ] === undefined ) {
return;
}
const stats: ParselyStats = parselyStatsMap[ statsKey ];
statsElement.innerHTML = '';
if ( stats.page_views ) {
statsElement.innerHTML += `${ stats.page_views }
`;
}
if ( stats.visitors ) {
statsElement.innerHTML += `${ stats.visitors }
`;
}
if ( stats.avg_time ) {
statsElement.innerHTML += `${ stats.avg_time }
`;
}
} );
}
/**
* Shows Parse.ly Stats error as WP Admin Error Notice.
*
* @param {ParselyAPIErrorInfo} parselyStatsError Object which contians info about error.
*/
function showParselyStatsError( parselyStatsError: ParselyAPIErrorInfo ): void {
const headerEndElement = document.querySelector( '.wp-header-end' ); // WP has this element before admin notices.
if ( headerEndElement === null ) {
return;
}
headerEndElement.innerHTML += getWPAdminError( parselyStatsError.htmlMessage );
}
/**
* Gets all elements inside which we will show Parse.ly Stats.
*/
function getAllPostStatsElements(): NodeListOf {
return document.querySelectorAll( '.parsely-post-stats' );
}
/**
* Gets HTML for showing error message as WP Admin Error Notice.
*
* @param {string} htmlMessage Message to show inside notice.
*/
function getWPAdminError( htmlMessage = '' ): string {
return `${ htmlMessage }
`;
}