aboutsummaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/shared-react/hooks/bookmarks.ts19
-rw-r--r--packages/shared-react/hooks/lists.ts7
-rw-r--r--packages/shared/utils/listUtils.ts7
-rw-r--r--packages/trpc/routers/lists.ts20
4 files changed, 52 insertions, 1 deletions
diff --git a/packages/shared-react/hooks/bookmarks.ts b/packages/shared-react/hooks/bookmarks.ts
index 2a549d1f..ceaed3a9 100644
--- a/packages/shared-react/hooks/bookmarks.ts
+++ b/packages/shared-react/hooks/bookmarks.ts
@@ -1,7 +1,26 @@
import { api } from "../trpc";
+import { isBookmarkStillLoading } from "../utils/bookmarkUtils";
import { useBookmarkGridContext } from "./bookmark-grid-context";
import { useAddBookmarkToList } from "./lists";
+export function useAutoRefreshingBookmarkQuery(
+ input: Parameters<typeof api.bookmarks.getBookmark.useQuery>[0],
+) {
+ return api.bookmarks.getBookmark.useQuery(input, {
+ refetchInterval: (query) => {
+ const data = query.state.data;
+ if (!data) {
+ return false;
+ }
+ // If the link is not crawled or not tagged
+ if (isBookmarkStillLoading(data)) {
+ return 1000;
+ }
+ return false;
+ },
+ });
+}
+
export function useCreateBookmarkWithPostHook(
...opts: Parameters<typeof api.bookmarks.createBookmark.useMutation>
) {
diff --git a/packages/shared-react/hooks/lists.ts b/packages/shared-react/hooks/lists.ts
index 61e50689..10633a08 100644
--- a/packages/shared-react/hooks/lists.ts
+++ b/packages/shared-react/hooks/lists.ts
@@ -41,6 +41,9 @@ export function useAddBookmarkToList(
...opts[0],
onSuccess: (res, req, meta) => {
apiUtils.bookmarks.getBookmarks.invalidate({ listId: req.listId });
+ apiUtils.lists.getListsOfBookmark.invalidate({
+ bookmarkId: req.bookmarkId,
+ });
return opts[0]?.onSuccess?.(res, req, meta);
},
});
@@ -54,6 +57,9 @@ export function useRemoveBookmarkFromList(
...opts[0],
onSuccess: (res, req, meta) => {
apiUtils.bookmarks.getBookmarks.invalidate({ listId: req.listId });
+ apiUtils.lists.getListsOfBookmark.invalidate({
+ bookmarkId: req.bookmarkId,
+ });
return opts[0]?.onSuccess?.(res, req, meta);
},
});
@@ -90,6 +96,7 @@ export function augmentBookmarkListsWithInitialData(
data: ZBookmarkList[];
root: ZBookmarkListRoot;
allPaths: ZBookmarkList[][];
+ getPathById: (id: string) => ZBookmarkList[] | undefined;
}
| undefined,
initialData: ZBookmarkList[],
diff --git a/packages/shared/utils/listUtils.ts b/packages/shared/utils/listUtils.ts
index 1dd3d476..d6fe7688 100644
--- a/packages/shared/utils/listUtils.ts
+++ b/packages/shared/utils/listUtils.ts
@@ -51,5 +51,10 @@ export function listsToTree(lists: ZBookmarkList[]) {
dfs(node, []);
});
- return { allPaths, root };
+ return {
+ allPaths,
+ root,
+ getPathById: (id: string) =>
+ allPaths.find((path) => path[path.length - 1].id === id),
+ };
}
diff --git a/packages/trpc/routers/lists.ts b/packages/trpc/routers/lists.ts
index 5cab0ac3..d4b56ecf 100644
--- a/packages/trpc/routers/lists.ts
+++ b/packages/trpc/routers/lists.ts
@@ -1,3 +1,4 @@
+import assert from "node:assert";
import { experimental_trpcMiddleware, TRPCError } from "@trpc/server";
import { and, eq } from "drizzle-orm";
import { z } from "zod";
@@ -222,4 +223,23 @@ export const listsAppRouter = router({
return { lists };
}),
+ getListsOfBookmark: authedProcedure
+ .input(z.object({ bookmarkId: z.string() }))
+ .output(
+ z.object({
+ lists: z.array(zBookmarkListSchema),
+ }),
+ )
+ .use(ensureBookmarkOwnership)
+ .query(async ({ input, ctx }) => {
+ const lists = await ctx.db.query.bookmarksInLists.findMany({
+ where: and(eq(bookmarksInLists.bookmarkId, input.bookmarkId)),
+ with: {
+ list: true,
+ },
+ });
+ assert(lists.map((l) => l.list.userId).every((id) => id == ctx.user.id));
+
+ return { lists: lists.map((l) => l.list) };
+ }),
});