'use client'; import { useState } from 'react'; import { useParams } from 'next/navigation'; import { Plus } from 'lucide-react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { DataTable } from '@/components/shared/data-table'; import { FilterBar } from '@/components/shared/filter-bar'; import { SavedViewsDropdown } from '@/components/shared/saved-views-dropdown'; import { PageHeader } from '@/components/shared/page-header'; import { EmptyState } from '@/components/shared/empty-state'; import { TableSkeleton } from '@/components/shared/loading-skeleton'; import { ArchiveConfirmDialog } from '@/components/shared/archive-confirm-dialog'; import { PermissionGate } from '@/components/shared/permission-gate'; import { CompanyCard } from '@/components/companies/company-card'; import { CompanyForm } from '@/components/companies/company-form'; import { companyFilterDefinitions } from '@/components/companies/company-filters'; import { getCompanyColumns, type CompanyRow } from '@/components/companies/company-columns'; import { usePaginatedQuery } from '@/hooks/use-paginated-query'; import { useRealtimeInvalidation } from '@/hooks/use-realtime-invalidation'; import { apiFetch } from '@/lib/api/client'; export function CompanyList() { const params = useParams<{ portSlug: string }>(); const portSlug = params?.portSlug ?? ''; const queryClient = useQueryClient(); const [createOpen, setCreateOpen] = useState(false); const [editCompany, setEditCompany] = useState(null); const [archiveCompany, setArchiveCompany] = useState(null); const { data, pagination, isLoading, isFetching, sort, setSort, setPage, setPageSize, filters, setFilter, clearFilters, } = usePaginatedQuery({ queryKey: ['companies'], endpoint: '/api/v1/companies', filterDefinitions: companyFilterDefinitions, }); useRealtimeInvalidation({ 'company:created': [['companies']], 'company:updated': [['companies']], 'company:archived': [['companies']], }); const archiveMutation = useMutation({ mutationFn: (id: string) => apiFetch(`/api/v1/companies/${id}`, { method: 'DELETE' }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['companies'] }); setArchiveCompany(null); }, }); const columns = getCompanyColumns({ portSlug, onEdit: (company) => setEditCompany(company), onArchive: (company) => setArchiveCompany(company), }); return (
} />
{ clearFilters(); Object.entries(savedFilters).forEach(([key, val]) => setFilter(key, val)); }} />
{isLoading ? ( ) : !data.length ? ( setCreateOpen(true) }} /> ) : ( { setPage(p); setPageSize(ps); }} sort={sort} onSortChange={setSort} isLoading={isFetching && !isLoading} getRowId={(row) => row.id} cardRender={(row) => ( )} emptyState={ setCreateOpen(true) }} /> } /> )} {editCompany && ( !open && setEditCompany(null)} company={{ id: editCompany.id, name: editCompany.name, legalName: editCompany.legalName, taxId: editCompany.taxId, registrationNumber: editCompany.registrationNumber, incorporationCountryIso: editCompany.incorporationCountryIso, incorporationSubdivisionIso: editCompany.incorporationSubdivisionIso, incorporationDate: editCompany.incorporationDate, status: editCompany.status, billingEmail: editCompany.billingEmail, notes: editCompany.notes, }} /> )} !open && setArchiveCompany(null)} entityName={archiveCompany?.name ?? ''} entityType="Company" isArchived={false} onConfirm={() => archiveCompany && archiveMutation.mutate(archiveCompany.id)} isLoading={archiveMutation.isPending} />
); }