From f99f4c0ff118547388a7e1ea332aa8755a8c9baf Mon Sep 17 00:00:00 2001
From: MohamedBassem <me@mbassem.com>
Date: Sun, 19 May 2024 17:56:57 +0000
Subject: feature(web): Add an archive button to list management dialog

---
 .../action-buttons/ArchiveBookmarkButton.tsx       | 64 ++++++++++++++++++++++
 1 file changed, 64 insertions(+)
 create mode 100644 apps/web/components/dashboard/bookmarks/action-buttons/ArchiveBookmarkButton.tsx

(limited to 'apps/web/components/dashboard/bookmarks/action-buttons/ArchiveBookmarkButton.tsx')

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;
-- 
cgit v1.2.3-70-g09d2

