diff --git a/dev.log b/dev.log index dfea203..b5d14a6 100644 --- a/dev.log +++ b/dev.log @@ -41,3 +41,9 @@ POST /api/graphql 200 in 936ms POST /api/graphql 200 in 638ms POST /api/graphql 200 in 489ms + POST /api/graphql 200 in 560ms + POST /api/graphql 200 in 473ms + POST /api/graphql 200 in 1273ms + POST /api/graphql 200 in 1323ms + POST /api/graphql 200 in 475ms + POST /api/graphql 200 in 907ms diff --git a/src/components/supplies/create-suppliers/blocks/CartBlock.tsx b/src/components/supplies/create-suppliers/blocks/CartBlock.tsx index acc0262..51c900e 100644 --- a/src/components/supplies/create-suppliers/blocks/CartBlock.tsx +++ b/src/components/supplies/create-suppliers/blocks/CartBlock.tsx @@ -8,13 +8,14 @@ 'use client' import { ShoppingCart, X } from 'lucide-react' +import React from 'react' import { Button } from '@/components/ui/button' import { DatePicker } from '@/components/ui/date-picker' import type { CartBlockProps } from '../types/supply-creation.types' -export function CartBlock({ +export const CartBlock = React.memo(function CartBlock({ selectedGoods, selectedSupplier, deliveryDate, @@ -155,4 +156,4 @@ export function CartBlock({ ) -} +}) diff --git a/src/components/supplies/create-suppliers/blocks/DetailedCatalogBlock.tsx b/src/components/supplies/create-suppliers/blocks/DetailedCatalogBlock.tsx index 08d6b9d..686804a 100644 --- a/src/components/supplies/create-suppliers/blocks/DetailedCatalogBlock.tsx +++ b/src/components/supplies/create-suppliers/blocks/DetailedCatalogBlock.tsx @@ -9,6 +9,7 @@ import { Package, Settings, Building2 } from 'lucide-react' import Image from 'next/image' +import React from 'react' import { Badge } from '@/components/ui/badge' import { DatePicker } from '@/components/ui/date-picker' @@ -24,7 +25,7 @@ import type { SellerConsumable, } from '../types/supply-creation.types' -export function DetailedCatalogBlock({ +export const DetailedCatalogBlock = React.memo(function DetailedCatalogBlock({ allSelectedProducts, productRecipes, fulfillmentServices, @@ -129,7 +130,7 @@ export function DetailedCatalogBlock({ ) -} +}) // Компонент детальной карточки товара с рецептурой interface ProductDetailCardProps { diff --git a/src/components/supplies/create-suppliers/blocks/ProductCardsBlock.tsx b/src/components/supplies/create-suppliers/blocks/ProductCardsBlock.tsx index 35011b7..f8e827e 100644 --- a/src/components/supplies/create-suppliers/blocks/ProductCardsBlock.tsx +++ b/src/components/supplies/create-suppliers/blocks/ProductCardsBlock.tsx @@ -9,12 +9,17 @@ import { Package, Plus } from 'lucide-react' import Image from 'next/image' +import React from 'react' import { Badge } from '@/components/ui/badge' import type { ProductCardsBlockProps } from '../types/supply-creation.types' -export function ProductCardsBlock({ products, selectedSupplier, onProductAdd }: ProductCardsBlockProps) { +export const ProductCardsBlock = React.memo(function ProductCardsBlock({ + products, + selectedSupplier, + onProductAdd, +}: ProductCardsBlockProps) { if (!selectedSupplier) { return (
@@ -141,4 +146,4 @@ export function ProductCardsBlock({ products, selectedSupplier, onProductAdd }:
) -} +}) diff --git a/src/components/supplies/create-suppliers/blocks/SuppliersBlock.tsx b/src/components/supplies/create-suppliers/blocks/SuppliersBlock.tsx index 8169734..e7e2b87 100644 --- a/src/components/supplies/create-suppliers/blocks/SuppliersBlock.tsx +++ b/src/components/supplies/create-suppliers/blocks/SuppliersBlock.tsx @@ -8,13 +8,14 @@ 'use client' import { Search } from 'lucide-react' +import React from 'react' import { OrganizationAvatar } from '@/components/market/organization-avatar' import { Input } from '@/components/ui/input' import type { SuppliersBlockProps } from '../types/supply-creation.types' -export function SuppliersBlock({ +export const SuppliersBlock = React.memo(function SuppliersBlock({ suppliers, selectedSupplier, searchQuery, @@ -132,7 +133,7 @@ export function SuppliersBlock({ )} ) -} +}) // Утилитарная функция для меток рынков (временно, потом перенести в хук) function getMarketLabel(market?: string) { diff --git a/src/components/supplies/create-suppliers/index.tsx b/src/components/supplies/create-suppliers/index.tsx index fe7952e..fa1fc98 100644 --- a/src/components/supplies/create-suppliers/index.tsx +++ b/src/components/supplies/create-suppliers/index.tsx @@ -9,6 +9,7 @@ import { ArrowLeft } from 'lucide-react' import { useRouter } from 'next/navigation' +import React, { useCallback } from 'react' import { Sidebar } from '@/components/dashboard/sidebar' import { Button } from '@/components/ui/button' @@ -89,41 +90,53 @@ export function CreateSuppliersSupplyPage() { } = useRecipeBuilder({ selectedFulfillment }) // Обработчики событий для блоков - const handleSupplierSelect = (supplier: GoodsSupplier) => { - setSelectedSupplier(supplier) - // Сбрасываем выбранные товары при смене поставщика - setAllSelectedProducts([]) - setSelectedGoods([]) - } + const handleSupplierSelect = useCallback( + (supplier: GoodsSupplier) => { + setSelectedSupplier(supplier) + // Сбрасываем выбранные товары при смене поставщика + setAllSelectedProducts([]) + setSelectedGoods([]) + }, + [setSelectedSupplier, setAllSelectedProducts, setSelectedGoods], + ) - const handleProductAdd = (product: GoodsProduct) => { - const quantity = getProductQuantity(product.id) || 1 - addProductToSelected(product, quantity) - initializeProductRecipe(product.id) + const handleProductAdd = useCallback( + (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) - } - } + }, + [getProductQuantity, addProductToSelected, initializeProductRecipe, addToCart], + ) - const handleRecipeChange = (productId: string, recipe: ProductRecipe) => { - setProductRecipes((prev) => ({ - ...prev, - [productId]: recipe, - })) - } + const handleQuantityChange = useCallback( + (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) + } + }, + [updateSelectedProductQuantity, allSelectedProducts, addToCart, removeFromCart, removeProductFromSelected], + ) + + const handleRecipeChange = useCallback( + (productId: string, recipe: ProductRecipe) => { + setProductRecipes((prev) => ({ + ...prev, + [productId]: recipe, + })) + }, + [setProductRecipes], + ) // Обработчик ошибок if (suppliersError) {