aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-05-19 17:56:57 +0000
committerMohamedBassem <me@mbassem.com>2024-05-19 17:56:57 +0000
commitf99f4c0ff118547388a7e1ea332aa8755a8c9baf (patch)
tree21c077840912cee39e481bfdb71573e9b7d201a2
parentbfcf0a4429e4d182307eb4c8599d4d11e9cc5bed (diff)
downloadkarakeep-f99f4c0ff118547388a7e1ea332aa8755a8c9baf.tar.zst
feature(web): Add an archive button to list management dialog
-rw-r--r--apps/web/components/dashboard/bookmarks/ManageListsModal.tsx10
-rw-r--r--apps/web/components/dashboard/bookmarks/action-buttons/ArchiveBookmarkButton.tsx64
-rw-r--r--apps/web/components/ui/action-button.tsx1
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 };