bubble up search errors to ui
This commit is contained in:
parent
8a14c69e54
commit
f3aff1f090
2 changed files with 29 additions and 2 deletions
|
|
@ -127,6 +127,12 @@ export const useGetSearchQuery = (
|
||||||
},
|
},
|
||||||
body: JSON.stringify(searchPayload),
|
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();
|
const data = await response.json();
|
||||||
// Group chunks by filename to create file results similar to page.tsx
|
// Group chunks by filename to create file results similar to page.tsx
|
||||||
const fileMap = new Map<
|
const fileMap = new Map<
|
||||||
|
|
@ -198,7 +204,8 @@ export const useGetSearchQuery = (
|
||||||
return files;
|
return files;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error getting files", 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],
|
queryKey: ["search", queryData, query],
|
||||||
placeholderData: (prev) => prev,
|
placeholderData: (prev) => prev,
|
||||||
queryFn: getFiles,
|
queryFn: getFiles,
|
||||||
|
retry: false, // Don't retry on errors - show them immediately
|
||||||
...options,
|
...options,
|
||||||
},
|
},
|
||||||
queryClient,
|
queryClient,
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,7 @@ function SearchPage() {
|
||||||
const { parsedFilterData, queryOverride } = useKnowledgeFilter();
|
const { parsedFilterData, queryOverride } = useKnowledgeFilter();
|
||||||
const [selectedRows, setSelectedRows] = useState<File[]>([]);
|
const [selectedRows, setSelectedRows] = useState<File[]>([]);
|
||||||
const [showBulkDeleteDialog, setShowBulkDeleteDialog] = useState(false);
|
const [showBulkDeleteDialog, setShowBulkDeleteDialog] = useState(false);
|
||||||
|
const lastErrorRef = useRef<string | null>(null);
|
||||||
|
|
||||||
const deleteDocumentMutation = useDeleteDocument();
|
const deleteDocumentMutation = useDeleteDocument();
|
||||||
|
|
||||||
|
|
@ -82,10 +83,28 @@ function SearchPage() {
|
||||||
refreshTasks();
|
refreshTasks();
|
||||||
}, [refreshTasks]);
|
}, [refreshTasks]);
|
||||||
|
|
||||||
const { data: searchData = [], isFetching } = useGetSearchQuery(
|
const { data: searchData = [], isFetching, error, isError } = useGetSearchQuery(
|
||||||
queryOverride,
|
queryOverride,
|
||||||
parsedFilterData,
|
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
|
// Convert TaskFiles to File format and merge with backend results
|
||||||
const taskFilesAsFiles: File[] = taskFiles.map((taskFile) => {
|
const taskFilesAsFiles: File[] = taskFiles.map((taskFile) => {
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue