HEX
Server: LiteSpeed
System: Linux server902.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: deshuvsd (2181)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/deshuvsd/www/wp-content/plugins/surerank/src/apps/admin-general/advanced/sitemaps/sitemaps.js
import PageContentWrapper from '@AdminComponents/page-content-wrapper';
import { __, sprintf } from '@wordpress/i18n';
import { Button, toast } from '@bsf/force-ui';
import { useSuspenseSelect } from '@wordpress/data';
import { STORE_NAME } from '@AdminStore/constants';
import withSuspense from '@AdminComponents/hoc/with-suspense';
import { LoaderCircle, RefreshCw } from 'lucide-react';
import { Tooltip } from '@AdminComponents/tooltip';
import GeneratePageContent from '@Functions/page-content-generator';
import { cn } from '@/functions/utils';
import { applyFilters } from '@wordpress/hooks';
import { useState } from '@wordpress/element';
import apiFetch from '@wordpress/api-fetch';
import { UpgradeNotice } from '@/global/components/nudges';
import Alert from '@/global/components/alert';

const xmlContent = ( metaSettings ) => [
	{
		type: 'switch',
		id: 'enable_xml_sitemap',
		storeKey: 'enable_xml_sitemap',
		dataType: 'boolean',
		label: __( 'Enable XML Sitemap', 'surerank' ),
		description: (
			<>
				{ __(
					'Create a sitemap that helps search engines discover and index your pages faster.',
					'surerank'
				) }{ ' ' }
				<Button
					variant="link"
					size="sm"
					className={ cn(
						'p-0 h-auto inline-flex !text-link-primary focus:ring-0',
						{
							'cursor-not-allowed !text-field-color-disabled':
								! metaSettings?.enable_xml_sitemap,
						}
					) }
					onClick={
						metaSettings?.enable_xml_sitemap
							? () =>
									window.open(
										surerank_admin_common?.sitemap_url,
										'_blank',
										'noopener,noreferrer'
									)
							: undefined
					}
					disabled={ ! metaSettings?.enable_xml_sitemap }
				>
					{ __( 'View Sitemap', 'surerank' ) }
				</Button>
			</>
		),
	},
	{
		type: 'switch',
		id: 'enable_xml_image_sitemap',
		storeKey: 'enable_xml_image_sitemap',
		dataType: 'boolean',
		label: __( 'Include Images in XML Sitemap', 'surerank' ),
		description: __(
			'Include images so search engines can index them and show them in image results.',
			'surerank'
		),
		disabled: ( formValues ) => {
			return ! formValues.enable_xml_sitemap;
		},
	},
];

const getXmlScreen = ( metaSettings ) => {
	const content = xmlContent( metaSettings );
	return applyFilters(
		'surerank-pro.sitemap-settings',
		[
			{
				container: null,
				content: [
					{
						id: 'xml-settings',
						type: 'title',
						label: __( 'XML', 'surerank' ),
					},
				],
			},
			{
				container: null,
				content,
			},
		],
		content
	);
};

const getPageContent = ( metaSettings ) => [
	//This is the very first depth of the form. And it represents the section container of the form.
	{
		container: {
			id: 'xml-settings-container',
			direction: 'column',
			gap: 6,
		},
		content: getXmlScreen( metaSettings ),
	},
];

export const PAGE_CONTENT = [
	{
		container: {
			id: 'xml-settings-container',
			direction: 'column',
			gap: 6,
		},
		content: getXmlScreen( {} ),
	},
];

