"use client" import * as React from "react" import { type Row } from "@tanstack/react-table" import { Loader, ChevronDown, BuildingIcon } from "lucide-react" import { toast } from "sonner" import { useMediaQuery } from "@/hooks/use-media-query" import { Button } from "@/components/ui/button" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, } from "@/components/ui/drawer" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Label } from "@/components/ui/label" import { Vendor } from "@/db/schema/vendors" import { requestPQVendors } from "../service" import { getProjects } from "@/lib/projects/service" import { useSession } from "next-auth/react" interface RequestProjectPQDialogProps extends React.ComponentPropsWithoutRef { vendors: Row["original"][] showTrigger?: boolean onSuccess?: () => void } export type Project = { id: number; projectCode: string; projectName: string; type: string; } export function RequestProjectPQDialog({ vendors, showTrigger = true, onSuccess, ...props }: RequestProjectPQDialogProps) { const [isApprovePending, startApproveTransition] = React.useTransition() const isDesktop = useMediaQuery("(min-width: 640px)") const [projects, setProjects] = React.useState([]) const [selectedProjectId, setSelectedProjectId] = React.useState(null) const [isLoadingProjects, setIsLoadingProjects] = React.useState(false) const { data: session } = useSession() // 프로젝트 목록 로드 React.useEffect(() => { async function loadProjects() { setIsLoadingProjects(true) try { const projectsList = await getProjects() setProjects(projectsList) } catch (error) { console.error("프로젝트 목록 로드 오류:", error) toast.error("프로젝트 목록을 불러오는 중 오류가 발생했습니다.") } finally { setIsLoadingProjects(false) } } loadProjects() }, []) // 다이얼로그가 닫힐 때 선택된 프로젝트 초기화 React.useEffect(() => { if (!props.open) { setSelectedProjectId(null) } }, [props.open]) // 프로젝트 선택 처리 const handleProjectChange = (value: string) => { setSelectedProjectId(Number(value)) } function onApprove() { if (!selectedProjectId) { toast.error("프로젝트를 선택해주세요.") return } if (!session?.user?.id) { toast.error("사용자 인증 정보를 찾을 수 없습니다.") return } startApproveTransition(async () => { const { error } = await requestPQVendors({ ids: vendors.map((vendor) => vendor.id), projectId: selectedProjectId, userId: Number(session.user.id) }) if (error) { toast.error(error) return } props.onOpenChange?.(false) toast.success(`협력업체에게 프로젝트 PQ가 성공적으로 요청되었습니다.`) onSuccess?.() }) } const dialogContent = ( <>
) if (isDesktop) { return ( {showTrigger ? ( ) : null} 프로젝트 PQ 요청 확인 {vendors.length} {vendors.length === 1 ? "개의 협력업체" : "개의 협력업체들"}에게 프로젝트 PQ 제출을 요청하시겠습니까? 요청을 보내면 협력업체에게 알림이 발송되고 프로젝트 PQ 정보를 입력할 수 있게 됩니다. {dialogContent} ) } return ( {showTrigger ? ( ) : null} 프로젝트 PQ 요청 확인 {vendors.length} {vendors.length === 1 ? "개의 협력업체" : "개의 협력업체들"}에게 프로젝트 PQ 제출을 요청하시겠습니까? 요청을 보내면 협력업체에게 알림이 발송되고 프로젝트 PQ 정보를 입력할 수 있게 됩니다.
{dialogContent}
) }