import { api, type RouterOutputs } from "~/utils/api"; import { Dialog, Menu, Transition } from "@headlessui/react"; import { Fragment, useState } from "react"; import { DotsHorizontalIcon, DownloadIcon, Pencil1Icon, TrashIcon, } from "@radix-ui/react-icons"; import { useRouter } from "next/router"; interface Props { video: RouterOutputs["video"]["get"]; } export default function VideoMoreMenu({ video }: Props) { const [title, setTitle] = useState(video.title); const [renameMenuOpen, setRenameMenuOpen] = useState(false); const utils = api.useContext(); const router = useRouter(); const items = [ { name: "Rename", icon: , props: { onClick: () => { setRenameMenuOpen(true); }, }, }, { name: "Download", icon: , props: { onClick: () => { void fetch(video.video_url).then((response) => { void response.blob().then((blob) => { const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = video.title; a.click(); }); //window.location.href = response.url; }); }, }, }, { name: "Delete", icon: , props: { onClick: () => { deleteVideoMutation.mutate({ videoId: video.id }); }, }, }, ]; const deleteVideoMutation = api.video.deleteVideo.useMutation({ onMutate: async ({ videoId }) => { await utils.video.get.cancel(); const previousValue = utils.video.get.getData({ videoId }); if (previousValue) { utils.video.get.setData({ videoId }, { ...previousValue, title }); } return { previousValue }; }, onError: (err, { videoId }, context) => { if (context?.previousValue) { utils.video.get.setData({ videoId }, context.previousValue); } console.error(err.message); }, onSettled: () => { void utils.video.getAll.invalidate(); void router.push("/videos"); }, }); const renameVideoMutation = api.video.renameVideo.useMutation({ onMutate: async ({ videoId, title }) => { await utils.video.get.cancel(); const previousValue = utils.video.get.getData({ videoId }); if (previousValue) { utils.video.get.setData({ videoId }, { ...previousValue, title }); } return { previousValue }; }, onError: (err, { videoId }, context) => { if (context?.previousValue) { utils.video.get.setData({ videoId }, context.previousValue); } console.error(err.message); }, }); return ( <> {/* More options menu */}
{items.map((item) => (
{({ active }) => (
{item.icon}

{item.name}

)}
))}
{/* Rename dialog */} setRenameMenuOpen(false)} >
{ e.preventDefault(); renameVideoMutation.mutate({ videoId: video.id, title, }); setRenameMenuOpen(false); }} >
setTitle(e.currentTarget.value)} id="title" name="title" type="title" autoComplete="title" className="block w-full rounded-md border-0 px-2 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" />
); }