Оптимизирована производительность 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:
Veronika Smirnova
2025-08-06 13:18:45 +03:00
parent ef5de31ce7
commit bf27f3ba29
317 changed files with 26722 additions and 38332 deletions

View File

@ -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>
);
)
}