diff --git a/src/app/supplies/create-suppliers/page.tsx b/src/app/supplies/create-suppliers/page.tsx index c262f01..d3b8b7a 100644 --- a/src/app/supplies/create-suppliers/page.tsx +++ b/src/app/supplies/create-suppliers/page.tsx @@ -1,5 +1,5 @@ import { AuthGuard } from '@/components/auth-guard' -import { CreateSuppliersSupplyPage } from '@/components/supplies/create-suppliers-supply-page' +import { CreateSuppliersSupplyPage } from '@/components/supplies/create-suppliers' export default function CreateSuppliersSupplyPageRoute() { return ( diff --git a/src/components/supplies/create-suppliers/index.tsx b/src/components/supplies/create-suppliers/index.tsx new file mode 100644 index 0000000..fe7952e --- /dev/null +++ b/src/components/supplies/create-suppliers/index.tsx @@ -0,0 +1,241 @@ +/** + * СОЗДАНИЕ ПОСТАВОК ПОСТАВЩИКОВ - НОВАЯ МОДУЛЬНАЯ АРХИТЕКТУРА + * + * Рефакторинг create-suppliers-supply-page.tsx + * Композиция из блок-компонентов с использованием custom hooks + */ + +'use client' + +import { ArrowLeft } from 'lucide-react' +import { useRouter } from 'next/navigation' + +import { Sidebar } from '@/components/dashboard/sidebar' +import { Button } from '@/components/ui/button' +import { useAuth } from '@/hooks/useAuth' +import { useSidebar } from '@/hooks/useSidebar' + +import { CartBlock } from './blocks/CartBlock' +import { DetailedCatalogBlock } from './blocks/DetailedCatalogBlock' +import { ProductCardsBlock } from './blocks/ProductCardsBlock' +import { SuppliersBlock } from './blocks/SuppliersBlock' +import { useProductCatalog } from './hooks/useProductCatalog' +import { useRecipeBuilder } from './hooks/useRecipeBuilder' +import { useSupplierSelection } from './hooks/useSupplierSelection' +import { useSupplyCart } from './hooks/useSupplyCart' +import type { GoodsSupplier, GoodsProduct, ProductRecipe } from './types/supply-creation.types' + +export function CreateSuppliersSupplyPage() { + const router = useRouter() + const { user: _user } = useAuth() + const { getSidebarMargin } = useSidebar() + + // 1. ХУКА ВЫБОРА ПОСТАВЩИКОВ + const { + selectedSupplier, + setSelectedSupplier, + searchQuery, + setSearchQuery, + suppliers, + allCounterparties, + loading: suppliersLoading, + error: suppliersError, + } = useSupplierSelection() + + // 2. ХУКА КАТАЛОГА ТОВАРОВ + const { + products, + allSelectedProducts, + setAllSelectedProducts, + productQuantities: _productQuantities, + loading: _productsLoading, + getProductQuantity, + addProductToSelected, + updateSelectedProductQuantity, + removeProductFromSelected, + } = useProductCatalog({ selectedSupplier }) + + // 4. ХУКА КОРЗИНЫ ПОСТАВОК (сначала, чтобы получить selectedFulfillment) + const { + selectedGoods, + setSelectedGoods, + deliveryDate, + setDeliveryDate, + selectedLogistics, + setSelectedLogistics, + selectedFulfillment, + setSelectedFulfillment, + isCreatingSupply, + totalGoodsAmount, + isFormValid, + addToCart, + removeFromCart, + handleCreateSupply, + } = useSupplyCart({ + selectedSupplier, + allCounterparties, + productRecipes: {}, // Изначально пустые рецепты + }) + + // 3. ХУКА ПОСТРОЕНИЯ РЕЦЕПТУР (получает selectedFulfillment из корзины) + const { + productRecipes, + setProductRecipes, + fulfillmentServices, + fulfillmentConsumables, + sellerConsumables, + initializeProductRecipe, + getProductRecipe: _getProductRecipe, + } = useRecipeBuilder({ selectedFulfillment }) + + // Обработчики событий для блоков + const handleSupplierSelect = (supplier: GoodsSupplier) => { + setSelectedSupplier(supplier) + // Сбрасываем выбранные товары при смене поставщика + setAllSelectedProducts([]) + setSelectedGoods([]) + } + + const handleProductAdd = (product: GoodsProduct) => { + const quantity = getProductQuantity(product.id) || 1 + addProductToSelected(product, quantity) + initializeProductRecipe(product.id) + + // Добавляем в корзину + addToCart(product, quantity) + } + + const handleQuantityChange = (productId: string, quantity: number) => { + updateSelectedProductQuantity(productId, quantity) + + // Синхронизируем с корзиной + const product = allSelectedProducts.find((p) => p.id === productId) + if (product && quantity > 0) { + addToCart(product, quantity) + } else if (quantity === 0) { + removeFromCart(productId) + removeProductFromSelected(productId) + } + } + + const handleRecipeChange = (productId: string, recipe: ProductRecipe) => { + setProductRecipes((prev) => ({ + ...prev, + [productId]: recipe, + })) + } + + // Обработчик ошибок + if (suppliersError) { + return ( +