"use client";
import { useToast } from "@/components/ui/use-toast";
import { api } from "@/lib/trpc";
import { ZBookmark, ZBookmarkedLink } from "@/lib/types/api/bookmarks";
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {
Archive,
Link,
MoreHorizontal,
Pencil,
RotateCw,
Star,
Tags,
Trash2,
} from "lucide-react";
import { useTagModel } from "./TagModal";
import { useState } from "react";
import { BookmarkedTextEditor } from "./BookmarkedTextEditor";
export default function BookmarkOptions({ bookmark }: { bookmark: ZBookmark }) {
const { toast } = useToast();
const linkId = bookmark.id;
const [_, setTagModalIsOpen, tagModal] = useTagModel(bookmark);
const [isTextEditorOpen, setTextEditorOpen] = useState(false);
const invalidateBookmarksCache = api.useUtils().bookmarks.invalidate;
const onError = () => {
toast({
variant: "destructive",
title: "Something went wrong",
description: "There was a problem with your request.",
});
};
const onSettled = () => {
invalidateBookmarksCache();
};
const deleteBookmarkMutator = api.bookmarks.deleteBookmark.useMutation({
onSuccess: () => {
toast({
description: "The bookmark has been deleted!",
});
},
onError,
onSettled,
});
const updateBookmarkMutator = api.bookmarks.updateBookmark.useMutation({
onSuccess: () => {
toast({
description: "The bookmark has been updated!",
});
},
onError,
onSettled,
});
const crawlBookmarkMutator = api.bookmarks.recrawlBookmark.useMutation({
onSuccess: () => {
toast({
description: "Re-fetch has been enqueued!",
});
},
onError,
onSettled,
});
return (
<>
{tagModal}
{bookmark.content.type === "text" && (
setTextEditorOpen(true)}>
Edit
)}
updateBookmarkMutator.mutate({
bookmarkId: linkId,
favourited: !bookmark.favourited,
})
}
>
{bookmark.favourited ? "Un-favourite" : "Favourite"}
updateBookmarkMutator.mutate({
bookmarkId: linkId,
archived: !bookmark.archived,
})
}
>
{bookmark.archived ? "Un-archive" : "Archive"}
{bookmark.content.type === "link" && (
{
navigator.clipboard.writeText(
(bookmark.content as ZBookmarkedLink).url,
);
toast({
description: "Link was added to your clipboard!",
});
}}
>
Copy Link
)}
setTagModalIsOpen(true)}>
Edit Tags
{bookmark.content.type === "link" && (
crawlBookmarkMutator.mutate({ bookmarkId: bookmark.id })
}
>
Refresh
)}
deleteBookmarkMutator.mutate({ bookmarkId: bookmark.id })
}
>
Delete
>
);
}