import React, { useEffect, useState } from 'react'; import { __ } from '@wordpress/i18n'; import { useNavigate } from 'react-router-dom'; import { applyFilters } from '@wordpress/hooks'; import { FileImage, Download, Search, Maximize, Copy, ToggleLeft, Zap, FileType, } from 'lucide-react'; import { TotalImagesIcon, TotalThumbnailsIcon, UnoptimizedIcon, SpaceSavedIcon, WebpFileIcon, AvifFileIcon, ThumbnailDisabledIcon, LazyLoadingIcon, LargeImagesIcon, UnusedImagesIconPro, CompressedImagesIcon, DuplicateImagesIcon, } from '../components/icons'; import Header from '../components/layout/Header'; import PluginPage from '../components/layout/PluginPage'; import { getDashboardCountsStats, getDashboardOptimizationStats, getDashboardAnalysisStats, type DashboardCountsStats, type DashboardOptimizationStats, type DashboardAnalysisStats, type DashboardStats, } from '../api'; import LockedFeatureCard from '../components/dashboard/LockedFeatureCard'; import InfoCard from '../components/dashboard/InfoCard'; import HealthScoreCard from '../components/dashboard/HealthScoreCard'; import PromotionalNotice from '../components/dashboard/PromotionalNotice'; function formatBytes(bytes: number): string { if (bytes === 0) return '0 B'; const units = ['B', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(1024)); const value = bytes / Math.pow(1024, i); return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`; } function InfoCardSkeleton({ hasArrow = false }: { hasArrow?: boolean }) { return (