File "indexing.js"

Full Path: /home/fresvfqn/waterdamagerestorationandrepairsmithtown.com/wp-content/plugins/surerank/src/apps/admin-general/advanced/robot-instructions/indexing.js
File size: 4.91 KB
MIME-type: text/x-java
Charset: utf-8

import { Tabs, Skeleton } from '@bsf/force-ui';
import { useState, useCallback, useEffect } from '@wordpress/element';
import { motion } from 'framer-motion';
import { STORE_NAME } from '@AdminStore/constants';
import { useDispatch, useSuspenseSelect } from '@wordpress/data';
import SubTabToggles from './sub-tab-toggles';
import { __ } from '@wordpress/i18n';

const IndexingTab = ( { postContent, keyWord } ) => {
	const subTabOption = [
		{ label: __( 'Post Types', 'surerank' ), tabSlug: 'postTypes' },
		{ label: __( 'Taxonomies', 'surerank' ), tabSlug: 'taxonomies' },
		{ label: __( 'Archives', 'surerank' ), tabSlug: 'archives' },
	];

	const [ postTypesData, setPostTypesData ] = useState( [] );
	const [ taxonomiesData, setTaxonomiesData ] = useState( [] );
	const [ archivesData, setArchivesData ] = useState( [] );
	const { setMetaSetting } = useDispatch( STORE_NAME );
	const { metaSettings } = useSuspenseSelect( ( select ) => {
		const { getMetaSettings } = select( STORE_NAME );
		return {
			metaSettings: getMetaSettings(),
		};
	}, [] );

	const [ activeSocialTab, setActiveSocialTab ] = useState( 'postTypes' );

	// Initialize states with saved settings when component mounts or metaSettings changes
	useEffect( () => {
		if ( postContent && metaSettings?.no_index?.length ) {
			const savedSettings = metaSettings.no_index;

			// Filter saved settings into appropriate states
			const postTypes = Object.keys( postContent.post_types || {} );
			const taxonomies = Object.keys( postContent.taxonomies || {} );
			const archives = Object.keys( postContent.archives || {} );

			setPostTypesData(
				savedSettings.filter( ( item ) => postTypes.includes( item ) )
			);
			setTaxonomiesData(
				savedSettings.filter( ( item ) => taxonomies.includes( item ) )
			);
			setArchivesData(
				savedSettings.filter( ( item ) => archives.includes( item ) )
			);
		}
	}, [ metaSettings, postContent ] );

	const handleTabChange = useCallback( ( { value } ) => {
		setActiveSocialTab( value.slug );
	}, [] );

	const handleSettingsChange = useCallback(
		( key, value ) => {
			setMetaSetting( key, value ); // store in redux
		},
		[ setMetaSetting ]
	);

	const handleSwitchChange = useCallback(
		( key, value ) => {
			const updateAndCombineData = (
				setStateFunction,
				currentState,
				updatedValue
			) => {
				setStateFunction( updatedValue );

				const combinedData = Array.from(
					new Set( [
						...( key === 'postTypes'
							? updatedValue
							: postTypesData ),
						...( key === 'taxonomies'
							? updatedValue
							: taxonomiesData ),
						...( key === 'archives' ? updatedValue : archivesData ),
					] )
				);

				handleSettingsChange( 'no_index', combinedData );
			};

			switch ( key ) {
				case 'postTypes':
					updateAndCombineData(
						setPostTypesData,
						postTypesData,
						value
					);
					break;
				case 'taxonomies':
					updateAndCombineData(
						setTaxonomiesData,
						taxonomiesData,
						value
					);
					break;
				case 'archives':
					updateAndCombineData(
						setArchivesData,
						archivesData,
						value
					);
					break;
				default:
					break;
			}
		},
		[ postTypesData, taxonomiesData, archivesData, handleSettingsChange ]
	);

	const renderTabComponent = () => {
		if ( ! postContent ) {
			return (
				<div className="space-y-4 pt-2">
					<Skeleton
						variant="rectangular"
						className="w-full max-w-72 h-5"
					/>
					<Skeleton
						variant="rectangular"
						className="w-full max-w-72 h-5"
					/>
					<Skeleton
						variant="rectangular"
						className="w-full max-w-72 h-5"
					/>
				</div>
			);
		}
		switch ( activeSocialTab ) {
			case 'taxonomies':
				return (
					<SubTabToggles
						type="taxonomies"
						keyWord={ keyWord }
						listData={ postContent.taxonomies }
						settings={ taxonomiesData }
						handleSwitchChange={ handleSwitchChange }
					/>
				);
			case 'archives':
				return (
					<SubTabToggles
						type="archives"
						keyWord={ keyWord }
						listData={ postContent.archives }
						settings={ archivesData }
						handleSwitchChange={ handleSwitchChange }
					/>
				);
			default:
				return (
					<SubTabToggles
						type="postTypes"
						keyWord={ keyWord }
						listData={ postContent.post_types }
						settings={ postTypesData }
						handleSwitchChange={ handleSwitchChange }
					/>
				);
		}
	};

	return (
		<div className="space-y-4">
			<Tabs.Group
				activeItem={ activeSocialTab }
				variant="rounded"
				width="full"
				onChange={ handleTabChange }
				className="m-2"
			>
				{ subTabOption.map( ( { label, tabSlug } ) => (
					<Tabs.Tab key={ tabSlug } slug={ tabSlug } text={ label } />
				) ) }
			</Tabs.Group>
			<motion.div
				key={ activeSocialTab }
				initial={ { opacity: 0, x: 0 } }
				animate={ { opacity: 1, y: 0 } }
				exit={ { opacity: 0, x: -10 } }
				transition={ { duration: 0.3 } }
				className="w-full"
			>
				{ renderTabComponent() }
			</motion.div>
		</div>
	);
};

export default IndexingTab;