"use client" import * as React from "react" import { type Row } from "@tanstack/react-table" import { Loader, Send } 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 { Input } from "@/components/ui/input" import { VendorWithTbeFields } from "@/config/vendorTbeColumnsConfig" import { inviteTbeVendorsAction } from "@/lib/rfqs/service" interface InviteVendorsDialogProps extends React.ComponentPropsWithoutRef { vendors: Row["original"][] rfqId: number showTrigger?: boolean onSuccess?: () => void hasMultipleRfqIds?: boolean } export function InviteVendorsDialog({ vendors, rfqId, showTrigger = true, onSuccess, hasMultipleRfqIds, ...props }: InviteVendorsDialogProps) { const [isInvitePending, startInviteTransition] = React.useTransition() // multiple 파일을 받을 state const [files, setFiles] = React.useState(null) // 미디어쿼리 (desktop 여부) const isDesktop = useMediaQuery("(min-width: 640px)") function onInvite() { startInviteTransition(async () => { // 파일이 선택되지 않았다면 에러 if (!files || files.length === 0) { toast.error("Please attach TBE files before inviting.") return } // FormData 생성 const formData = new FormData() formData.append("rfqId", String(rfqId)) vendors.forEach((vendor) => { formData.append("vendorIds[]", String(vendor.id)) }) // multiple 파일 for (let i = 0; i < files.length; i++) { formData.append("tbeFiles", files[i]) // key는 동일하게 "tbeFiles" } // 서버 액션 호출 const { error } = await inviteTbeVendorsAction(formData) if (error) { toast.error(error) return } // 성공 props.onOpenChange?.(false) toast.success("Vendors invited with TBE!") onSuccess?.() }) } // 파일 선택 UI const fileInput = (
{ setFiles(e.target.files) }} />
) if (hasMultipleRfqIds) { toast.error("동일한 RFQ에 대해 선택해주세요"); return; } // Desktop Dialog if (isDesktop) { return ( {showTrigger ? ( ) : null} Are you absolutely sure? This action cannot be undone. This will permanently invite{" "} {vendors.length} {vendors.length === 1 ? " vendor" : " vendors"}. 파일 첨부가 필수이므로 파일을 첨부해야지 버튼이 활성화됩니다. {/* 파일 첨부 */} {fileInput} ) } // Mobile Drawer return ( {showTrigger ? ( ) : null} Are you absolutely sure? This action cannot be undone. This will permanently invite{" "} {vendors.length} {vendors.length === 1 ? " vendor" : " vendors"}. {/* 파일 첨부 */} {fileInput} ) }