import React, { useState, useEffect } from "react"; // Added useEffect import { base44 } from "@/api/base44Client"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useNavigate } from "react-router-dom"; import { createPageUrl } from "@/utils"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; // Added CardHeader, CardTitle import { Badge } from "@/components/ui/badge"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; import { ArrowLeft, FileText, Shield, CheckCircle2, Clock, Eye } from "lucide-react"; import PageHeader from "../components/common/PageHeader"; import DocumentViewer from "../components/vendor/DocumentViewer"; import { useToast } from "@/components/ui/use-toast"; const ONBOARDING_DOCUMENTS = [ { id: "nda", name: "Confidentiality & Non-Disclosure Agreement", type: "NDA", url: "https://qtrypzzcjebvfcihiynt.supabase.co/storage/v1/object/public/base44-prod/public/68fc6cf01386035c266e7a5d/99cd2ac5c_LegendaryEventStaffingFOODBUYVendorNDA.pdf", description: "Confidential information protection agreement between Foodbuy and Legendary Event Staffing", required: true, icon: Shield, color: "from-purple-500 to-purple-600" }, { id: "contract", name: "Foodbuy Temporary Staffing Agreement", type: "Contract", url: "https://qtrypzzcjebvfcihiynt.supabase.co/storage/v1/object/public/base44-prod/public/68fc6cf01386035c266e7a5d/2c22905a2_FoodbuyDraftContract.pdf", description: "Standard temporary staffing service agreement with Foodbuy and Compass Group", required: true, icon: FileText, color: "from-blue-500 to-blue-600" }, { id: "service-agreement", name: "Vendor Service Standards Agreement", type: "Service Agreement", url: "https://qtrypzzcjebvfcihiynt.supabase.co/storage/v1/object/public/base44-prod/public/68fc6cf01386035c266e7a5d/e57a799cf_image.png", description: "Service standards including fill rate, response time, and compliance requirements", required: true, icon: Shield, color: "from-emerald-500 to-emerald-600" } ]; export default function VendorDocumentReview() { const navigate = useNavigate(); const queryClient = useQueryClient(); const { toast } = useToast(); const [activeDoc, setActiveDoc] = useState("nda"); // Changed from "contract" to "nda" const { data: user } = useQuery({ queryKey: ['current-user-doc-review'], queryFn: () => base44.auth.me(), }); const vendorName = user?.company_name || "Vendor"; const vendorId = user?.id; const [attestations, setAttestations] = useState({ background_checks: false, i9_verification: false, wage_compliance: false, general_compliance: false }); // Effect to load initial attestations from user data once available useEffect(() => { if (user?.attestations) { setAttestations(user.attestations); } }, [user]); // Run when user object changes // Fetch existing document reviews const { data: reviews = [] } = useQuery({ queryKey: ['vendor-document-reviews', vendorId], queryFn: async () => { if (!vendorId) return []; return await base44.entities.VendorDocumentReview.filter({ vendor_id: vendorId }); }, enabled: !!vendorId, initialData: [], }); // Save/update review mutation const saveReviewMutation = useMutation({ mutationFn: async ({ documentId, reviewData, acknowledged = false }) => { const doc = ONBOARDING_DOCUMENTS.find(d => d.id === documentId); if (!doc) return; const existingReview = reviews.find(r => r.vendor_id === vendorId && r.document_type === doc.type ); const fullReviewData = { vendor_id: vendorId, vendor_name: vendorName, document_type: doc.type, document_url: doc.url, document_name: doc.name, review_notes: reviewData.notes || "", time_spent_minutes: reviewData.reviewTime || 0, annotations: reviewData.annotations || [], bookmarks: reviewData.bookmarks || [], // Added bookmarks to reviewData reviewed: true, reviewed_date: new Date().toISOString(), acknowledged: acknowledged, acknowledged_date: acknowledged ? new Date().toISOString() : existingReview?.acknowledged_date, }; if (existingReview) { return await base44.entities.VendorDocumentReview.update(existingReview.id, fullReviewData); } else { return await base44.entities.VendorDocumentReview.create(fullReviewData); } }, onSuccess: (data, variables) => { queryClient.invalidateQueries({ queryKey: ['vendor-document-reviews'] }); // Show success toast if (variables.acknowledged) { toast({ title: "✅ Document Acknowledged", description: `${ONBOARDING_DOCUMENTS.find(d => d.id === variables.documentId)?.name} has been acknowledged`, }); } else { const annotationCount = variables.reviewData?.annotations?.length || 0; const bookmarkCount = variables.reviewData?.bookmarks?.length || 0; toast({ title: "✅ Progress Saved", description: `Saved ${annotationCount} annotations and ${bookmarkCount} bookmarks`, }); } }, onError: (error) => { toast({ title: "❌ Save Failed", description: "Failed to save. Please try again.", variant: "destructive", }); }, }); const handleSaveNotes = (reviewData) => { saveReviewMutation.mutate({ documentId: activeDoc, reviewData, acknowledged: false }); }; const handleAcknowledge = (reviewData) => { saveReviewMutation.mutate({ documentId: activeDoc, reviewData, acknowledged: true }); }; const getDocumentReview = (documentId) => { const doc = ONBOARDING_DOCUMENTS.find(d => d.id === documentId); return reviews.find(r => r.document_type === doc?.type); }; const handleAttestationChange = (field, value) => { setAttestations(prev => ({ ...prev, [field]: value })); }; const handleSaveAttestations = async () => { try { await base44.auth.updateMe({ attestations: attestations, attestation_date: new Date().toISOString() }); // Invalidate the user query to refetch updated attestations queryClient.invalidateQueries({ queryKey: ['current-user-doc-review'] }); toast({ title: "✅ Attestations Saved", description: "Your compliance attestations have been recorded", }); } catch (error) { console.error("Failed to save attestations:", error); toast({ title: "❌ Save Failed", description: "Failed to save attestations. Please try again.", variant: "destructive", }); } }; const allRequiredAcknowledged = ONBOARDING_DOCUMENTS .filter(doc => doc.required) .every(doc => { const review = getDocumentReview(doc.id); return review?.acknowledged; }); const acknowledgedCount = ONBOARDING_DOCUMENTS.filter(doc => { const review = getDocumentReview(doc.id); return review?.acknowledged; }).length; const allAttestationsAcknowledged = Object.values(attestations).every(val => val === true); return (
{/* Progress Overview */}