const SiteMaps = () => {
	const { metaSettings } = useSuspenseSelect( ( select ) => {
		const { getMetaSettings } = select( STORE_NAME );
		return {
			metaSettings: getMetaSettings(),
		};
	}, [] );

	const SitemapButtons = () => {
		const [ isGenerating, setIsGenerating ] = useState( false );
		const [ progress, setProgress ] = useState( 0 );
		const [ currentItem, setCurrentItem ] = useState( '' );
		const isDisabled = ! metaSettings.enable_xml_sitemap;

		const generateCache = async () => {
			setIsGenerating( true );
			setProgress( 0 );
			setCurrentItem( '' );

			try {
				const cronsAvailable = surerank_admin_common?.crons_available;

				if ( cronsAvailable ) {
					// For cron-based generation, don't set currentItem or progress
					const result = await apiFetch( {
						path: '/surerank/v1/sitemap/generate-cache',
						method: 'POST',
					} );

					toast.warning( result.message, {
						description: result.description,
						icon: <LoaderCircle className="animate-spin" />,
					} );
				} else {
					// Use manual batch processing
					toast.warning(
						__( 'Sitemap cache generation started…', 'surerank' ),
						{
							description: __(
								'Processing items in batches it will take some time, please stay on the page.',
								'surerank'
							),
							icon: <LoaderCircle className="animate-spin" />,
						}
					);

					//prepare
					const response = await apiFetch( {
						path: '/surerank/v1/prepare-cache',
						method: 'GET',
					} );

					const items = response.data;

					for ( let i = 0; i < items.length; i++ ) {
						const item = items[ i ];
						const progressPercentage = Math.round(
							( ( i + 1 ) / items.length ) * 100
						);

						// Set current item being processed
						setCurrentItem( `${ item.type }: ${ item.slug }` );
						setProgress( progressPercentage );

						await apiFetch( {
							path: '/surerank/v1/sitemap/generate-cache-manual',
							method: 'POST',
							data: {
								page: item.page,
								slug: item.slug,
								type: item.type,
							},
						} );
					}

					toast.success(
						__( 'Sitemap cache generation completed!', 'surerank' ),
						{
							description: __(
								'All content has been processed successfully.',
								'surerank'
							),
						}
					);
				}
			} catch ( error ) {
				toast.error(
					error.message ||
						__(
							'Error generating sitemap cache. Please try again.',
							'surerank'
						)
				);
			} finally {
				setIsGenerating( false );
				setProgress( 0 );
				setCurrentItem( '' );
			}
		};

		return (
			<Tooltip
				className="max-w-[18rem]"
				content={ ( () => {
					if ( ! isGenerating ) {
						return __( 'Generate sitemap cache', 'surerank' );
					}
					if ( currentItem ) {
						return sprintf(
							/* translators: 1: content type, 2: progress percentage */
							__(
								'Cache generation in progress for %1$s (%2$s%%)',
								'surerank'
							),
							currentItem,
							progress
						);
					}
					return __(
						'Sitemap cache generation is in progress…',
						'surerank'
					);
				} )() }
				arrow
			>
				<Button
					variant="outline"
					size="md"
					className={ cn( 'min-w-fit flex items-center gap-2', {
						'cursor-not-allowed': isDisabled,
					} ) }
					disabled={ isDisabled || isGenerating }
					onClick={ generateCache }
					icon={
						<RefreshCw
							className={ cn( {
								'animate-spin': isGenerating,
							} ) }
						/>
					}
					iconPosition="right"
				>
					{ isGenerating
						? __( 'Generating…', 'surerank' )
						: __( 'Regenerate', 'surerank' ) }
				</Button>
			</Tooltip>
		);
	};

	return (
		<PageContentWrapper
			title={ __( 'Sitemaps', 'surerank' ) }
			secondaryButton={ <SitemapButtons /> }
			description={ __(
				'Generates a sitemap to help search engines find and index your content more efficiently.',
				'surerank'
			) }
			afterDescription={
				surerank_admin_common?.crons_available ? null : (
					<Alert
						color="warning"
						message={ __(
							'It seems CRON is not enabled on your site. You can use the "Regenerate" button to generate the sitemap cache manually.',
							'surerank'
						) }
					/>
				)
			}
		>
			<GeneratePageContent json={ getPageContent( metaSettings ) } />
			<UpgradeNotice
				title={ __(
					'Want to unlock advanced sitemap types?',
					'surerank'
				) }
				description={ __(
					'Upgrade to generate Video, News, HTML, and Author Sitemaps for better search visibility.',
					'surerank'
				) }
				utmMedium="surerank_sitemaps"
			/>
		</PageContentWrapper>
	);
};

export default withSuspense( SiteMaps );