import React, { useState } from "react"; import { base44 } from "@/api/base44Client"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Zap, Send, Check, Edit3, MapPin, Clock, Users, AlertCircle, Sparkles } from "lucide-react"; import { useToast } from "@/components/ui/use-toast"; import { motion, AnimatePresence } from "framer-motion"; export default function RapidOrderChat({ onOrderCreated }) { const { toast } = useToast(); const queryClient = useQueryClient(); const [message, setMessage] = useState(""); const [conversation, setConversation] = useState([]); const [detectedOrder, setDetectedOrder] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const { data: user } = useQuery({ queryKey: ['current-user-rapid'], queryFn: () => base44.auth.me(), }); const { data: businesses } = useQuery({ queryKey: ['user-businesses'], queryFn: () => base44.entities.Business.filter({ contact_name: user?.full_name }), enabled: !!user, initialData: [], }); const createRapidOrderMutation = useMutation({ mutationFn: (orderData) => base44.entities.Event.create(orderData), onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: ['events'] }); toast({ title: "✅ RAPID Order Created", description: "Order sent to preferred vendor with priority notification", }); if (onOrderCreated) onOrderCreated(data); // Reset setConversation([]); setDetectedOrder(null); setMessage(""); }, }); const analyzeMessage = async (msg) => { setIsProcessing(true); // Add user message to conversation setConversation(prev => [...prev, { role: 'user', content: msg }]); try { // Use AI to parse the message const response = await base44.integrations.Core.InvokeLLM({ prompt: `You are an order assistant. Analyze this message and extract order details: Message: "${msg}" Current user: ${user?.full_name} User's locations: ${businesses.map(b => b.business_name).join(', ')} Extract: 1. Urgency keywords (ASAP, today, emergency, call out, urgent, rapid, now) 2. Role/position needed (cook, bartender, server, dishwasher, etc.) 3. Number of staff (if mentioned) 4. Time frame (if mentioned) 5. Location (if mentioned, otherwise use first available location) Return a concise summary.`, response_json_schema: { type: "object", properties: { is_urgent: { type: "boolean" }, role: { type: "string" }, count: { type: "number" }, location: { type: "string" }, time_mentioned: { type: "boolean" }, start_time: { type: "string" }, end_time: { type: "string" } } } }); const parsed = response; const primaryLocation = businesses[0]?.business_name || "Primary Location"; const order = { is_rapid: parsed.is_urgent || true, role: parsed.role || "Staff Member", count: parsed.count || 1, location: parsed.location || primaryLocation, start_time: parsed.start_time || "ASAP", end_time: parsed.end_time || "End of shift", business_name: primaryLocation, hub: businesses[0]?.hub_building || "Main Hub" }; setDetectedOrder(order); // AI response const aiMessage = `Is this a RAPID ORDER for **${order.count} ${order.role}${order.count > 1 ? 's' : ''}** at **${order.location}**?\n\nTime: ${order.start_time} → ${order.end_time}`; setConversation(prev => [...prev, { role: 'assistant', content: aiMessage, showConfirm: true }]); } catch (error) { setConversation(prev => [...prev, { role: 'assistant', content: "I couldn't process that. Please provide more details like: role needed, how many, and when." }]); } finally { setIsProcessing(false); } }; const handleSendMessage = () => { if (!message.trim()) return; analyzeMessage(message); setMessage(""); }; const handleConfirmOrder = () => { if (!detectedOrder) return; const now = new Date(); const orderData = { event_name: `RAPID: ${detectedOrder.count} ${detectedOrder.role}${detectedOrder.count > 1 ? 's' : ''}`, is_rapid: true, status: "Pending", business_name: detectedOrder.business_name, hub: detectedOrder.hub, event_location: detectedOrder.location, date: now.toISOString().split('T')[0], requested: detectedOrder.count, client_name: user?.full_name, client_email: user?.email, notes: `RAPID ORDER - ${detectedOrder.start_time} to ${detectedOrder.end_time}`, shifts: [{ shift_name: "Emergency Shift", roles: [{ role: detectedOrder.role, count: detectedOrder.count, start_time: "ASAP", end_time: "End of shift" }] }] }; createRapidOrderMutation.mutate(orderData); }; const handleEditOrder = () => { setConversation(prev => [...prev, { role: 'assistant', content: "Please describe what you'd like to change." }]); setDetectedOrder(null); }; return (
RAPID Order Assistant

Emergency staffing in minutes

URGENT
{/* Chat Messages */}
{conversation.length === 0 && (

Need staff urgently?

Just describe what you need, I'll handle the rest

Example: "We had a call out. Need 2 cooks ASAP"
Example: "Emergency! Need bartender for tonight"
)} {conversation.map((msg, idx) => (
{msg.role === 'assistant' && (
AI Assistant
)}

{msg.content}

{msg.showConfirm && detectedOrder && (

Staff Needed

{detectedOrder.count} {detectedOrder.role}{detectedOrder.count > 1 ? 's' : ''}

Location

{detectedOrder.location}

Time

{detectedOrder.start_time} → {detectedOrder.end_time}

)}
))}
{isProcessing && (
Processing your request...
)}
{/* Input */}
setMessage(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} placeholder="Describe what you need... (e.g., 'Need 2 cooks ASAP')" className="flex-1 border-2 border-red-300 focus:border-red-500 text-base" disabled={isProcessing} />
{/* Helper Text */}
Tip: Include role, quantity, and urgency for fastest processing. AI will auto-detect your location and send to your preferred vendor.
); }