mirror of
https://github.com/karakeep-app/karakeep.git
synced 2026-10-23 07:15:07 +02:00
179 lines
5.4 KiB
TypeScript
179 lines
5.4 KiB
TypeScript
import { getBookmarkRefreshInterval } from "@karakeep/shared/utils/bookmarkUtils";
|
|
|
|
import { api } from "../trpc";
|
|
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;
|
|
}
|
|
return getBookmarkRefreshInterval(data);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useCreateBookmark(
|
|
...opts: Parameters<typeof api.bookmarks.createBookmark.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
return api.bookmarks.createBookmark.useMutation({
|
|
...opts[0],
|
|
onSuccess: (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmarks.invalidate();
|
|
apiUtils.bookmarks.searchBookmarks.invalidate();
|
|
apiUtils.lists.stats.invalidate();
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useCreateBookmarkWithPostHook(
|
|
...opts: Parameters<typeof api.bookmarks.createBookmark.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
const postCreationCB = useBookmarkPostCreationHook();
|
|
return api.bookmarks.createBookmark.useMutation({
|
|
...opts[0],
|
|
onSuccess: async (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmarks.invalidate();
|
|
apiUtils.bookmarks.searchBookmarks.invalidate();
|
|
await postCreationCB(res.id);
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteBookmark(
|
|
...opts: Parameters<typeof api.bookmarks.deleteBookmark.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
return api.bookmarks.deleteBookmark.useMutation({
|
|
...opts[0],
|
|
onSuccess: (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmarks.invalidate();
|
|
apiUtils.bookmarks.searchBookmarks.invalidate();
|
|
apiUtils.bookmarks.getBookmark.invalidate({ bookmarkId: req.bookmarkId });
|
|
apiUtils.lists.stats.invalidate();
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateBookmark(
|
|
...opts: Parameters<typeof api.bookmarks.updateBookmark.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
return api.bookmarks.updateBookmark.useMutation({
|
|
...opts[0],
|
|
onSuccess: (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmarks.invalidate();
|
|
apiUtils.bookmarks.searchBookmarks.invalidate();
|
|
apiUtils.bookmarks.getBookmark.invalidate({ bookmarkId: req.bookmarkId });
|
|
apiUtils.lists.stats.invalidate();
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useSummarizeBookmark(
|
|
...opts: Parameters<typeof api.bookmarks.summarizeBookmark.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
return api.bookmarks.summarizeBookmark.useMutation({
|
|
...opts[0],
|
|
onSuccess: (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmarks.invalidate();
|
|
apiUtils.bookmarks.searchBookmarks.invalidate();
|
|
apiUtils.bookmarks.getBookmark.invalidate({ bookmarkId: req.bookmarkId });
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useRecrawlBookmark(
|
|
...opts: Parameters<typeof api.bookmarks.recrawlBookmark.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
return api.bookmarks.recrawlBookmark.useMutation({
|
|
...opts[0],
|
|
onSuccess: (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmark.invalidate({ bookmarkId: req.bookmarkId });
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateBookmarkTags(
|
|
...opts: Parameters<typeof api.bookmarks.updateTags.useMutation>
|
|
) {
|
|
const apiUtils = api.useUtils();
|
|
return api.bookmarks.updateTags.useMutation({
|
|
...opts[0],
|
|
onSuccess: (res, req, meta, context) => {
|
|
apiUtils.bookmarks.getBookmark.invalidate({ bookmarkId: req.bookmarkId });
|
|
|
|
[...res.attached, ...res.detached].forEach((id) => {
|
|
apiUtils.tags.get.invalidate({ tagId: id });
|
|
apiUtils.bookmarks.getBookmarks.invalidate({ tagId: id });
|
|
});
|
|
apiUtils.tags.list.invalidate();
|
|
apiUtils.lists.stats.invalidate();
|
|
return opts[0]?.onSuccess?.(res, req, meta, context);
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Checks the grid query context to know if we need to augment the bookmark post creation to fit the grid context
|
|
*/
|
|
export function useBookmarkPostCreationHook() {
|
|
const gridQueryCtx = useBookmarkGridContext();
|
|
const { mutateAsync: updateBookmark } = useUpdateBookmark();
|
|
const { mutateAsync: addToList } = useAddBookmarkToList();
|
|
const { mutateAsync: updateTags } = useUpdateBookmarkTags();
|
|
|
|
return async (bookmarkId: string) => {
|
|
if (!gridQueryCtx) {
|
|
return;
|
|
}
|
|
|
|
const promises = [];
|
|
if (gridQueryCtx.favourited ?? gridQueryCtx.archived) {
|
|
promises.push(
|
|
updateBookmark({
|
|
bookmarkId,
|
|
favourited: gridQueryCtx.favourited,
|
|
archived: gridQueryCtx.archived,
|
|
}),
|
|
);
|
|
}
|
|
|
|
if (gridQueryCtx.listId) {
|
|
promises.push(
|
|
addToList({
|
|
bookmarkId,
|
|
listId: gridQueryCtx.listId,
|
|
}),
|
|
);
|
|
}
|
|
|
|
if (gridQueryCtx.tagId) {
|
|
promises.push(
|
|
updateTags({
|
|
bookmarkId,
|
|
attach: [{ tagId: gridQueryCtx.tagId }],
|
|
detach: [],
|
|
}),
|
|
);
|
|
}
|
|
|
|
return Promise.all(promises);
|
|
};
|
|
}
|