diff --git a/app/routes/search-results.tsx b/app/routes/search-results.tsx index c94454ca..0b2162b4 100644 --- a/app/routes/search-results.tsx +++ b/app/routes/search-results.tsx @@ -2,7 +2,7 @@ // Licensed under the Apache 2.0 license found in the LICENSE file or at: // https://opensource.org/licenses/Apache-2.0 -import { Badge, Button, Loader, Pagination, Tooltip } from "@cloudflare/kumo"; +import { Badge, Button, Loader, Pagination, Tooltip, useKumoToastManager } from "@cloudflare/kumo"; import { ArrowLeftIcon, MagnifyingGlassIcon } from "@phosphor-icons/react"; import { useEffect, useMemo, useRef, useState } from "react"; import { useNavigate, useParams, useSearchParams } from "react-router"; @@ -35,6 +35,7 @@ export default function SearchResultsRoute() { const navigate = useNavigate(); const { selectedEmailId, isComposing, selectEmail, closePanel } = useUIStore(); const updateEmail = useUpdateEmail(); + const toastManager = useKumoToastManager(); const urlQuery = searchParams.get("q") || ""; const [page, setPage] = useState(1); const searchKey = useMemo( @@ -55,7 +56,7 @@ export default function SearchResultsRoute() { closePanel(); }, [closePanel, searchChanged, searchKey]); - const { data: searchData, isLoading } = useSearchEmails( + const { data: searchData, error, errorUpdatedAt, isError, isFetching, isLoading, refetch } = useSearchEmails( mailboxId, urlQuery, currentPage, @@ -63,6 +64,13 @@ export default function SearchResultsRoute() { const results = searchData?.results ?? []; const totalCount = searchData?.totalCount ?? 0; const isPanelOpen = selectedEmailId !== null || isComposing; + const errorMessage = error instanceof Error ? error.message : "Try again in a moment."; + + useEffect(() => { + if (isError) { + toastManager.add({ title: "Search failed", variant: "error" }); + } + }, [errorUpdatedAt, isError, toastManager]); const handleRowClick = (email: Email) => { selectEmail(email.id); if (!email.read && mailboxId) updateEmail.mutate({ mailboxId, id: email.id, data: { read: true } }); }; const folderDisplayName = (name: string | null | undefined): string => { if (!name) return ""; const map: Record = { inbox: "Inbox", sent: "Sent", draft: "Drafts", archive: "Archive", trash: "Trash" }; return map[name.toLowerCase()] || name; }; @@ -75,10 +83,17 @@ export default function SearchResultsRoute() { <>
- {isLoading ?
: results.length === 0 ? ( + {isLoading ?
: isError ? ( +
+
+

Search failed

+

{errorMessage}

+ +
+ ) : results.length === 0 ? (

No results found