/** * WordPress dependencies */ import { applyFilters, addFilter } from '@safe-wordpress/hooks'; /** * External dependencies */ import { OPEN_POPUP_CLASSNAME, bypassBooleanFilter, not, } from '@nelio/popups/utils'; import type { ContentTargetCondition, Popup, SelectedTermsConditionValue, } from '@nelio/popups/types'; /** * Internal dependencies */ import type { WordPressContext } from './types'; import { TaxonomyCondition } from '@nelio/popups-premium/types'; export function doesTargetApply( popup: Popup, context: WordPressContext ): boolean { const { target } = popup.config; if ( document.querySelector( `.${ OPEN_POPUP_CLASSNAME }-${ popup.id }` ) || document.querySelector( `[href='${ popup.url }']` ) ) { return true; } if ( 'auto' !== context.postPopups ) { return context.postPopups.includes( popup.id ); } if ( 'full-site-target' === target.type ) { return true; } if ( 'manual-target' === target.type ) { return false; } return target.groups.some( ( conditions ) => conditions.every( ( condition ) => applyFilters( `nelio_popups.does_${ condition.type }_target_apply`, false, condition, context ) ) ); } // ============= // DEFAULT HOOKS // ============= addFilter( 'nelio_popups.does_content_target_apply', 'nelio_popups.does_content_target_apply', bypassBooleanFilter( doesContentTargetConditionApply ) ); addFilter( 'nelio_popups.does_excluded-content_target_apply', 'nelio_popups.does_excluded-content_target_apply', bypassBooleanFilter( not( doesContentTargetConditionApply ) ) ); // ======= // HELPERS // ======= function doesContentTargetConditionApply( condition: ContentTargetCondition, context: WordPressContext ): boolean { switch ( condition.value ) { case '404-page': case 'blog-page': case 'home-page': case 'search-result-page': return context.specialPage === condition.value; } const { postType } = condition; if ( context.postType !== postType ) { return false; } const { postValue } = condition; switch ( postValue.type ) { case 'all-posts': return context.isSingular; case 'selected-posts': return ( context.isSingular && postValue.postIds.includes( context.postId ) ); case 'children': return ( context.isSingular && context.parents.some( ( p ) => postValue.postIds.includes( p ) ) ); case 'template': return ( context.isSingular && context.template === postValue.template ); case 'selected-terms': const taxonomyCondition: TaxonomyCondition = { type: 'taxonomy', value: condition.postValue as SelectedTermsConditionValue, }; return !! applyFilters( 'nelio_popups.does_taxonomy_target_apply', false, taxonomyCondition, context ); } }