import type { ReactNode } from 'react';
import { __, sprintf } from '@wordpress/i18n';
import useGSCData from '@/hooks/useGSCData';
import useSettingsData from '@/hooks/useSettingsData';
import { useSearchQueriesData } from '@/hooks/useSearchQueriesData';
import { Block } from '@/components/Blocks/Block';
import { BlockContent } from '@/components/Blocks/BlockContent';
import { BlockFooter } from '@/components/Blocks/BlockFooter';
import { BlockHeading } from '@/components/Blocks/BlockHeading';
import { GoogleSearchConsoleIcon } from '@/components/Common/GoogleSearchConsoleIcon';
import type { SearchQueryRow } from '@/api/getSearchQueriesData';
import { SearchQueriesInsight } from './SearchQueriesInsight';
import { SearchQueriesContent } from './SearchQueriesContent';
import { SearchQueriesOverlay, SearchQueriesPropertyState } from './SearchQueriesAccessStates';
import {
getSearchQueriesAccessState,
getSearchQueriesViewModel,
isBurstPro
} from './searchQueriesViewModel';
import type { SearchQueriesAccessState, SearchQueriesStatus } from './searchQueriesViewModel';
const blockClassName = '@lg:col-span-6 @xl:col-span-6';
interface SearchQueriesBlockProps {
id?: string;
pageUrl?: string;
}
interface SearchQueriesAccessProps extends SearchQueriesBlockProps {
accessState: SearchQueriesAccessState;
isEnabled: boolean;
propertyStatus: string | null;
}
/**
* Heading metadata for the latest completed Search Console date.
*/
const getSearchQueriesHeadingControls = (
dataUntil: string
): ReactNode | undefined => {
if ( ! dataUntil ) {
return undefined;
}
return (
{ sprintf(
/* translators: %s: latest available Search Console date. */
__( 'Search Console ยท until %s', 'burst-statistics' ),
dataUntil
) }
);
};
/**
* Ready-state insight footer.
*/
const SearchQueriesFooter = ({
isLoading,
dataStatus,
opportunity
}: {
isLoading: boolean;
dataStatus: SearchQueriesStatus;
opportunity: SearchQueryRow | null;
}) => {
if ( isLoading || 'ready' !== dataStatus || ! opportunity ) {
return null;
}
return (
);
};
/**
* Connected Search Console block. This is the only gate that mounts the query
* data hook.
*/
const ConnectedSearchQueriesBlock = ({
id,
pageUrl,
propertyStatus
}: SearchQueriesBlockProps & { propertyStatus: string | null }) => {
const { data, isLoading, isError } = useSearchQueriesData({ id, pageUrl });
const viewModel = getSearchQueriesViewModel( data, isError );
return (
);
};
/**
* Render the selected top-level access state.
*/
const SearchQueriesAccess = ({
accessState,
isEnabled,
propertyStatus,
id,
pageUrl
}: SearchQueriesAccessProps ) => {
if ( 'queries' === accessState ) {
return ;
}
if ( 'property' === accessState ) {
return ;
}
return ;
};
/**
* Displays locally synced page-level Search Console query data behind the GSC
* connection and Pro gates.
*
* @return Gated search query block.
*/
export const SearchQueriesBlock = ({
id,
pageUrl
}: SearchQueriesBlockProps ) => {
const { status, propertyStatus } = useGSCData();
const { getValue } = useSettingsData();
const isEnabled = !! getValue( 'enable_search_console' );
const accessState = getSearchQueriesAccessState(
isBurstPro(),
status,
propertyStatus
);
return (
);
};