From 5c9b39eb011763a7491b3e8542de9f6d4976dd65 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 23 Jun 2025 09:02:07 +0000 Subject: (최겸) 기술영업 벤더 개발 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/tech-vendors/tech-vendor-container.tsx | 100 ++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 components/tech-vendors/tech-vendor-container.tsx (limited to 'components/tech-vendors/tech-vendor-container.tsx') diff --git a/components/tech-vendors/tech-vendor-container.tsx b/components/tech-vendors/tech-vendor-container.tsx new file mode 100644 index 00000000..583d507c --- /dev/null +++ b/components/tech-vendors/tech-vendor-container.tsx @@ -0,0 +1,100 @@ +"use client" + +import * as React from "react" +import { useRouter, usePathname, useSearchParams } from "next/navigation" +import { ChevronDown } from "lucide-react" + +import { Button } from "@/components/ui/button" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" + +interface VendorType { + id: string + name: string + value: string +} + +interface TechVendorContainerProps { + vendorTypes: VendorType[] + children: React.ReactNode +} + +export function TechVendorContainer({ + vendorTypes, + children, +}: TechVendorContainerProps) { + const router = useRouter() + const pathname = usePathname() + const searchParamsObj = useSearchParams() + + // useSearchParams를 메모이제이션하여 안정적인 참조 생성 + const searchParams = React.useMemo( + () => searchParamsObj || new URLSearchParams(), + [searchParamsObj] + ) + + // URL에서 현재 선택된 벤더 타입 가져오기 + const vendorType = searchParams.get("vendorType") || "all" + + // 선택한 벤더 타입에 해당하는 이름 찾기 + const selectedVendor = vendorTypes.find((vendor) => vendor.id === vendorType)?.name || "전체" + + // 벤더 타입 변경 핸들러 + const handleVendorTypeChange = React.useCallback((value: string) => { + const params = new URLSearchParams(searchParams.toString()) + if (value === "all") { + params.delete("vendorType") + } else { + params.set("vendorType", value) + } + + router.push(`${pathname}?${params.toString()}`) + }, [router, pathname, searchParams]) + + return ( + <> + {/* 상단 영역: 제목 왼쪽 / 벤더 타입 선택기 오른쪽 */} +
+ {/* 왼쪽: 타이틀 & 설명 */} +
+

기술영업 벤더 리스트

+

+ 기술영업 벤더에 대한 요약 정보를 확인하고 관리할 수 있습니다. +

+
+ + {/* 오른쪽: 벤더 타입 드롭다운 */} + + + + + + {vendorTypes.map((vendor) => ( + handleVendorTypeChange(vendor.id)} + className={vendor.id === vendorType ? "bg-muted" : ""} + > + {vendor.name} + + ))} + + +
+ + {/* 컨텐츠 영역 */} +
+
+ {children} +
+
+ + ) +} \ No newline at end of file -- cgit v1.2.3