Files
sfera-new/src/components/auth/cabinet-select-step.tsx
Veronika Smirnova bf27f3ba29 Оптимизирована производительность 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>
2025-08-06 13:18:45 +03:00

114 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use client'
import { Package, ShoppingCart, ArrowLeft, Truck, Building2 } from 'lucide-react'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { AuthLayout } from './auth-layout'
interface CabinetSelectStepProps {
onNext: (cabinetType: 'fulfillment' | 'seller' | 'logist' | 'wholesale') => void
onBack: () => void
}
export function CabinetSelectStep({ onNext, onBack }: CabinetSelectStepProps) {
const cabinets = [
{
id: 'fulfillment' as const,
title: 'Фулфилмент',
description: 'Склады и логистика',
icon: Package,
features: ['Склады', 'Логистика', 'ИНН'],
color: 'blue',
},
{
id: 'seller' as const,
title: 'Селлер',
description: 'Продажи на маркетплейсах',
icon: ShoppingCart,
features: ['Wildberries', 'Ozon', 'Аналитика'],
color: 'purple',
},
{
id: 'logist' as const,
title: 'Логистика',
description: 'Логистические решения',
icon: Truck,
features: ['Доставка', 'Склады', 'ИНН'],
color: 'green',
},
{
id: 'wholesale' as const,
title: 'Поставщик',
description: 'Поставки товаров',
icon: Building2,
features: ['Опт', 'Поставки', 'ИНН'],
color: 'orange',
},
]
return (
<AuthLayout
title="Выберите тип кабинета"
description="Выберите кабинет для управления"
currentStep={3}
totalSteps={5}
stepName="Тип кабинета"
>
<div className="space-y-4">
<div className="grid grid-cols-2 gap-3">
{cabinets.map((cabinet) => {
const IconComponent = cabinet.icon
return (
<button
key={cabinet.id}
onClick={() => onNext(cabinet.id)}
className="glass-card p-4 text-left transition-all hover:scale-[1.02] group relative h-full"
>
<div className="flex flex-col items-center text-center space-y-3">
<div
className={`p-3 rounded-lg ${
cabinet.color === 'blue'
? 'bg-blue-500/20'
: cabinet.color === 'purple'
? 'bg-purple-500/20'
: cabinet.color === 'green'
? 'bg-green-500/20'
: 'bg-orange-500/20'
}`}
>
<IconComponent className="h-6 w-6 text-white" />
</div>
<div className="space-y-2">
<h3 className="text-sm font-semibold text-white">{cabinet.title}</h3>
<p className="text-white/70 text-xs">{cabinet.description}</p>
<div className="flex flex-wrap gap-1 justify-center">
{cabinet.features.slice(0, 2).map((feature, index) => (
<Badge
key={index}
variant="outline"
className="glass-secondary text-white/60 border-white/20 text-xs px-1 py-0"
>
{feature}
</Badge>
))}
</div>
</div>
</div>
</button>
)
})}
</div>
<Button type="button" variant="glass-secondary" onClick={onBack} className="w-full flex items-center gap-2">
<ArrowLeft className="h-4 w-4" />
Назад
</Button>
</div>
</AuthLayout>
)
}