"use client" import * as React from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Badge } from "@/components/ui/badge" import { Mail, Send, Loader2, UserCheck } from "lucide-react" import { toast } from "sonner" import { TechVendor } from "@/db/schema/techVendors" import { inviteTechVendor } from "../service" // 더 이상 폼 스키마 불필요 interface InviteTechVendorDialogProps { vendors: TechVendor[] open?: boolean onOpenChange?: (open: boolean) => void showTrigger?: boolean onSuccess?: () => void } export function InviteTechVendorDialog({ vendors, open, onOpenChange, showTrigger = true, onSuccess, }: InviteTechVendorDialogProps) { const [isLoading, setIsLoading] = React.useState(false) const onSubmit = async () => { if (vendors.length === 0) { toast.error("초대할 벤더를 선택해주세요.") return } setIsLoading(true) try { let successCount = 0 let errorCount = 0 for (const vendor of vendors) { try { const result = await inviteTechVendor({ vendorId: vendor.id, subject: "기술영업 협력업체 등록 초대", message: `안녕하세요. 저희 EVCP 플랫폼에서 기술영업 협력업체로 등록하여 다양한 프로젝트에 참여하실 수 있는 기회를 제공하고 있습니다. 아래 링크를 통해 업체 정보를 등록하시기 바랍니다. 감사합니다.`, recipientEmail: vendor.email || "", }) if (result.success) { successCount++ } else { errorCount++ console.error(`벤더 ${vendor.vendorName} 초대 실패:`, result.error) } } catch (error) { errorCount++ console.error(`벤더 ${vendor.vendorName} 초대 실패:`, error) } } if (successCount > 0) { toast.success(`${successCount}개 업체에 초대 메일이 성공적으로 발송되었습니다.`) onOpenChange?.(false) onSuccess?.() } if (errorCount > 0) { toast.error(`${errorCount}개 업체 초대 메일 발송에 실패했습니다.`) } } catch (error) { console.error("초대 메일 발송 실패:", error) toast.error("초대 메일 발송 중 오류가 발생했습니다.") } finally { setIsLoading(false) } } const getStatusBadge = (status: string) => { const statusConfig = { ACTIVE: { variant: "default" as const, text: "활성 상태", className: "bg-emerald-100 text-emerald-800" }, INACTIVE: { variant: "secondary" as const, text: "비활성 상태", className: "bg-gray-100 text-gray-800" }, PENDING_INVITE: { variant: "outline" as const, text: "초대 대기", className: "bg-blue-100 text-blue-800" }, INVITED: { variant: "outline" as const, text: "초대 완료", className: "bg-green-100 text-green-800" }, QUOTE_COMPARISON: { variant: "outline" as const, text: "견적 비교", className: "bg-purple-100 text-purple-800" }, BLACKLISTED: { variant: "destructive" as const, text: "거래 금지", className: "bg-red-100 text-red-800" }, } const config = statusConfig[status as keyof typeof statusConfig] || statusConfig.INACTIVE return {config.text} } if (vendors.length === 0) { return null } return ( {showTrigger && ( )} 기술영업 벤더 초대 선택한 {vendors.length}개 벤더에게 등록 초대 메일을 발송합니다.
{/* 벤더 정보 */}

초대 대상 벤더 ({vendors.length}개)

{vendors.map((vendor) => (
{vendor.vendorName}
{vendor.email || "이메일 없음"}
{getStatusBadge(vendor.status)}
))}
{/* 초대 확인 */}
) }