import { useMemo } from 'react' import Alert from '@mui/material/Alert' import Box from '@mui/material/Box' import Grid from '@mui/material/Grid' import Pagination from '@mui/material/Pagination' import Skeleton from '@mui/material/Skeleton' import Stack from '@mui/material/Stack' import Typography from '@mui/material/Typography' import { useQuery } from '@tanstack/react-query' import { useUnit } from 'effector-react' import { fetchCategories, fetchPublicProducts } from '@/entities/product/api/product-api' import { ProductCard } from '@/entities/product/ui/ProductCard' import { ToggleCartIcon } from '@/features/cart/toggle-cart-icon' import { $user } from '@/shared/model/auth' import { CatalogSlider } from '@/widgets/catalog-slider' import { ReviewsBlock } from '@/widgets/reviews-block' import { useProductFilters } from '../lib/use-product-filters' import { ProductFilters } from './ProductFilters' export function HomePage() { const user = useUnit($user) const isAdmin = Boolean(user?.isAdmin) const filters = useProductFilters() const categoriesQuery = useQuery({ queryKey: ['categories'], queryFn: () => fetchCategories(), }) const productsQuery = useQuery({ queryKey: [ 'products', 'public', { categorySlug: filters.categorySlug || 'all', q: filters.q, sort: filters.sort, page: filters.page, pageSize: filters.pageSize, priceMinRub: filters.priceMinRub, priceMaxRub: filters.priceMaxRub, }, ], queryFn: () => fetchPublicProducts({ categorySlug: filters.categorySlug || undefined, q: filters.q || undefined, sort: filters.sort || '', page: filters.page, pageSize: filters.pageSize, priceMinCents: filters.toCents(filters.priceMinRub), priceMaxCents: filters.toCents(filters.priceMaxRub), }), }) const title = useMemo( () => filters.categorySlug ? `Категория: ${categoriesQuery.data?.find((c) => c.slug === filters.categorySlug)?.name ?? ''}` : 'Каталог', [filters.categorySlug, categoriesQuery.data], ) const products = productsQuery.data?.items ?? [] const total = productsQuery.data?.total ?? 0 const totalPages = Math.max(1, Math.ceil(total / filters.pageSize)) const mediaHeight = Math.round(200 * (filters.cardScale / 100)) return ( {title} Игрушки, сувениры и другие изделия ручной работы. {productsQuery.isLoading && ( {[1, 2, 3].map((i) => ( ))} )} {productsQuery.isError && ( Не удалось загрузить товары. Проверьте, что API запущен. )} {productsQuery.isSuccess && products.length === 0 && ( Пока нет опубликованных товаров. )} {productsQuery.isSuccess && products.length > 0 && ( <> {products.map((p) => ( 0 ? : undefined} /> ))} {totalPages > 1 && ( filters.setPage(v)} color="primary" shape="rounded" showFirstButton showLastButton /> )} )} ) }