'use client'; import { ExtendedUserEntry } from '@/app/(app)/dashboard/state'; import SubmitButton from '@/components/submitButton'; import { Button } from '@/components/ui/button'; import { Slider } from '@/components/ui/slider'; import { Textarea } from '@/components/ui/textarea'; import { UserEntryStatus, UserEntryVisibility, UserList } from '@prisma/client'; import { Bookmark, Check, ChevronDown, Eye, ListPlus, Pause, Save, Trash2, UsersRound, X, } from 'lucide-react'; import { ReactNode, useEffect, useState } from 'react'; import { toast } from 'sonner'; import { Input } from './ui/input'; import { cn } from '@/lib/utils'; import { useMediaQuery } from 'usehooks-ts'; import { Badge } from './ui/badge'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from './ui/dialog'; import { Label } from './ui/label'; import { DateTimePicker } from './ui/date-time-picker'; import { api } from '@/trpc/react'; import { getUserTitleFromEntry } from '@/server/api/routers/dashboard_'; import { EntryRedirect } from '@/app/(app)/_components/EntryIslandContext'; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger, } from './ui/dropdown-menu'; import { capitalizeFirst } from '@/lib/capitalizeFirst'; import AddToList from './addToList'; const ModifyUserEntry = ({ userEntry, userLists, userListsWithEntry, refetchUserLists, setOpen, setUserEntry, removeUserEntry: removeUserEntryClient, }: { userEntry: ExtendedUserEntry; userLists: UserList[]; userListsWithEntry: UserList[]; refetchUserLists: () => Promise; setOpen: (value: boolean) => void; setUserEntry: (userEntry: ExtendedUserEntry) => void; removeUserEntry: (userEntry: ExtendedUserEntry) => void; }) => { const [rating, setRating] = useState(userEntry.rating); const [notes, setNotes] = useState(userEntry.notes); const [watchedAt, setWatchedAt] = useState( userEntry.watchedAt ? userEntry.watchedAt : new Date() ); const utils = api.useUtils(); const isDesktop = useMediaQuery('(min-width: 1024px)'); const [addListsOpen, setAddListsOpen] = useState(false); const [removeUserEntryOpen, setRemoveUserEntryOpen] = useState(false); useEffect(() => { setNotes(userEntry.notes); setRating(userEntry.rating); }, [userEntry]); const updateUserEntry = api.userEntry.update.useMutation({ onSuccess(data) { toast.success(data.message); setUserEntry({ ...data.userEntry, entry: { ...data.userEntry.entry, releaseDate: new Date(data.userEntry.entry.releaseDate), }, }); utils.entries.getEntryPage.invalidate(); }, onError(error) { toast.error(error.message); }, }); const removeUserEntry = api.userEntry.remove.useMutation({ onSuccess(data) { toast.success(data.message); utils.dashboard.invalidate(); utils.entries.getEntryPage.invalidate(); removeUserEntryClient(userEntry); setOpen(false); }, onError(error) { toast.error(error.message); }, }); const updateStatus = async (status: UserEntryStatus) => { setUserEntry({ ...userEntry, watchedAt: status === 'completed' ? new Date() : null, status, }); updateUserEntry.mutate({ userEntryId: userEntry.id, status, }); }; const updateProgress = async (progress: number) => { if (progress === userEntry.progress) return; setUserEntry({ ...userEntry, watchedAt: progress >= userEntry.entry.length ? new Date() : null, status: progress >= userEntry.entry.length ? 'completed' : userEntry.status, progress, }); updateUserEntry.mutate({ userEntryId: userEntry.id, progress, }); }; const updateVisibility = async (visibility: UserEntryVisibility) => { setUserEntry({ ...userEntry, visibility, }); updateUserEntry.mutate({ userEntryId: userEntry.id, visibility, }); }; const Header = () => (
{getUserTitleFromEntry(userEntry.entry)}
{userEntry.entry.releaseDate.getFullYear()}
{userEntry.entry.tagline && (
"{userEntry.entry.tagline}"
)}
{userEntry.entry.overview.slice(0, isDesktop ? 190 : 150) + (userEntry.entry.overview.length > (isDesktop ? 190 : 150) ? '...' : '')}
); const Footer = ({ children }: { children?: ReactNode }) => (
Are you sure you want to remove this review? removeUserEntry.mutate({ userEntryId: userEntry.id, }) } > Yes
{Object.values(UserEntryVisibility).map(visiblity => ( updateVisibility(visiblity)}> {(() => { switch (visiblity) { case 'public': return ; case 'friends': return ; case 'private': return ; } })()} {capitalizeFirst(visiblity)} ))} refetchUserLists()} entryId={userEntry.entryId} userLists={userLists} userListsWithEntry={userListsWithEntry} > {children}
); if (userEntry.watchedAt !== null) { return (
Rating
{rating / 20}
setRating(Number(e[0]))} className="w-full" name="rating" step={1} min={0} max={100} />