/**
* WordPress dependencies
*/
import { PanelBody } from '@safe-wordpress/components';
import { useDispatch, useSelect } from '@safe-wordpress/data';
import { useEffect } from '@safe-wordpress/element';
import { _x } from '@safe-wordpress/i18n';
/**
* External dependencies
*/
import { store as NAB_EXPERIMENTS } from '@nab/experiments';
import { createScopeRule } from '@nab/utils';
import type {
CustomPhpScopeRule,
CustomUrlScopeRule,
ScopeRule,
TestedUrlWithQueryArgsScopeRule,
} from '@nab/types';
/**
* Internal dependencies
*/
import './style.scss';
import { CustomUrlScope } from './custom-url-scope';
import { ConsistencyScope } from './consistency-scope';
import { ProductConsistencyScope } from './product-consistency-scope';
import { TestedUrlWithQueryArgsScope } from './tested-url-with-query-args-scope';
import { store as NAB_EDITOR } from '../../../store';
import { UrlsOrPhpScope } from './urls-or-php-scope';
export const Scope = (): JSX.Element | null => {
const rules = useRules();
const scopeSupport = useScopeSupport();
const testAgainstExistingContent = useTestAgainstExistingContent();
const { setScopeRules } = useDispatch( NAB_EDITOR );
useEffect( () => {
if (
'tested-post-with-consistency' === scopeSupport &&
testAgainstExistingContent
) {
void setScopeRules( [
createScopeRule( { type: 'tested-post' } ),
] );
}
}, [ scopeSupport, testAgainstExistingContent, setScopeRules ] );
if ( ! scopeSupport ) {
return null;
}
if ( testAgainstExistingContent ) {
return null;
}
switch ( scopeSupport ) {
case 'tested-post-with-consistency':
return (
);
case 'tested-product-with-consistency':
return (
);
case 'tested-url-with-query-args':
return (
);
case 'urls':
case 'urls-with-tested-post':
return (
);
case 'urls-or-php':
return (
isCustomUrlScopeRule( r ) ||
isCustomPhpScopeRule( r )
) }
/>
);
}
};
// =====
// HOOKS
// =====
const useRules = () =>
useSelect( ( select ) => select( NAB_EDITOR ).getScope(), [] );
const useScopeSupport = () =>
useSelect( ( select ) => {
const { getExperimentSupport } = select( NAB_EXPERIMENTS );
const { getExperimentType } = select( NAB_EDITOR );
return getExperimentSupport( getExperimentType(), 'scope' );
}, [] );
const useTestAgainstExistingContent = () =>
useSelect( ( select ) => {
const control = select( NAB_EDITOR ).getAlternative( 'control' );
return !! control?.attributes.testAgainstExistingContent;
}, [] );
// =======
// HELPERS
// =======
export const isTestedUrlWithQueryArgsScopeRule = (
r: ScopeRule
): r is TestedUrlWithQueryArgsScopeRule =>
'tested-url-with-query-args' === r.attributes.type;
const CHECKER: Record< CustomUrlScopeRule[ 'attributes' ][ 'type' ], true > = {
exact: true,
partial: true,
'partial-not-included': true,
different: true,
};
export const isCustomUrlScopeRule = ( r: ScopeRule ): r is CustomUrlScopeRule =>
( CHECKER as Record< string, boolean > )[ r.attributes.type ] || false;
export const isCustomPhpScopeRule = ( r: ScopeRule ): r is CustomPhpScopeRule =>
'php-snippet' === r.attributes.type;