aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components/dashboard/BulkBookmarksAction.tsx
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/BulkBookmarksAction.tsx
parent9fd26b472b18924ab11afcebace90329b0fe3abf (diff)
downloadkarakeep-38d403bcc26244e778a6e7a2f75ee39a9ec7ed27.tar.zst
fix: Limit concurrency of bulk actions. Fix #773
Diffstat (limited to 'apps/web/components/dashboard/BulkBookmarksAction.tsx')
-rw-r--r--apps/web/components/dashboard/BulkBookmarksAction.tsx41
1 files changed, 28 insertions, 13 deletions
diff --git a/apps/web/components/dashboard/BulkBookmarksAction.tsx b/apps/web/components/dashboard/BulkBookmarksAction.tsx
index eb0e0cec..9d5ecdbe 100644
--- a/apps/web/components/dashboard/BulkBookmarksAction.tsx
+++ b/apps/web/components/dashboard/BulkBookmarksAction.tsx
@@ -27,12 +27,15 @@ import {
useRecrawlBookmark,
useUpdateBookmark,
} from "@hoarder/shared-react/hooks/bookmarks";
+import { limitConcurrency } from "@hoarder/shared/concurrency";
import { BookmarkTypes } from "@hoarder/shared/types/bookmarks";
import BulkManageListsModal from "./bookmarks/BulkManageListsModal";
import BulkTagModal from "./bookmarks/BulkTagModal";
import { ArchivedActionIcon, FavouritedActionIcon } from "./bookmarks/icons";
+const MAX_CONCURRENT_BULK_ACTIONS = 50;
+
export default function BulkBookmarksAction() {
const { t } = useTranslation();
const { selectedBookmarks, isBulkEditEnabled } = useBulkActionsStore();
@@ -100,11 +103,15 @@ export default function BulkBookmarksAction() {
(item) => item.content.type === BookmarkTypes.LINK,
);
await Promise.all(
- links.map((item) =>
- recrawlBookmarkMutator.mutateAsync({
- bookmarkId: item.id,
- archiveFullPage,
- }),
+ limitConcurrency(
+ links.map(
+ (item) => () =>
+ recrawlBookmarkMutator.mutateAsync({
+ bookmarkId: item.id,
+ archiveFullPage,
+ }),
+ ),
+ MAX_CONCURRENT_BULK_ACTIONS,
),
);
toast({
@@ -145,12 +152,16 @@ export default function BulkBookmarksAction() {
archived,
}: UpdateBookmarkProps) => {
await Promise.all(
- selectedBookmarks.map((item) =>
- updateBookmarkMutator.mutateAsync({
- bookmarkId: item.id,
- favourited,
- archived,
- }),
+ limitConcurrency(
+ selectedBookmarks.map(
+ (item) => () =>
+ updateBookmarkMutator.mutateAsync({
+ bookmarkId: item.id,
+ favourited,
+ archived,
+ }),
+ ),
+ MAX_CONCURRENT_BULK_ACTIONS,
),
);
toast({
@@ -160,8 +171,12 @@ export default function BulkBookmarksAction() {
const deleteBookmarks = async () => {
await Promise.all(
- selectedBookmarks.map((item) =>
- deleteBookmarkMutator.mutateAsync({ bookmarkId: item.id }),
+ limitConcurrency(
+ selectedBookmarks.map(
+ (item) => () =>
+ deleteBookmarkMutator.mutateAsync({ bookmarkId: item.id }),
+ ),
+ MAX_CONCURRENT_BULK_ACTIONS,
),
);
toast({