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;