openreader/src/hooks/useLibraryDocumentsQuery.ts
Richard R e27d20419d refactor(ui): unify form primitives and simplify document selection modal
Move shared button, input, and listbox styles to a new formPrimitives module
used across admin panels, settings, and document settings. Update admin and
settings components to import these styles from the new location. Refactor
DocumentSelectionModal to use a direct files prop with loading and error
states, removing fetcher logic and internal fetch state. Add a custom hook
for library document queries. Clean up legacy admin/ui primitives and
standardize segmented controls and section layouts.
2026-05-13 18:42:31 -06:00

50 lines
1.5 KiB
TypeScript

'use client';
import { useCallback } from 'react';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import type { BaseDocument } from '@/types/documents';
export const LIBRARY_DOCUMENTS_QUERY_KEY = ['documents-library', 10000] as const;
async function fetchLibraryDocuments(): Promise<BaseDocument[]> {
const res = await fetch('/api/documents/library?limit=10000');
if (!res.ok) throw new Error('Failed to list library documents');
const data = (await res.json()) as { documents?: BaseDocument[] };
return data.documents || [];
}
export function useLibraryDocumentsQuery(enabled: boolean): {
documents: BaseDocument[];
isLoading: boolean;
errorMessage: string | null;
refetch: () => Promise<void>;
prefetch: () => Promise<void>;
} {
const queryClient = useQueryClient();
const query = useQuery({
queryKey: LIBRARY_DOCUMENTS_QUERY_KEY,
queryFn: fetchLibraryDocuments,
enabled,
staleTime: 60 * 1000,
});
const refetch = useCallback(async () => {
await query.refetch();
}, [query]);
const prefetch = useCallback(async () => {
await queryClient.prefetchQuery({
queryKey: LIBRARY_DOCUMENTS_QUERY_KEY,
queryFn: fetchLibraryDocuments,
staleTime: 60 * 1000,
});
}, [queryClient]);
return {
documents: query.data ?? [],
isLoading: query.isPending && !query.data,
errorMessage: query.error instanceof Error ? query.error.message : query.error ? 'Failed to list library documents' : null,
refetch,
prefetch,
};
}