aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components/dashboard/bookmarks
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-01-12 23:47:25 +0000
committerMohamed Bassem <me@mbassem.com>2025-01-12 23:47:25 +0000
commit38d403bcc26244e778a6e7a2f75ee39a9ec7ed27 (patch)
tree192d990e67a0b95aece9381a149513d14f6b0464 /apps/web/components/dashboard/bookmarks
parent9fd26b472b18924ab11afcebace90329b0fe3abf (diff)
downloadkarakeep-38d403bcc26244e778a6e7a2f75ee39a9ec7ed27.tar.zst
fix: Limit concurrency of bulk actions. Fix #773
Diffstat (limited to 'apps/web/components/dashboard/bookmarks')
-rw-r--r--apps/web/components/dashboard/bookmarks/BulkManageListsModal.tsx15
-rw-r--r--apps/web/components/dashboard/bookmarks/BulkTagModal.tsx33
2 files changed, 31 insertions, 17 deletions
diff --git a/apps/web/components/dashboard/bookmarks/BulkManageListsModal.tsx b/apps/web/components/dashboard/bookmarks/BulkManageListsModal.tsx
index 9c1f05d2..27e5c5e2 100644
--- a/apps/web/components/dashboard/bookmarks/BulkManageListsModal.tsx
+++ b/apps/web/components/dashboard/bookmarks/BulkManageListsModal.tsx
@@ -21,6 +21,7 @@ import { useForm } from "react-hook-form";
import { z } from "zod";
import { useAddBookmarkToList } from "@hoarder/shared-react/hooks/lists";
+import { limitConcurrency } from "@hoarder/shared/concurrency";
import { BookmarkListSelector } from "../lists/BookmarkListSelector";
@@ -67,11 +68,15 @@ export default function BulkManageListsModal({
const onSubmit = async (value: z.infer<typeof formSchema>) => {
const results = await Promise.allSettled(
- bookmarkIds.map((bookmarkId) =>
- addToList({
- bookmarkId,
- listId: value.listId,
- }),
+ limitConcurrency(
+ bookmarkIds.map(
+ (bookmarkId) => () =>
+ addToList({
+ bookmarkId,
+ listId: value.listId,
+ }),
+ ),
+ 50,
),
);
diff --git a/apps/web/components/dashboard/bookmarks/BulkTagModal.tsx b/apps/web/components/dashboard/bookmarks/BulkTagModal.tsx
index 3c8e75e7..03af9e11 100644
--- a/apps/web/components/dashboard/bookmarks/BulkTagModal.tsx
+++ b/apps/web/components/dashboard/bookmarks/BulkTagModal.tsx
@@ -11,6 +11,7 @@ import { toast } from "@/components/ui/use-toast";
import { useUpdateBookmarkTags } from "@hoarder/shared-react/hooks/bookmarks";
import { api } from "@hoarder/shared-react/trpc";
+import { limitConcurrency } from "@hoarder/shared/concurrency";
import { ZBookmark } from "@hoarder/shared/types/bookmarks";
import { TagsEditor } from "./TagsEditor";
@@ -59,12 +60,16 @@ export default function BulkTagModal({
const onAttach = async (tag: { tagName: string; tagId?: string }) => {
const results = await Promise.allSettled(
- bookmarkIds.map((id) =>
- mutateAsync({
- bookmarkId: id,
- attach: [tag],
- detach: [],
- }),
+ limitConcurrency(
+ bookmarkIds.map(
+ (id) => () =>
+ mutateAsync({
+ bookmarkId: id,
+ attach: [tag],
+ detach: [],
+ }),
+ ),
+ 50,
),
);
const successes = results.filter((r) => r.status == "fulfilled").length;
@@ -81,12 +86,16 @@ export default function BulkTagModal({
tagName: string;
}) => {
const results = await Promise.allSettled(
- bookmarkIds.map((id) =>
- mutateAsync({
- bookmarkId: id,
- attach: [],
- detach: [{ tagId }],
- }),
+ limitConcurrency(
+ bookmarkIds.map(
+ (id) => () =>
+ mutateAsync({
+ bookmarkId: id,
+ attach: [],
+ detach: [{ tagId }],
+ }),
+ ),
+ 50,
),
);
const successes = results.filter((r) => r.status == "fulfilled").length;