Оптимизирована производительность React компонентов с помощью мемоизации
КРИТИЧНЫЕ КОМПОНЕНТЫ ОПТИМИЗИРОВАНЫ: • AdminDashboard (346 kB) - добавлены React.memo, useCallback, useMemo • SellerStatisticsDashboard (329 kB) - мемоизация кэша и callback функций • CreateSupplyPage (276 kB) - оптимизированы вычисления и обработчики • EmployeesDashboard (268 kB) - мемоизация списков и функций • SalesTab + AdvertisingTab - React.memo обертка ТЕХНИЧЕСКИЕ УЛУЧШЕНИЯ: ✅ React.memo() для предотвращения лишних рендеров ✅ useMemo() для тяжелых вычислений ✅ useCallback() для стабильных ссылок на функции ✅ Мемоизация фильтрации и сортировки списков ✅ Оптимизация пропсов в компонентах-контейнерах РЕЗУЛЬТАТЫ: • Все компоненты успешно компилируются • Линтер проходит без критических ошибок • Сохранена вся функциональность • Улучшена производительность рендеринга • Снижена нагрузка на React дерево 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -1,17 +1,19 @@
|
||||
"use client";
|
||||
'use client'
|
||||
|
||||
import React from "react";
|
||||
import { SupplierCard } from "./supplier-card";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Users, Search } from "lucide-react";
|
||||
import { SupplierForCreation, CounterpartySupplier } from "./types";
|
||||
import { Users, Search } from 'lucide-react'
|
||||
import React from 'react'
|
||||
|
||||
import { Input } from '@/components/ui/input'
|
||||
|
||||
import { SupplierCard } from './supplier-card'
|
||||
import { SupplierForCreation, CounterpartySupplier } from './types'
|
||||
|
||||
interface SupplierGridProps {
|
||||
suppliers: CounterpartySupplier[];
|
||||
onSupplierSelect: (supplier: SupplierForCreation) => void;
|
||||
searchQuery: string;
|
||||
onSearchChange: (query: string) => void;
|
||||
loading?: boolean;
|
||||
suppliers: CounterpartySupplier[]
|
||||
onSupplierSelect: (supplier: SupplierForCreation) => void
|
||||
searchQuery: string
|
||||
onSearchChange: (query: string) => void
|
||||
loading?: boolean
|
||||
}
|
||||
|
||||
export function SupplierGrid({
|
||||
@ -26,25 +28,25 @@ export function SupplierGrid({
|
||||
(supplier) =>
|
||||
supplier.name?.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
||||
supplier.fullName?.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
||||
supplier.inn?.toLowerCase().includes(searchQuery.toLowerCase())
|
||||
);
|
||||
supplier.inn?.toLowerCase().includes(searchQuery.toLowerCase()),
|
||||
)
|
||||
|
||||
const handleSupplierClick = (supplier: CounterpartySupplier) => {
|
||||
// Адаптируем данные под существующий интерфейс
|
||||
const adaptedSupplier: SupplierForCreation = {
|
||||
id: supplier.id,
|
||||
inn: supplier.inn || "",
|
||||
name: supplier.name || "Неизвестная организация",
|
||||
fullName: supplier.fullName || supplier.name || "Неизвестная организация",
|
||||
address: supplier.address || "Адрес не указан",
|
||||
inn: supplier.inn || '',
|
||||
name: supplier.name || 'Неизвестная организация',
|
||||
fullName: supplier.fullName || supplier.name || 'Неизвестная организация',
|
||||
address: supplier.address || 'Адрес не указан',
|
||||
phone: supplier.phones?.[0]?.value,
|
||||
email: supplier.emails?.[0]?.value,
|
||||
rating: 4.5, // Временное значение
|
||||
productCount: 0, // Временное значение
|
||||
specialization: ["Оптовая торговля"], // Временное значение
|
||||
};
|
||||
onSupplierSelect(adaptedSupplier);
|
||||
};
|
||||
specialization: ['Оптовая торговля'], // Временное значение
|
||||
}
|
||||
onSupplierSelect(adaptedSupplier)
|
||||
}
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
@ -54,7 +56,7 @@ export function SupplierGrid({
|
||||
<p className="text-white/60">Загружаем поставщиков...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
@ -76,14 +78,10 @@ export function SupplierGrid({
|
||||
<div className="text-center p-8">
|
||||
<Users className="h-12 w-12 text-white/20 mx-auto mb-4" />
|
||||
<p className="text-white/60">
|
||||
{searchQuery
|
||||
? "Поставщики не найдены"
|
||||
: "У вас нет контрагентов-поставщиков"}
|
||||
{searchQuery ? 'Поставщики не найдены' : 'У вас нет контрагентов-поставщиков'}
|
||||
</p>
|
||||
<p className="text-white/40 text-sm mt-2">
|
||||
{searchQuery
|
||||
? "Попробуйте изменить условия поиска"
|
||||
: 'Добавьте поставщиков в разделе "Партнеры"'}
|
||||
{searchQuery ? 'Попробуйте изменить условия поиска' : 'Добавьте поставщиков в разделе "Партнеры"'}
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
@ -91,17 +89,16 @@ export function SupplierGrid({
|
||||
{filteredSuppliers.map((supplier) => {
|
||||
const adaptedSupplier: SupplierForCreation = {
|
||||
id: supplier.id,
|
||||
inn: supplier.inn || "",
|
||||
name: supplier.name || "Неизвестная организация",
|
||||
fullName:
|
||||
supplier.fullName || supplier.name || "Неизвестная организация",
|
||||
address: supplier.address || "Адрес не указан",
|
||||
inn: supplier.inn || '',
|
||||
name: supplier.name || 'Неизвестная организация',
|
||||
fullName: supplier.fullName || supplier.name || 'Неизвестная организация',
|
||||
address: supplier.address || 'Адрес не указан',
|
||||
phone: supplier.phones?.[0]?.value,
|
||||
email: supplier.emails?.[0]?.value,
|
||||
rating: 4.5,
|
||||
productCount: 0,
|
||||
specialization: ["Оптовая торговля"],
|
||||
};
|
||||
specialization: ['Оптовая торговля'],
|
||||
}
|
||||
|
||||
return (
|
||||
<SupplierCard
|
||||
@ -109,10 +106,10 @@ export function SupplierGrid({
|
||||
supplier={adaptedSupplier}
|
||||
onClick={() => handleSupplierClick(supplier)}
|
||||
/>
|
||||
);
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user