File "site-search-dummy.js"

Full Path: /home/fresvfqn/waterdamagerestorationandrepairsmithtown.com/wp-content/plugins/surerank/src/apps/admin-dashboard/site-search-dummy.js
File size: 4.09 KB
MIME-type: text/html
Charset: utf-8

import { Container, Title, Label, LineChart, Text } from '@bsf/force-ui';
import { __ } from '@wordpress/i18n';
import Section from './section';
import { formatNumber } from '@/functions/utils';

const rawTrafficData = [
	{ clicks: 10000, impressions: 100, date: '2025-02-06' },
	{ clicks: 1000, impressions: 1000, date: '2025-02-07' },
	{ clicks: 10000, impressions: 10000, date: '2025-02-08' },
	{ clicks: 1000, impressions: 10000, date: '2025-02-09' },
	{ clicks: 10000, impressions: 1000, date: '2025-02-10' },
	{ clicks: 1000, impressions: 10000, date: '2025-02-11' },
	{ clicks: 10000, impressions: 1000, date: '2025-02-12' },
	{ clicks: 10000, impressions: 100000, date: '2025-02-13' },
	{ clicks: 1000, impressions: 10000, date: '2025-02-14' },
	{ clicks: 10000, impressions: 1000, date: '2025-02-15' },
	{ clicks: 1000, impressions: 10000, date: '2025-02-16' },
	{ clicks: 10000, impressions: 10000, date: '2025-02-17' },
	{ clicks: 1000, impressions: 10000, date: '2025-02-18' },
	{ clicks: 10000, impressions: 10000, date: '2025-02-19' },
	{ clicks: 1000, impressions: 1000, date: '2025-02-20' },
	{ clicks: 10000, impressions: 10000, date: '2025-02-21' },
	{ clicks: 1000, impressions: 118, date: '2025-02-22' },
	{ clicks: 10000, impressions: 10000, date: '2025-02-23' },
	{ clicks: 10000, impressions: 1000, date: '2025-02-24' },
	{ clicks: 10000, impressions: 10000, date: '2025-02-25' },
];

// Convert dates to readable format + day
const formatDate = ( dateStr ) => {
	const date = new Date( dateStr );
	return {
		readableDate: date.toLocaleDateString( 'en-GB', {
			day: '2-digit',
			month: 'short',
		} ),
		day: date.toLocaleDateString( 'en-GB', { weekday: 'short' } ),
	};
};

const trafficData = rawTrafficData.map( ( { date, clicks, impressions } ) => {
	const { readableDate, day } = formatDate( date );
	return { readableDate, day, clicks, impressions };
} );

const SiteSearchTrafficDummy = () => {
	const totalClicks = trafficData.reduce( ( sum, d ) => sum + d.clicks, 0 );
	const totalImpressions = trafficData.reduce(
		( sum, d ) => sum + d.impressions,
		0
	);

	return (
		<Section>
			<Container
				gap="none"
				justify="between"
				align="center"
				className="p-1"
			>
				<div className="flex items-center gap-3">
					<Title
						title={ __( 'Site Search Traffic', 'surerank' ) }
						tag="h4"
						size="md"
					/>
					<Text size={ 16 } weight={ 400 } color="secondary">
						{ __( '(Last 20 days)', 'surerank' ) }
					</Text>
				</div>
			</Container>

			<Container className="p-1 rounded-lg bg-background-secondary gap-1 flex-wrap md:flex-nowrap">
				<div className="w-full rounded-md bg-background-primary shadow-sm">
					<LineChart
						colors={ [
							{ stroke: '#4B3BED' },
							{ stroke: '#38BDF8' },
						] }
						yAxisFontColor={ [ '#4B3BED', '#38BDF8' ] }
						data={ trafficData }
						dataKeys={ [ 'impressions', 'clicks' ] }
						showTooltip
						showXAxis
						showYAxis
						biaxial
						tooltipIndicator="dot"
						variant="gradient"
						xAxisDataKey={ ( entry ) =>
							`${ entry.readableDate } (${ entry.day })`
						}
						yAxisTickFormatter={ ( value ) =>
							formatNumber( value )
						}
						showLegend={ false }
						chartHeight={ 288 }
						chartWidth="100%"
						lineChartWrapperProps={ {
							margin: {
								top: 25,
								right: 10,
								bottom: 25,
								left: 10,
							},
						} }
					/>
				</div>

				<Container
					className="w-full md:w-[30%] gap-1 flex-row md:flex-col"
					align="stretch"
				>
					{ [ 'Clicks', 'Impressions' ].map( ( label ) => (
						<Container.Item
							key={ label }
							className="px-3 py-5 space-y-4 w-full h-full bg-background-primary rounded-md shadow-sm"
						>
							<Label tag="p" size="md" className="font-medium">
								{ label }
							</Label>
							<Label
								tag="p"
								size="md"
								className="font-semibold text-4xl"
							>
								{ label === 'Clicks'
									? formatNumber( totalClicks )
									: formatNumber( totalImpressions ) }
							</Label>
						</Container.Item>
					) ) }
				</Container>
			</Container>
		</Section>
	);
};

export default SiteSearchTrafficDummy;