app/(dashboard)/[storeId]/layout.tsx
import Navbar from '@/components/navbar';
export default async function DashboardLayout({
children,
params,
}: {
children: ReactNode;
params: { storeId: string };
}) {
const { userId } = auth();
if (!userId) {
redirect('/sign-in');
}
// store 정보 가져오기
const store = await prismadb.store.findFirst({
where: {
id: params.storeId,
userId,
},
});
// store 체크
if (!store) {
redirect('/');
}
return (
<>
<Navbar />
{children}
</>
);
}
<StoreSwitcher items={stores} />
<MainNav className='mx-6' />
map
을 돌려서 <Link>
컴포넌트로 링크를 만든다.export default function MainNav({
className,
...props
}: React.HTMLAttributes<HTMLElement>) {
const pathname = usePathname();
const params = useParams();
const routes = [
{
href: `/${params.storeId}/settings`,
label: 'Settings',
active: pathname === `/${params.storeId}/settings`,
},
];
return (
<nav className={cn('flex items-center space-x-4 lg:space-x-6', className)}>
{routes.map((route) => (
<Link
key={route.href}
href={route.href}
className={cn(
'text-sm font-medium transition-colors hover:text-primary',
route.active
? 'text-black dark:text-white'
: 'text-muted-foreground'
)}
>
{route.label}
</Link>
))}
</nav>
);
}
일단 DB의 store 정보를 format을 바꿔주낟.
const formattedItems = items.map((item) => ({
label: item.name,
value: item.id,
}));
현재 url (/store.id)와 item.value가 같으면 현재 선택된 currentStore에 저장한다.
// url에 있는 storeID와 비교해서 같으면 현재 활성화
const currentStore = formattedItems.find(
(item) => item.value === params.storeId
);
특정 store을 Select 하게 되면 해당 store.id로 push를 시전한다.
const onStoreSelect = (store: { value: string; label: string }) => {
setOpen(false);
router.push(`/${store.value}`);
};