Onboarding Documents Progress

{acknowledgedCount}/{ONBOARDING_DOCUMENTS.length} Acknowledged
{ONBOARDING_DOCUMENTS.map(doc => { const review = getDocumentReview(doc.id); const Icon = doc.icon; return (
setActiveDoc(doc.id)} className={`p-4 border-2 rounded-lg cursor-pointer transition-all hover:shadow-md ${ activeDoc === doc.id ? 'border-[#0A39DF] bg-blue-50/50' : 'border-slate-200 hover:border-300' }`} >

{doc.name}

{doc.description}

{doc.required && ( Required )} {review?.acknowledged ? ( Acknowledged ) : review?.reviewed ? ( Reviewed ) : ( Not Started )} {review && review.time_spent_minutes > 0 && ( {review.time_spent_minutes} min )}
); })}
{/* Compliance Attestations Section */}
Compliance Attestations

Review and attest to compliance requirements

{allAttestationsAcknowledged && ( All Attested )}
{/* Background Checks Attestation */}
{/* I-9 Verification Attestation */}
{/* Wage Compliance Attestation */}
{/* General Compliance Attestation */}
{/* Save Attestations Button */}

Legal Notice: By checking these boxes, you are legally attesting that your organization complies with all stated requirements. False attestation may result in contract termination and legal action.

{/* Document Tabs */} {ONBOARDING_DOCUMENTS.map(doc => { const review = getDocumentReview(doc.id); const annotationCount = review?.annotations?.length || 0; return (
{doc.name.split(' ')[0]} {review?.acknowledged && ( )} {annotationCount > 0 && ( {annotationCount} )}
); })}
{ONBOARDING_DOCUMENTS.map(doc => { const review = getDocumentReview(doc.id); return ( ); })}
{/* Action Footer */} {allRequiredAcknowledged && allAttestationsAcknowledged && (

All Onboarding Requirements Met!

You've successfully reviewed all required documents and attested to compliance requirements.

)}
); }