Skip to content

Commit

Permalink
feat: Add NotFound component to display when no search results are fo…
Browse files Browse the repository at this point in the history
…und. Also now we show the loading spinner while debouncing
  • Loading branch information
luis-herasme committed Aug 1, 2024
1 parent fe5171c commit 5dabf22
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
29 changes: 27 additions & 2 deletions apps/web/src/components/SearchInput/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ import { api } from "~/api-client";
import type { RouterOutputs } from "~/api-client";
import { useClickOutside } from "~/hooks/useClickOutside";
import { useDebounce } from "~/hooks/useDebounce";
import EmptyBox from "~/icons/empty-box.svg";
import Loading from "~/icons/loading.svg";
import NextError from "~/pages/_error";
import { getRouteBySearchCategory } from "~/utils";
import { Button } from "../Button";
import { Input } from "../Input";
import { Loading } from "../Loading";
import { SearchResults } from "./SearchResults";
import type { SearchResultsProps } from "./SearchResults";

Expand Down Expand Up @@ -91,13 +92,23 @@ export const SearchInput: React.FC<SearchInputProps> = function ({
);
}

const debouncing = term !== debouncedTerm;

const searchResults = searchQuery.data;
const displayResults =
!!searchResults &&
!!Object.keys(searchResults).length &&
!clickOutside &&
term;

const displayNotFound =
!debouncing &&
!searchQuery.isFetching &&
searchResults &&
!Object.keys(searchResults).length &&
!clickOutside &&
term;

return (
<form ref={searchRef} onSubmit={handleSubmit}>
<div
Expand All @@ -114,6 +125,9 @@ export const SearchInput: React.FC<SearchInputProps> = function ({
placeholder={`Search by Blob / KZG / Txn / Block / Slot / Address`}
/>
</div>

{displayNotFound && <NotFound />}

{displayResults && searchResults && (
<div className="absolute inset-x-0 top-11 z-10 rounded-md border border-border-light dark:border-border-dark">
<SearchResults
Expand All @@ -139,7 +153,7 @@ export const SearchInput: React.FC<SearchInputProps> = function ({
ring-inset
`}
icon={
searchQuery.isFetching ? (
searchQuery.isFetching || debouncing ? (
<Loading className="-ml-0.5 h-5 w-5 animate-spin" />
) : (
<MagnifyingGlassIcon
Expand All @@ -154,3 +168,14 @@ export const SearchInput: React.FC<SearchInputProps> = function ({
</form>
);
};

function NotFound() {
return (
<div className="absolute top-11 z-10 w-full rounded-md border border-border-light bg-surface-light p-8 dark:border-border-dark dark:bg-surface-dark">
<div className="flex flex-col items-center justify-center gap-2">
<EmptyBox className="h-8 w-8" strokeWidth={1} />
<div className="text-sm font-medium">No results found</div>
</div>
</div>
);
}
5 changes: 5 additions & 0 deletions apps/web/src/icons/empty-box.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 5dabf22

Please sign in to comment.