bubble up search errors to ui

This commit is contained in:
phact 2025-12-01 22:42:46 -05:00
parent 8a14c69e54
commit f3aff1f090
2 changed files with 29 additions and 2 deletions

View file

@ -127,6 +127,12 @@ export const useGetSearchQuery = (
},
body: JSON.stringify(searchPayload),
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
throw new Error(errorData.error || `Search failed with status ${response.status}`);
}
const data = await response.json();
// Group chunks by filename to create file results similar to page.tsx
const fileMap = new Map<
@ -198,7 +204,8 @@ export const useGetSearchQuery = (
return files;
} catch (error) {
console.error("Error getting files", error);
return [];
// Re-throw the error so React Query can handle it and trigger onError callbacks
throw error;
}
}
@ -207,6 +214,7 @@ export const useGetSearchQuery = (
queryKey: ["search", queryData, query],
placeholderData: (prev) => prev,
queryFn: getFiles,
retry: false, // Don't retry on errors - show them immediately
...options,
},
queryClient,

View file

@ -75,6 +75,7 @@ function SearchPage() {
const { parsedFilterData, queryOverride } = useKnowledgeFilter();
const [selectedRows, setSelectedRows] = useState<File[]>([]);
const [showBulkDeleteDialog, setShowBulkDeleteDialog] = useState(false);
const lastErrorRef = useRef<string | null>(null);
const deleteDocumentMutation = useDeleteDocument();
@ -82,10 +83,28 @@ function SearchPage() {
refreshTasks();
}, [refreshTasks]);
const { data: searchData = [], isFetching } = useGetSearchQuery(
const { data: searchData = [], isFetching, error, isError } = useGetSearchQuery(
queryOverride,
parsedFilterData,
);
// Show toast notification for search errors
useEffect(() => {
if (isError && error) {
const errorMessage = error instanceof Error ? error.message : "Search failed";
// Avoid showing duplicate toasts for the same error
if (lastErrorRef.current !== errorMessage) {
lastErrorRef.current = errorMessage;
toast.error("Search error", {
description: errorMessage,
duration: 5000,
});
}
} else if (!isError) {
// Reset when query succeeds
lastErrorRef.current = null;
}
}, [isError, error]);
// Convert TaskFiles to File format and merge with backend results
const taskFilesAsFiles: File[] = taskFiles.map((taskFile) => {
return {