diff options
| author | MohamedBassem <me@mbassem.com> | 2024-03-13 21:43:44 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2024-03-14 16:40:45 +0000 |
| commit | 04572a8e5081b1e4871e273cde9dbaaa44c52fe0 (patch) | |
| tree | 8e993acb732a50d1306d4d6953df96c165c57f57 /apps/web/lib/hooks/bookmark-search.ts | |
| parent | 2df08ed08c065e8b91bc8df0266bd4bcbb062be4 (diff) | |
| download | karakeep-04572a8e5081b1e4871e273cde9dbaaa44c52fe0.tar.zst | |
structure: Create apps dir and copy tooling dir from t3-turbo repo
Diffstat (limited to 'apps/web/lib/hooks/bookmark-search.ts')
| -rw-r--r-- | apps/web/lib/hooks/bookmark-search.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/apps/web/lib/hooks/bookmark-search.ts b/apps/web/lib/hooks/bookmark-search.ts new file mode 100644 index 00000000..738e1bd8 --- /dev/null +++ b/apps/web/lib/hooks/bookmark-search.ts @@ -0,0 +1,73 @@ +import { useEffect, useState } from "react"; +import { api } from "@/lib/trpc"; +import { useRouter, useSearchParams } from "next/navigation"; +import { keepPreviousData } from "@tanstack/react-query"; + +function useSearchQuery() { + const searchParams = useSearchParams(); + const searchQuery = searchParams.get("q") || ""; + return { searchQuery }; +} + +export function useDoBookmarkSearch() { + const router = useRouter(); + const { searchQuery } = useSearchQuery(); + const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | undefined>(); + + useEffect(() => { + return () => { + if (!timeoutId) { + return; + } + clearTimeout(timeoutId); + }; + }, [timeoutId]); + + const doSearch = (val: string) => { + setTimeoutId(undefined); + router.replace(`/dashboard/search?q=${val}`); + }; + + const debounceSearch = (val: string) => { + if (timeoutId) { + clearTimeout(timeoutId); + } + const id = setTimeout(() => { + doSearch(val); + }, 200); + setTimeoutId(id); + }; + + return { + doSearch, + debounceSearch, + searchQuery, + }; +} + +export function useBookmarkSearch() { + const { searchQuery } = useSearchQuery(); + + const { data, isPending, isPlaceholderData, error } = + api.bookmarks.searchBookmarks.useQuery( + { + text: searchQuery, + }, + { + placeholderData: keepPreviousData, + gcTime: 0, + }, + ); + + if (error) { + throw error; + } + + return { + searchQuery, + error, + data, + isPending, + isPlaceholderData, + }; +} |
