/**
* WordPress dependencies
*/
import { ExternalLink } from '@safe-wordpress/components';
import { useSelect } from '@safe-wordpress/data';
import { createInterpolateElement } from '@safe-wordpress/element';
import { sprintf, _x } from '@safe-wordpress/i18n';
/**
* External dependencies
*/
import { find } from 'lodash';
import { store as NAB_DATA } from '@nab/data';
import type { CAViewProps, EntityId, EntityKindName } from '@nab/types';
/**
* Internal dependencies
*/
import type { Attributes } from './types';
export const View = ( props: CAViewProps< Attributes > ): JSX.Element =>
props.attributes.mode === 'id' ? (
) : (
);
// ============
// HELPER VIEWS
// ============
const PostIdView = ( {
attributes: { postType, postId },
}: CAViewProps< Attributes > ): JSX.Element => {
const postTypeLabel = usePostTypeLabel( postType );
const postTitle = usePostTitle( postType, postId );
const permalink = usePostPermalink( postType, postId );
if ( 'page' === postType || 'post' === postType ) {
const knownLabel =
'page' === postType
? /* translators: %s: The title of a page. */
_x(
'A visitor views the %s page.',
'text',
'nelio-ab-testing'
)
: /* translators: %s: The title of a post. */
_x(
'A visitor views the %s post.',
'text',
'nelio-ab-testing'
);
const unknownLabel =
'page' === postType
? _x(
'A visitor views a page in your website.',
'text',
'nelio-ab-testing'
)
: _x(
'A visitor views a post in your website.',
'text',
'nelio-ab-testing'
);
if ( ! postTitle ) {
return <>{ unknownLabel }>;
}
return (
<>
{ createInterpolateElement(
sprintf( knownLabel, sprintf( '%s', postTitle ) ),
{
a: permalink ? (
// @ts-expect-error children prop is set by createInterpolateComponent.
) : (
),
}
) }
>
);
}
if ( ! postTitle ) {
return (
<>
{ sprintf(
/* translators: %s: Custom post type. */
_x(
'A visitor views some content in your website with the type %s.',
'text',
'nelio-ab-testing'
),
postTypeLabel
) }
>
);
}
return (
<>
{ createInterpolateElement(
sprintf(
/* translators: %1$s: The title of a custom post type. %2$s: Post type name. */
_x(
'A visitor views %1$s (%2$s).',
'text',
'nelio-ab-testing'
),
sprintf( '%s', postTitle ),
postTypeLabel
),
{
a: permalink ? (
// @ts-expect-error children prop is set by createInterpolateComponent.
) : (
),
}
) }
>
);
};
const UrlView = ( {
attributes: { url },
}: CAViewProps< Attributes > ): JSX.Element => {
if ( ! url ) {
return (
<>
{ _x(
'A visitor views a page in your website.',
'text',
'nelio-ab-testing'
) }
>
);
}
return (
<>
{ createInterpolateElement(
sprintf(
/* translators: %s: Page URL. */
_x(
'A visitor views a page with URL %s.',
'text',
'nelio-ab-testing'
),
sprintf( '%s', url )
),
{
code: ,
}
) }
>
);
};
// =====
// HOOKS
// =====
const usePostTypeLabel = ( postType?: EntityKindName ) => {
const postTypes = useSelect(
( select ) => select( NAB_DATA ).getKindEntities() || [],
[]
);
const obj = find( postTypes, { name: postType || '' } );
return (
obj?.labels?.singular_name ||
_x( 'Unknown', 'text (post type)', 'nelio-ab-testing' )
);
};
const usePostTitle = ( postType: EntityKindName, postId: EntityId ) =>
useSelect(
( select ) =>
select( NAB_DATA ).getEntityRecord( postType, postId )?.title,
[ postType, postId ]
);
const usePostPermalink = ( postType: EntityKindName, postId: EntityId ) =>
useSelect(
( select ) =>
isResultsPage() &&
select( NAB_DATA ).getEntityRecord( postType, postId )?.link,
[ postType, postId ]
);
// =======
// HELPERS
// =======
const isResultsPage = () =>
!! document.querySelector( '.nab-results-experiment-layout' );