import { useState } from "react"; import { ActionButton } from "@/components/ui/action-button"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormMessage, } from "@/components/ui/form"; import LoadingSpinner from "@/components/ui/spinner"; import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; import { Archive, X } from "lucide-react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { useAddBookmarkToList, useBookmarkLists, useRemoveBookmarkFromList, } from "@hoarder/shared-react/hooks/lists"; import { BookmarkListSelector } from "../lists/BookmarkListSelector"; import ArchiveBookmarkButton from "./action-buttons/ArchiveBookmarkButton"; export default function ManageListsModal({ bookmarkId, open, setOpen, }: { bookmarkId: string; open: boolean; setOpen: (open: boolean) => void; }) { const formSchema = z.object({ listId: z.string({ required_error: "Please select a list", }), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { listId: undefined, }, }); const { data: allLists, isPending: isAllListsPending } = useBookmarkLists( undefined, { enabled: open }, ); const { data: alreadyInList, isPending: isAlreadyInListPending } = api.lists.getListsOfBookmark.useQuery( { bookmarkId, }, { enabled: open }, ); const isLoading = isAllListsPending || isAlreadyInListPending; const { mutate: addToList, isPending: isAddingToListPending } = useAddBookmarkToList({ onSuccess: () => { toast({ description: "List has been updated!", }); form.resetField("listId"); }, onError: (e) => { if (e.data?.code == "BAD_REQUEST") { toast({ variant: "destructive", description: e.message, }); } else { toast({ variant: "destructive", title: "Something went wrong", }); } }, }); const { mutate: deleteFromList, isPending: isDeleteFromListPending } = useRemoveBookmarkFromList({ onSuccess: () => { toast({ description: "List has been updated!", }); form.resetField("listId"); }, onError: (e) => { if (e.data?.code == "BAD_REQUEST") { toast({ variant: "destructive", description: e.message, }); } else { toast({ variant: "destructive", title: "Something went wrong", }); } }, }); return (
{ addToList({ bookmarkId: bookmarkId, listId: value.listId, }); })} > Manage Lists {isLoading ? ( ) : ( allLists && (
    {alreadyInList?.lists.map((list) => (
  • {allLists .getPathById(list.id)! .map((l) => `${l.icon} ${l.name}`) .join(" / ")}

    deleteFromList({ bookmarkId, listId: list.id }) } >
  • ))}
) )}
{ return ( l.id, )} onChange={field.onChange} /> ); }} />
setOpen(false)} > Archive Add
); } export function useManageListsModal(bookmarkId: string) { const [open, setOpen] = useState(false); return { open, setOpen, content: open && ( ), }; }