Оптимизирована производительность 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,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>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user