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 (
{doc.description}
Review and attest to compliance requirements
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.
You've successfully reviewed all required documents and attested to compliance requirements.