aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/lib/hooks/bookmark-search.ts
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-03-13 21:43:44 +0000
committerMohamed Bassem <me@mbassem.com>2024-03-14 16:40:45 +0000
commit04572a8e5081b1e4871e273cde9dbaaa44c52fe0 (patch)
tree8e993acb732a50d1306d4d6953df96c165c57f57 /apps/web/lib/hooks/bookmark-search.ts
parent2df08ed08c065e8b91bc8df0266bd4bcbb062be4 (diff)
downloadkarakeep-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.ts73
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,
+ };
+}