Files
sfera-new/src/app/seller/warehouse/layout.tsx
Veronika Smirnova ca4d44d090 feat: implement direct routing to eliminate double redirects after registration
Replace dashboard intermediate routing with direct role-based navigation to improve UX
and reduce registration flow time from 4-5 seconds to 2-3 seconds.

Key Changes:
- Add routing utility lib/routing.ts with getHomePathFromUser function
- Update auth-flow.tsx, app/page.tsx, login/page.tsx to use direct routing
- Remove dashboard route and redirect components (3 files)
- Preserve critical components: sidebar/ and user-settings/ (43 dependencies)
- Fix breadcrumbs in seller/warehouse and fulfillment-supplies layouts
- Add comprehensive documentation and test coverage

Route Mapping:
- FULFILLMENT → /fulfillment/home
- SELLER → /seller/home
- LOGIST → /logistics/home
- WHOLESALE → /wholesale/home
- Fallback → /register

Testing:
- 8 comprehensive tests passed
- All routing scenarios validated
- Production build successful
- Critical components verified

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-19 18:46:22 +03:00

125 lines
4.6 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 { Home, Warehouse, Package } from 'lucide-react'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { AuthGuard } from '@/components/auth-guard'
import { Sidebar } from '@/components/dashboard/sidebar'
import { useRoleGuard } from '@/hooks/useRoleGuard'
import { useSidebar } from '@/hooks/useSidebar'
// Компонент Breadcrumbs
function Breadcrumbs({ pathname }: { pathname: string }) {
const segments = pathname.split('/').filter(Boolean)
const breadcrumbs = [{ name: 'Главная', href: '/seller/home', icon: Home }]
if (segments[0] === 'seller' && segments[1] === 'warehouse') {
breadcrumbs.push({ name: 'Склад', href: '/seller/warehouse', icon: Warehouse })
if (segments[2]) {
const sectionMap: Record<string, string> = {
fulfillment: 'Склад фулфилмент',
wildberries: 'Склад Wildberries',
storage: 'Мой склад',
}
const section = sectionMap[segments[2]]
if (section) {
breadcrumbs.push({
name: section,
href: `/seller/warehouse/${segments[2]}`,
icon: Package,
})
}
}
}
return (
<nav className="flex items-center space-x-2 text-sm text-white/60 mb-6">
{breadcrumbs.map((crumb, index) => (
<div key={crumb.href} className="flex items-center">
{index > 0 && <span className="mx-2 text-white/40">/</span>}
<Link href={crumb.href} className="flex items-center gap-1 hover:text-white transition-colors">
<crumb.icon className="h-4 w-4" />
{crumb.name}
</Link>
</div>
))}
</nav>
)
}
export default function SellerWarehouseLayout({ children }: { children: React.ReactNode }) {
useRoleGuard('SELLER')
const { getSidebarMargin } = useSidebar()
const pathname = usePathname()
// Определяем активный таб
const getActiveTab = () => {
if (pathname.includes('/fulfillment')) return 'fulfillment'
if (pathname.includes('/wildberries')) return 'wildberries'
if (pathname.includes('/storage')) return 'storage'
return 'fulfillment' // default
}
const activeTab = getActiveTab()
return (
<AuthGuard>
<div className="h-screen flex overflow-hidden">
<Sidebar />
<main className={`flex-1 ${getSidebarMargin()} px-6 py-4 overflow-hidden transition-all duration-300`}>
<div className="h-full w-full flex flex-col space-y-4">
{/* Breadcrumbs */}
<Breadcrumbs pathname={pathname} />
{/* Табы навигация - точно как в WBWarehouseDashboard */}
<div className="mb-6">
<div className="grid grid-cols-3 w-full max-w-md bg-white/5 border border-white/10 rounded-lg p-1">
<Link
href="/seller/warehouse/fulfillment"
className={`flex items-center justify-center gap-2 text-sm font-medium
transition-all duration-200 rounded-md px-3 py-2 whitespace-nowrap ${
activeTab === 'fulfillment'
? 'bg-blue-600 text-white shadow-lg'
: 'text-white/60 hover:text-white hover:bg-white/5'
}`}
>
Склад фулфилмент
</Link>
<Link
href="/seller/warehouse/wildberries"
className={`flex items-center justify-center gap-2 text-sm font-medium
transition-all duration-200 rounded-md px-3 py-2 ${
activeTab === 'wildberries'
? 'bg-blue-600 text-white shadow-lg'
: 'text-white/60 hover:text-white hover:bg-white/5'
}`}
>
Склад Wildberries
</Link>
<Link
href="/seller/warehouse/storage"
className={`flex items-center justify-center gap-2 text-sm font-medium
transition-all duration-200 rounded-md px-3 py-2 ${
activeTab === 'storage'
? 'bg-blue-600 text-white shadow-lg'
: 'text-white/60 hover:text-white hover:bg-white/5'
}`}
>
Мой склад
</Link>
</div>
</div>
{/* Контент страницы */}
<div className="flex-1 overflow-hidden min-h-0">{children}</div>
</div>
</main>
</div>
</AuthGuard>
)
}