diff options
| author | MohamedBassem <me@mbassem.com> | 2024-05-19 17:56:57 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-05-19 17:56:57 +0000 |
| commit | f99f4c0ff118547388a7e1ea332aa8755a8c9baf (patch) | |
| tree | 21c077840912cee39e481bfdb71573e9b7d201a2 | |
| parent | bfcf0a4429e4d182307eb4c8599d4d11e9cc5bed (diff) | |
| download | karakeep-f99f4c0ff118547388a7e1ea332aa8755a8c9baf.tar.zst | |
feature(web): Add an archive button to list management dialog
3 files changed, 74 insertions, 1 deletions
diff --git a/apps/web/components/dashboard/bookmarks/ManageListsModal.tsx b/apps/web/components/dashboard/bookmarks/ManageListsModal.tsx index a906aee8..9451e736 100644 --- a/apps/web/components/dashboard/bookmarks/ManageListsModal.tsx +++ b/apps/web/components/dashboard/bookmarks/ManageListsModal.tsx @@ -19,7 +19,7 @@ import { import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; -import { X } from "lucide-react"; +import { Archive, X } from "lucide-react"; import { useForm } from "react-hook-form"; import { z } from "zod"; @@ -30,6 +30,7 @@ import { } from "@hoarder/shared-react/hooks/lists"; import { BookmarkListSelector } from "../lists/BookmarkListSelector"; +import ArchiveBookmarkButton from "./action-buttons/ArchiveBookmarkButton"; export default function ManageListsModal({ bookmarkId, @@ -179,6 +180,13 @@ export default function ManageListsModal({ Close </Button> </DialogClose> + <ArchiveBookmarkButton + type="button" + bookmarkId={bookmarkId} + onDone={() => setOpen(false)} + > + <Archive className="mr-2 size-4" /> Archive + </ArchiveBookmarkButton> <ActionButton type="submit" loading={isAddingToListPending} diff --git a/apps/web/components/dashboard/bookmarks/action-buttons/ArchiveBookmarkButton.tsx b/apps/web/components/dashboard/bookmarks/action-buttons/ArchiveBookmarkButton.tsx new file mode 100644 index 00000000..671c9bb2 --- /dev/null +++ b/apps/web/components/dashboard/bookmarks/action-buttons/ArchiveBookmarkButton.tsx @@ -0,0 +1,64 @@ +import React from "react"; +import { ActionButton, ActionButtonProps } from "@/components/ui/action-button"; +import { toast } from "@/components/ui/use-toast"; +import { api } from "@/lib/trpc"; + +import { useUpdateBookmark } from "@hoarder/shared-react/hooks/bookmarks"; + +interface ArchiveBookmarkButtonProps + extends Omit<ActionButtonProps, "loading" | "disabled"> { + bookmarkId: string; + onDone?: () => void; +} + +const ArchiveBookmarkButton = React.forwardRef< + HTMLButtonElement, + ArchiveBookmarkButtonProps +>(({ bookmarkId, onDone, ...props }, ref) => { + const { data } = api.bookmarks.getBookmark.useQuery({ bookmarkId }); + + const { mutate: updateBookmark, isPending: isArchivingBookmark } = + useUpdateBookmark({ + onSuccess: () => { + toast({ + description: "Bookmark has been archived!", + }); + onDone?.(); + }, + onError: (e) => { + if (e.data?.code == "BAD_REQUEST") { + toast({ + variant: "destructive", + description: e.message, + }); + } else { + toast({ + variant: "destructive", + title: "Something went wrong", + }); + } + }, + }); + + if (!data) { + return <span />; + } + + return ( + <ActionButton + ref={ref} + loading={isArchivingBookmark} + disabled={data.archived} + onClick={() => + updateBookmark({ + bookmarkId, + archived: !data.archived, + }) + } + {...props} + /> + ); +}); + +ArchiveBookmarkButton.displayName = "ArchiveBookmarkButton"; +export default ArchiveBookmarkButton; diff --git a/apps/web/components/ui/action-button.tsx b/apps/web/components/ui/action-button.tsx index 2ac361f5..b3984d97 100644 --- a/apps/web/components/ui/action-button.tsx +++ b/apps/web/components/ui/action-button.tsx @@ -58,3 +58,4 @@ const ActionButtonWithTooltip = React.forwardRef< ActionButtonWithTooltip.displayName = "ActionButtonWithTooltip"; export { ActionButton, ActionButtonWithTooltip }; +export type { ActionButtonProps }; |
