import React, { useState } from "react"; import { base44 } from "@/api/base44Client"; import { useMutation, useQueryClient, useQuery } from "@tanstack/react-query"; import { useNavigate } from "react-router-dom"; import { createPageUrl } from "@/utils"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Badge } from "@/components/ui/badge"; import { Send, ArrowLeft, Mail, Building2, User, Percent, CheckCircle2, Loader2, Info, Sparkles } from "lucide-react"; import { useToast } from "@/components/ui/use-toast"; import { HoverCard, HoverCardContent, HoverCardTrigger, } from "@/components/ui/hover-card"; import PageHeader from "@/components/common/PageHeader"; export default function InviteVendor() { const { toast } = useToast(); const queryClient = useQueryClient(); const navigate = useNavigate(); const { data: user } = useQuery({ queryKey: ['current-user-invite'], queryFn: () => base44.auth.me(), }); const [inviteData, setInviteData] = useState({ company_name: "", primary_contact_name: "", primary_contact_email: "", vendor_admin_fee: 12, notes: "" }); const sendInviteMutation = useMutation({ mutationFn: async (data) => { // Generate unique invite code const inviteCode = `INV-${Math.floor(10000 + Math.random() * 90000)}`; // Create invite record const invite = await base44.entities.VendorInvite.create({ invite_code: inviteCode, company_name: data.company_name, primary_contact_name: data.primary_contact_name, primary_contact_email: data.primary_contact_email, vendor_admin_fee: parseFloat(data.vendor_admin_fee), invited_by: user?.email || "admin", invite_status: "pending", invite_sent_date: new Date().toISOString(), notes: data.notes }); // Send email to vendor const onboardingUrl = `${window.location.origin}${createPageUrl('SmartVendorOnboarding')}?invite=${inviteCode}`; await base44.integrations.Core.SendEmail({ from_name: "KROW Platform", to: data.primary_contact_email, subject: `Welcome to KROW! You're Invited to Join Our Vendor Network`, body: `

Welcome to KROW!

You've been invited to join our vendor network

Hi ${data.primary_contact_name},

Great news! We'd like to invite ${data.company_name} to join the KROW vendor network. Our platform connects top-tier service providers with clients who need reliable, high-quality staffing solutions.

Why Join KROW?

  • Access to vetted enterprise clients
  • Streamlined order management
  • Instant AI-powered rate proposals
  • Real-time market intelligence
  • Automated compliance tracking
Start Onboarding →

📋 What to Prepare:
• W-9 Tax Form
• Certificate of Insurance (COI)
• Secretary of State Certificate
• List of positions you can provide
• Your competitive rate proposals

Your invite code: ${inviteCode}
Vendor fee: ${data.vendor_admin_fee}%
Questions? Reply to this email or contact us at support@krow.com

This invitation was sent by ${user?.full_name || user?.email} from KROW.

` }); return invite; }, onSuccess: (invite) => { queryClient.invalidateQueries(['vendor-invites']); toast({ title: "Invite Sent Successfully!", description: `${inviteData.company_name} will receive an email at ${inviteData.primary_contact_email}`, }); // Reset form setInviteData({ company_name: "", primary_contact_name: "", primary_contact_email: "", vendor_admin_fee: 12, notes: "" }); }, onError: (error) => { toast({ title: "Failed to Send Invite", description: error.message, variant: "destructive" }); } }); const handleSubmit = (e) => { e.preventDefault(); if (!inviteData.company_name || !inviteData.primary_contact_email) { toast({ title: "Missing Information", description: "Please fill in company name and contact email", variant: "destructive" }); return; } sendInviteMutation.mutate(inviteData); }; return (
navigate(createPageUrl("VendorManagement"))} > Back to Vendors } /> {/* Info Banner */}

Smart Vendor Onboarding

Send an invite with a custom vendor fee. The vendor will receive a welcome email with an onboarding link powered by AI for document validation, rate proposals, and market intelligence.

{/* Invite Form */}
Vendor Invitation Details

Fill in the vendor information below

{/* Company Name */}
setInviteData(prev => ({ ...prev, company_name: e.target.value }))} placeholder="ABC Staffing Solutions LLC" className="mt-2" required />
{/* Contact Information */}
setInviteData(prev => ({ ...prev, primary_contact_name: e.target.value }))} placeholder="John Smith" className="mt-2" />
setInviteData(prev => ({ ...prev, primary_contact_email: e.target.value }))} placeholder="john@abcstaffing.com" className="mt-2" required />
{/* Vendor Fee */}
setInviteData(prev => ({ ...prev, vendor_admin_fee: e.target.value }))} className="w-32" required /> This fee will be automatically applied to all vendor rate proposals
{/* Internal Notes */}