'use client' import { useQuery } from '@apollo/client' import { Building2, ShoppingCart, Package, Wrench, RotateCcw, Clock, FileText, CheckCircle, ChevronRight, Home } from 'lucide-react' import Link from 'next/link' import { usePathname } from 'next/navigation' import React from 'react' import { Sidebar } from '@/components/dashboard/sidebar' import { GET_PENDING_SUPPLIES_COUNT } from '@/graphql/queries' import { useRealtime } from '@/hooks/useRealtime' import { useSidebar } from '@/hooks/useSidebar' // Компонент для отображения бейджа с уведомлениями function NotificationBadge({ count }: { count: number }) { if (count === 0) return null return (
{count > 99 ? '99+' : count}
) } // Breadcrumbs компонент function Breadcrumbs({ pathname }: { pathname: string }) { const getBreadcrumbs = (path: string) => { const segments = path.split('/').filter(Boolean) const breadcrumbs = [ { name: 'Главная', href: '/dashboard', icon: Home } ] if (segments[0] === 'fulfillment-supplies') { breadcrumbs.push({ name: 'Входящие поставки', href: '/fulfillment-supplies', icon: Building2 }) if (segments[1]) { const categoryMap: Record = { 'goods': 'Товары', 'detailed-supplies': 'Расходники фулфилмента', 'consumables': 'Расходники селлеров', 'returns': 'Возвраты с ПВЗ' } const category = categoryMap[segments[1]] if (category) { breadcrumbs.push({ name: category, href: segments[2] ? `/fulfillment-supplies/${segments[1]}` : path, icon: Package }) if (segments[1] === 'goods' && segments[2]) { const subcategoryMap: Record = { 'new': 'Новые', 'receiving': 'Приёмка', 'received': 'Принято' } const subcategory = subcategoryMap[segments[2]] if (subcategory) { breadcrumbs.push({ name: subcategory, href: path, icon: Clock }) } } } } } return breadcrumbs } const breadcrumbs = getBreadcrumbs(pathname) return ( ) } export function FulfillmentSuppliesLayout({ children }: { children: React.ReactNode }) { const { getSidebarMargin } = useSidebar() const pathname = usePathname() // Загружаем данные о непринятых поставках const { data: pendingData, error: pendingError, refetch: refetchPending } = useQuery(GET_PENDING_SUPPLIES_COUNT, { fetchPolicy: 'cache-first', errorPolicy: 'ignore', onError: (error) => { console.error('❌ GET_PENDING_SUPPLIES_COUNT Error:', error) }, }) // Realtime: обновление бейджа useRealtime({ onEvent: (evt) => { if (evt.type === 'supply-order:new' || evt.type === 'supply-order:updated') { refetchPending() } }, }) // Логируем ошибку для диагностики React.useEffect(() => { if (pendingError) { console.error('🚨 Ошибка загрузки счетчиков поставок:', pendingError) } }, [pendingError]) // Для фулфилмента считаем только поставки, НЕ заявки на партнерство const pendingCount = pendingData?.pendingSuppliesCount?.supplyOrders || 0 const ourSupplyOrdersCount = pendingData?.pendingSuppliesCount?.ourSupplyOrders || 0 const sellerSupplyOrdersCount = pendingData?.pendingSuppliesCount?.sellerSupplyOrders || 0 // Определяем активные табы на основе pathname const getActiveTab = () => { if (pathname.startsWith('/fulfillment-supplies/goods')) return 'fulfillment' if (pathname.includes('/detailed-supplies')) return 'fulfillment' if (pathname.includes('/consumables')) return 'fulfillment' if (pathname.includes('/returns')) return 'fulfillment' return 'fulfillment' } const getActiveSubTab = () => { if (pathname.startsWith('/fulfillment-supplies/goods')) return 'goods' if (pathname.includes('/detailed-supplies')) return 'detailed-supplies' if (pathname.includes('/consumables')) return 'consumables' if (pathname.includes('/returns')) return 'returns' return 'goods' } const getActiveThirdTab = () => { if (pathname.includes('/goods/new')) return 'new' if (pathname.includes('/goods/receiving')) return 'receiving' if (pathname.includes('/goods/received')) return 'received' return 'new' } const activeTab = getActiveTab() const activeSubTab = getActiveSubTab() const activeThirdTab = getActiveThirdTab() return (
{/* Breadcrumbs */} {/* БЛОК 1: ТАБЫ ВСЕХ УРОВНЕЙ */}
{/* УРОВЕНЬ 1: Главные табы */}
Поставки на фулфилмент Фулфилмент
{/* УРОВЕНЬ 2: Подтабы */} {activeTab === 'fulfillment' && (
Товар Т Расходники фулфилмента Фулфилмент Ф Расходники селлеров Селлеры С Возвраты с ПВЗ В
)} {/* УРОВЕНЬ 3: Подподтабы для товаров */} {activeTab === 'fulfillment' && activeSubTab === 'goods' && (
Новые Н Приёмка П Принято Пр
)}
{/* БЛОК 2: ОСНОВНОЙ КОНТЕНТ */}
{children}
) }