diff options
Diffstat (limited to 'packages/shared-react')
| -rw-r--r-- | packages/shared-react/hooks/tags.ts | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/packages/shared-react/hooks/tags.ts b/packages/shared-react/hooks/tags.ts new file mode 100644 index 00000000..d3129fed --- /dev/null +++ b/packages/shared-react/hooks/tags.ts @@ -0,0 +1,55 @@ +import { api } from "../trpc"; + +export function useUpdateTag( + ...opts: Parameters<typeof api.tags.update.useMutation> +) { + const apiUtils = api.useUtils(); + + return api.tags.update.useMutation({ + ...opts[0], + onSuccess: (res, req, meta) => { + apiUtils.tags.list.invalidate(); + apiUtils.tags.get.invalidate({ tagId: res.id }); + apiUtils.bookmarks.getBookmarks.invalidate({ tagId: res.id }); + + // TODO: Maybe we can only look at the cache and invalidate only affected bookmarks + apiUtils.bookmarks.getBookmark.invalidate(); + return opts[0]?.onSuccess?.(res, req, meta); + }, + }); +} + +export function useMergeTag( + ...opts: Parameters<typeof api.tags.merge.useMutation> +) { + const apiUtils = api.useUtils(); + + return api.tags.merge.useMutation({ + ...opts[0], + onSuccess: (res, req, meta) => { + apiUtils.tags.list.invalidate(); + [res.mergedIntoTagId, ...res.deletedTags].forEach((tagId) => { + apiUtils.tags.get.invalidate({ tagId }); + apiUtils.bookmarks.getBookmarks.invalidate({ tagId }); + }); + // TODO: Maybe we can only look at the cache and invalidate only affected bookmarks + apiUtils.bookmarks.getBookmark.invalidate(); + return opts[0]?.onSuccess?.(res, req, meta); + }, + }); +} + +export function useDeleteTag( + ...opts: Parameters<typeof api.tags.delete.useMutation> +) { + const apiUtils = api.useUtils(); + + return api.tags.delete.useMutation({ + ...opts[0], + onSuccess: (res, req, meta) => { + apiUtils.tags.list.invalidate(); + apiUtils.bookmarks.getBookmark.invalidate(); + return opts[0]?.onSuccess?.(res, req, meta); + }, + }); +} |
