"use client" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Skeleton } from "@/components/ui/skeleton" import { useLoadingState, useResourcesStats } from "../hooks/use-resources" /** * Индикатор загрузки ресурсов для Browser */ export function BrowserLoadingIndicator() { const loadingState = useLoadingState() const stats = useResourcesStats() // Показываем индикатор только если идет загрузка или есть ошибка if (!loadingState.isLoading && !loadingState.error) { return null } return (
{/* Статус загрузки */}
{loadingState.isLoading ? ( <>
Загрузка ресурсов... ) : loadingState.error ? ( <>
Ошибка загрузки ) : ( <>
Загрузка завершена )}
{/* Статистика */}
{stats.total > 0 && ( {stats.total} ресурсов )} {loadingState.loadedSources.size > 0 && ( {loadingState.loadedSources.size} источников )}
{/* Прогресс-бар */} {loadingState.isLoading && (
{loadingState.loadingQueue.length > 0 && `Загружается: ${loadingState.loadingQueue.join(", ")}`} {Math.round(loadingState.progress)}%
)} {/* Ошибка */} {loadingState.error && (
{loadingState.error}
)} {/* Детальная статистика (только при загрузке) */} {loadingState.isLoading && stats.total > 0 && (
{stats.byType.effect > 0 && Эффекты: {stats.byType.effect}} {stats.byType.filter > 0 && Фильтры: {stats.byType.filter}} {stats.byType.transition > 0 && Переходы: {stats.byType.transition}}
)}
) } /** * Компонент-заглушка для скелетона загрузки списка ресурсов */ export function BrowserResourcesSkeleton() { return (
{Array.from({ length: 12 }).map((_, i) => (
))}
) } /** * Мини-индикатор статуса загрузки для табов */ export function BrowserTabLoadingBadge({ resourceType }: { resourceType: "effect" | "filter" | "transition" }) { const loadingState = useLoadingState() const stats = useResourcesStats() const count = stats.byType[resourceType] const isLoading = loadingState.isLoading if (count === 0 && !isLoading) { return null } return ( {isLoading ? (
) : ( count )} ) }