feat(documents): AggregatedSection + useAggregatedListing
Two TanStack Query hooks fetch the entity-aggregated payload for files and workflows; AggregatedSection renders one labelled subsection per owner-source group with a Show all (N) button wired via the onShowAll callback. Dumb component — parent owns the row rendering + drill- through navigation (Task 15 composes this into EntityFolderView). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
63
src/hooks/use-aggregated-listing.ts
Normal file
63
src/hooks/use-aggregated-listing.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
'use client';
|
||||
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
|
||||
import { apiFetch } from '@/lib/api/client';
|
||||
|
||||
export interface AggregatedFile {
|
||||
id: string;
|
||||
filename: string;
|
||||
mimeType: string | null;
|
||||
createdAt: string;
|
||||
folderId: string | null;
|
||||
clientId: string | null;
|
||||
companyId: string | null;
|
||||
yachtId: string | null;
|
||||
}
|
||||
|
||||
export interface AggregatedWorkflow {
|
||||
id: string;
|
||||
title: string;
|
||||
status: string;
|
||||
documentType: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export interface AggregatedGroup<T> {
|
||||
label: string;
|
||||
source: 'direct' | 'client' | 'company' | 'yacht';
|
||||
files?: T[];
|
||||
workflows?: T[];
|
||||
total: number;
|
||||
}
|
||||
|
||||
export function useAggregatedFiles(
|
||||
entityType: 'client' | 'company' | 'yacht' | undefined,
|
||||
entityId: string | undefined,
|
||||
) {
|
||||
return useQuery<AggregatedGroup<AggregatedFile>[]>({
|
||||
queryKey: ['files', 'aggregated', entityType, entityId],
|
||||
queryFn: () =>
|
||||
apiFetch<{ data: { groups: AggregatedGroup<AggregatedFile>[] } }>(
|
||||
`/api/v1/files?entityType=${entityType}&entityId=${entityId}`,
|
||||
).then((r) => r.data.groups),
|
||||
enabled: Boolean(entityType && entityId),
|
||||
staleTime: 10_000,
|
||||
});
|
||||
}
|
||||
|
||||
export function useAggregatedWorkflows(
|
||||
entityType: 'client' | 'company' | 'yacht' | undefined,
|
||||
entityId: string | undefined,
|
||||
) {
|
||||
return useQuery<AggregatedGroup<AggregatedWorkflow>[]>({
|
||||
queryKey: ['documents', 'aggregated', entityType, entityId],
|
||||
queryFn: () =>
|
||||
apiFetch<{ data: { groups: AggregatedGroup<AggregatedWorkflow>[] } }>(
|
||||
`/api/v1/documents?entityType=${entityType}&entityId=${entityId}`,
|
||||
).then((r) => r.data.groups),
|
||||
enabled: Boolean(entityType && entityId),
|
||||
staleTime: 10_000,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user