'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 { YachtForm } from '@/components/yachts/yacht-form'; import { yachtFilterDefinitions } from '@/components/yachts/yacht-filters'; import { getYachtColumns, type YachtRow } from '@/components/yachts/yacht-columns'; import { usePaginatedQuery } from '@/hooks/use-paginated-query'; import { useRealtimeInvalidation } from '@/hooks/use-realtime-invalidation'; import { apiFetch } from '@/lib/api/client'; export function YachtList() { const params = useParams<{ portSlug: string }>(); const portSlug = params?.portSlug ?? ''; const queryClient = useQueryClient(); const [createOpen, setCreateOpen] = useState(false); const [editYacht, setEditYacht] = useState(null); const [archiveYacht, setArchiveYacht] = useState(null); const { data, pagination, isLoading, isFetching, sort, setSort, setPage, setPageSize, filters, setFilter, clearFilters, } = usePaginatedQuery({ queryKey: ['yachts'], endpoint: '/api/v1/yachts', filterDefinitions: yachtFilterDefinitions, }); useRealtimeInvalidation({ 'yacht:created': [['yachts']], 'yacht:updated': [['yachts']], 'yacht:archived': [['yachts']], 'yacht:ownership_transferred': [['yachts']], }); const archiveMutation = useMutation({ mutationFn: (id: string) => apiFetch(`/api/v1/yachts/${id}`, { method: 'DELETE' }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['yachts'] }); setArchiveYacht(null); }, }); const columns = getYachtColumns({ portSlug, onEdit: (yacht) => setEditYacht(yacht), onArchive: (yacht) => setArchiveYacht(yacht), }); 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} emptyState={ setCreateOpen(true) }} /> } /> )} {editYacht && ( !open && setEditYacht(null)} yacht={{ id: editYacht.id, name: editYacht.name, hullNumber: editYacht.hullNumber, registration: editYacht.registration, lengthFt: editYacht.lengthFt, widthFt: editYacht.widthFt, draftFt: editYacht.draftFt, lengthM: editYacht.lengthM, widthM: editYacht.widthM, currentOwnerType: editYacht.currentOwnerType, currentOwnerId: editYacht.currentOwnerId, status: editYacht.status, }} /> )} !open && setArchiveYacht(null)} entityName={archiveYacht?.name ?? ''} entityType="Yacht" isArchived={false} onConfirm={() => archiveYacht && archiveMutation.mutate(archiveYacht.id)} isLoading={archiveMutation.isPending} />
); }