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 ( ); };