"use client" import * as React from "react" import { useRouter } from "next/navigation" import type { DataTableAdvancedFilterField, DataTableFilterField, DataTableRowAction, } from "@/types/table" import { useDataTable } from "@/hooks/use-data-table" import { DataTable } from "@/components/data-table/data-table" import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar" import { useFeatureFlags } from "./feature-flags-provider" import { getColumns } from "./investigation-table-columns" import { getVendorsInvestigation } from "../service" import { VendorsTableToolbarActions } from "./investigation-table-toolbar-actions" import { VendorInvestigationsViewWithContacts, ContactItem, PossibleItem } from "@/config/vendorInvestigationsColumnsConfig" import { UpdateVendorInvestigationSheet } from "./update-investigation-sheet" import { ItemsDrawer } from "./items-dialog" import { ContactsDialog } from "./contract-dialog" interface VendorsTableProps { promises: Promise< [ Awaited>, ] > } export function VendorsInvestigationTable({ promises }: VendorsTableProps) { const { featureFlags } = useFeatureFlags() // Get data from Suspense const [rawResponse] = React.use(promises) // Transform the data to match the expected types const transformedData: VendorInvestigationsViewWithContacts[] = React.useMemo(() => { return rawResponse.data.map(item => { // Parse contacts field if it's a string let contacts: ContactItem[] = [] if (typeof item.contacts === 'string') { try { contacts = JSON.parse(item.contacts) as ContactItem[] } catch (e) { console.error('Failed to parse contacts:', e) } } else if (Array.isArray(item.contacts)) { contacts = item.contacts } // Parse possibleItems field if it's a string let possibleItems: PossibleItem[] = [] if (typeof item.possibleItems === 'string') { try { possibleItems = JSON.parse(item.possibleItems) as PossibleItem[] } catch (e) { console.error('Failed to parse possibleItems:', e) } } else if (Array.isArray(item.possibleItems)) { possibleItems = item.possibleItems } // Return a new object with the transformed fields return { ...item, contacts, possibleItems } as VendorInvestigationsViewWithContacts }) }, [rawResponse.data]) console.log(transformedData) const pageCount = rawResponse.pageCount // Add state for row actions const [rowAction, setRowAction] = React.useState | null>(null) // Add state for contacts dialog const [contactsDialogOpen, setContactsDialogOpen] = React.useState(false) const [selectedContacts, setSelectedContacts] = React.useState([]) const [selectedContactInvestigationId, setSelectedContactInvestigationId] = React.useState(null) // Add state for items drawer const [itemsDrawerOpen, setItemsDrawerOpen] = React.useState(false) const [selectedItems, setSelectedItems] = React.useState([]) const [selectedItemInvestigationId, setSelectedItemInvestigationId] = React.useState(null) // Create handlers for opening the contacts dialog and items drawer const openContactsModal = React.useCallback((investigationId: number, contacts: ContactItem[]) => { setSelectedContactInvestigationId(investigationId) setSelectedContacts(contacts || []) setContactsDialogOpen(true) }, []) const openItemsDrawer = React.useCallback((investigationId: number, items: PossibleItem[]) => { setSelectedItemInvestigationId(investigationId) setSelectedItems(items || []) setItemsDrawerOpen(true) }, []) // Get router const router = useRouter() // Call getColumns() with all required functions const columns = React.useMemo( () => getColumns({ setRowAction, openContactsModal, openItemsDrawer }), [setRowAction, openContactsModal, openItemsDrawer] ) const filterFields: DataTableFilterField[] = [ { id: "vendorCode", label: "Vendor Code" }, ] const advancedFilterFields: DataTableAdvancedFilterField[] = [ { id: "vendorName", label: "Vendor Name", type: "text" }, { id: "vendorCode", label: "Vendor Code", type: "text" }, ] const { table } = useDataTable({ data: transformedData, columns, pageCount, filterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { sorting: [{ id: "investigationCreatedAt", desc: true }], columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => String(originalRow.investigationId), shallow: false, clearOnDefault: true, }) return ( <> {/* Update Investigation Sheet */} setRowAction(null)} investigation={rowAction?.row.original ?? null} /> {/* Contacts Dialog */} {/* Items Drawer */} ) }