A self hosted solution for privately rating and reviewing different sorts of media
at master 2.8 kB view raw
1import React, { ReactNode, useEffect, useState } from 'react'; 2import { Dialog, DialogContent, DialogTrigger } from './ui/dialog'; 3import { Button } from './ui/button'; 4import ModifyUserEntry from './modifyUserEntry'; 5import { api, RouterOutputs } from '@/trpc/react'; 6import { Loader2 } from 'lucide-react'; 7import { useRouter } from 'next/navigation'; 8 9const ContainedModifyUserEntry = ({ 10 children, 11 id, 12 open: controlledOpen, 13 setOpen: controlledSetOpen, 14}: { 15 children?: ReactNode; 16 id: { userEntryId: number } | { entryId: number }; 17 open?: boolean; 18 setOpen?: (value: boolean) => void; 19}) => { 20 const [uncontrolledOpen, setUncontrolledOpen] = useState(false); 21 const router = useRouter(); 22 23 const isControlled = 24 controlledOpen !== undefined && controlledSetOpen !== undefined; 25 26 const open = isControlled ? controlledOpen : uncontrolledOpen; 27 const setOpen = isControlled ? controlledSetOpen : setUncontrolledOpen; 28 29 const utils = api.useUtils(); 30 const userEntryQuery = api.userEntry.get.useQuery( 31 { 32 id, 33 }, 34 { 35 enabled: open, 36 } 37 ); 38 const [userEntry, setUserEntry] = useState< 39 RouterOutputs['userEntry']['get'] | null 40 >(null); 41 useEffect(() => { 42 setUserEntry(userEntryQuery.data ? userEntryQuery.data : null); 43 }, [userEntryQuery.data]); 44 45 const entryId = 46 !!id && 'entryId' in id ? id.entryId : userEntryQuery.data?.entryId; 47 48 const userLists = api.userList.getListsByUser.useQuery(); 49 const userListsWithEntry = api.userList.getListsWithEntryByUser.useQuery( 50 { 51 entryId: entryId ?? 0, 52 }, 53 { 54 enabled: !!entryId && open, 55 } 56 ); 57 58 return ( 59 <Dialog open={open} onOpenChange={setOpen}> 60 {children && <DialogTrigger asChild>{children}</DialogTrigger>} 61 <DialogContent className="h-full w-full max-w-[800px] min-[600px]:h-[600px] min-[800px]:w-[800px]"> 62 {(userEntryQuery.isPending || 63 userLists.isPending || 64 userListsWithEntry.isPending) && <Loader2 className="animate-spin" />} 65 66 {userEntry && userLists.data && userListsWithEntry.data && ( 67 <ModifyUserEntry 68 userEntry={userEntry} 69 setOpen={setOpen} 70 setUserEntry={userEntry => setUserEntry(userEntry)} 71 removeUserEntry={async () => { 72 utils.entries.getEntryPage.invalidate(); 73 utils.entries.search.invalidate(); 74 utils.dashboard.invalidate(); 75 router.refresh(); 76 }} 77 userLists={userLists.data} 78 userListsWithEntry={userListsWithEntry.data} 79 refetchUserLists={async () => { 80 utils.userList.getListsByUser.invalidate(); 81 }} 82 /> 83 )} 84 </DialogContent> 85 </Dialog> 86 ); 87}; 88 89export default ContainedModifyUserEntry;