"use client"; import React, { useEffect, useState } from "react"; import { ActionButton, ActionButtonWithTooltip, } from "@/components/ui/action-button"; import ActionConfirmingDialog from "@/components/ui/action-confirming-dialog"; import { useToast } from "@/components/ui/use-toast"; import useBulkActionsStore from "@/lib/bulkActions"; import { CheckCheck, Hash, List, Pencil, Trash2, X } from "lucide-react"; import { useDeleteBookmark, useUpdateBookmark, } from "@hoarder/shared-react/hooks/bookmarks"; import BulkManageListsModal from "./bookmarks/BulkManageListsModal"; import BulkTagModal from "./bookmarks/BulkTagModal"; import { ArchivedActionIcon, FavouritedActionIcon } from "./bookmarks/icons"; export default function BulkBookmarksAction() { const { selectedBookmarks, isBulkEditEnabled } = useBulkActionsStore(); const setIsBulkEditEnabled = useBulkActionsStore( (state) => state.setIsBulkEditEnabled, ); const { toast } = useToast(); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [manageListsModal, setManageListsModalOpen] = useState(false); const [bulkTagModal, setBulkTagModalOpen] = useState(false); useEffect(() => { setIsBulkEditEnabled(false); // turn off toggle + clear selected bookmarks on mount }, []); const onError = () => { toast({ variant: "destructive", title: "Something went wrong", description: "There was a problem with your request.", }); }; const deleteBookmarkMutator = useDeleteBookmark({ onSuccess: () => { setIsBulkEditEnabled(false); }, onError, }); const updateBookmarkMutator = useUpdateBookmark({ onSuccess: () => { setIsBulkEditEnabled(false); }, onError, }); interface UpdateBookmarkProps { favourited?: boolean; archived?: boolean; } const updateBookmarks = async ({ favourited, archived, }: UpdateBookmarkProps) => { await Promise.all( selectedBookmarks.map((item) => updateBookmarkMutator.mutateAsync({ bookmarkId: item.id, favourited, archived, }), ), ); toast({ description: `${selectedBookmarks.length} bookmarks have been updated!`, }); }; const deleteBookmarks = async () => { await Promise.all( selectedBookmarks.map((item) => deleteBookmarkMutator.mutateAsync({ bookmarkId: item.id }), ), ); toast({ description: `${selectedBookmarks.length} bookmarks have been deleted!`, }); setIsDeleteDialogOpen(false); }; const alreadyFavourited = selectedBookmarks.length && selectedBookmarks.every((item) => item.favourited === true); const alreadyArchived = selectedBookmarks.length && selectedBookmarks.every((item) => item.archived === true); const actionList = [ { name: "Add to List", icon: , action: () => setManageListsModalOpen(true), isPending: false, hidden: !isBulkEditEnabled, }, { name: "Edit Tags", icon: , action: () => setBulkTagModalOpen(true), isPending: false, hidden: !isBulkEditEnabled, }, { name: alreadyFavourited ? "Unfavourite" : "Favourite", icon: , action: () => updateBookmarks({ favourited: !alreadyFavourited }), isPending: updateBookmarkMutator.isPending, hidden: !isBulkEditEnabled, }, { name: alreadyArchived ? "Un-archive" : "Archive", icon: , action: () => updateBookmarks({ archived: !alreadyArchived }), isPending: updateBookmarkMutator.isPending, hidden: !isBulkEditEnabled, }, { name: "Delete", icon: , action: () => setIsDeleteDialogOpen(true), hidden: !isBulkEditEnabled, }, { name: "Close bulk edit", icon: , action: () => setIsBulkEditEnabled(false), alwaysEnable: true, hidden: !isBulkEditEnabled, }, { name: "Bulk Edit", icon: , action: () => setIsBulkEditEnabled(true), alwaysEnable: true, hidden: isBulkEditEnabled, }, ]; return (
Are you sure you want to delete these bookmarks?

} actionButton={() => ( deleteBookmarks()} > Delete )} /> b.id)} open={manageListsModal} setOpen={setManageListsModalOpen} /> b.id)} open={bulkTagModal} setOpen={setBulkTagModalOpen} />
{isBulkEditEnabled && (

( {selectedBookmarks.length} )

)} {actionList.map( ({ name, icon: Icon, action, isPending, hidden, alwaysEnable }) => ( {Icon} ), )}
); }