feat(ui): company detail page with header, tabs, members, owned yachts

This commit is contained in:
Matt Ciaccio
2026-04-24 13:59:21 +02:00
parent d6743ed52c
commit 5d76a8a1cf
6 changed files with 842 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
'use client';
import { useQuery } from '@tanstack/react-query';
import { useParams } from 'next/navigation';
import { DetailLayout } from '@/components/shared/detail-layout';
import { CompanyDetailHeader } from '@/components/companies/company-detail-header';
import { getCompanyTabs } from '@/components/companies/company-tabs';
import { useRealtimeInvalidation } from '@/hooks/use-realtime-invalidation';
import { apiFetch } from '@/lib/api/client';
export interface CompanyData {
id: string;
portId: string;
name: string;
legalName: string | null;
taxId: string | null;
registrationNumber: string | null;
incorporationCountry: string | null;
incorporationDate: string | null;
status: string;
billingEmail: string | null;
notes: string | null;
archivedAt: string | null;
createdAt: string;
updatedAt: string;
}
interface CompanyDetailProps {
companyId: string;
currentUserId?: string;
}
export function CompanyDetail({ companyId, currentUserId }: CompanyDetailProps) {
const params = useParams<{ portSlug: string }>();
const portSlug = params?.portSlug ?? '';
const { data, isLoading } = useQuery<CompanyData>({
queryKey: ['companies', companyId],
queryFn: () =>
apiFetch<{ data: CompanyData }>(`/api/v1/companies/${companyId}`).then((r) => r.data),
});
useRealtimeInvalidation({
'company:updated': [['companies', companyId]],
'company:archived': [['companies', companyId]],
'company_membership:added': [['companies', companyId, 'members']],
'company_membership:updated': [['companies', companyId, 'members']],
'company_membership:ended': [['companies', companyId, 'members']],
});
const tabs = data ? getCompanyTabs({ companyId, portSlug, currentUserId, company: data }) : [];
return (
<DetailLayout
header={data ? <CompanyDetailHeader company={data} /> : null}
tabs={tabs}
defaultTab="overview"
isLoading={isLoading}
/>
);
}