Оптимизирована производительность 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,20 +1,22 @@
"use client"
'use client'
import { useState } from "react"
import { Button } from "@/components/ui/button"
import { GlassInput } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { AuthLayout } from "./auth-layout"
import { Phone, ArrowRight } from "lucide-react"
import { useMutation } from '@apollo/client'
import { Phone, ArrowRight } from 'lucide-react'
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import { GlassInput } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { SEND_SMS_CODE } from '@/graphql/mutations'
import { AuthLayout } from './auth-layout'
interface PhoneStepProps {
onNext: (phone: string) => void
}
export function PhoneStep({ onNext }: PhoneStepProps) {
const [phone, setPhone] = useState("")
const [phone, setPhone] = useState('')
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState<string | null>(null)
@ -22,7 +24,7 @@ export function PhoneStep({ onNext }: PhoneStepProps) {
const formatPhoneNumber = (value: string) => {
const numbers = value.replace(/\D/g, '')
if (numbers.length === 0) return ''
if (numbers[0] === '8') {
const withoutFirst = numbers.slice(1)
@ -31,7 +33,7 @@ export function PhoneStep({ onNext }: PhoneStepProps) {
if (numbers[0] === '7') {
return formatRussianNumber(numbers)
}
return formatRussianNumber('7' + numbers)
}
@ -56,7 +58,7 @@ export function PhoneStep({ onNext }: PhoneStepProps) {
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
if (!isValidPhone(phone)) {
setError('Введите корректный номер телефона')
return
@ -67,12 +69,10 @@ export function PhoneStep({ onNext }: PhoneStepProps) {
try {
const cleanPhone = phone.replace(/\D/g, '')
const formattedPhone = cleanPhone.startsWith('8')
? '7' + cleanPhone.slice(1)
: cleanPhone
const formattedPhone = cleanPhone.startsWith('8') ? '7' + cleanPhone.slice(1) : cleanPhone
const { data } = await sendSmsCode({
variables: { phone: formattedPhone }
variables: { phone: formattedPhone },
})
if (data.sendSmsCode.success) {
@ -89,7 +89,7 @@ export function PhoneStep({ onNext }: PhoneStepProps) {
}
return (
<AuthLayout
<AuthLayout
title="Добро пожаловать!"
description="Введите номер телефона для входа в систему"
currentStep={1}
@ -114,27 +114,25 @@ export function PhoneStep({ onNext }: PhoneStepProps) {
// Устанавливаем курсор в начало если поле пустое или содержит только +7
if (phone === '' || phone === '+7') {
setTimeout(() => {
e.target.setSelectionRange(0, 0);
}, 0);
e.target.setSelectionRange(0, 0)
}, 0)
}
}}
/>
{error && (
<p className="text-red-400 text-xs">{error}</p>
)}
{error && <p className="text-red-400 text-xs">{error}</p>}
</div>
<Button
type="submit"
<Button
type="submit"
variant="glass"
size="lg"
className="w-full h-12 flex items-center gap-2"
disabled={!isValidPhone(phone) || isLoading}
>
{isLoading ? "Отправка..." : "Получить SMS код"}
{isLoading ? 'Отправка...' : 'Получить SMS код'}
<ArrowRight className="h-4 w-4" />
</Button>
</form>
</AuthLayout>
)
}
}