import { PaginatedDocs } from 'payload' import { Author, Book, HoldRequest, Repository, User } from '@/payload-types' import { Button } from '../ui/button' import Image from 'next/image' import ApproveHoldRequestModal from './ApproveHoldRequestModal' import { useCallback, useState } from 'react' import CheckoutFromHoldModal from './CheckoutFromHoldModal' import rejectHoldRequest from '@/serverActions/RejectHoldRequests' import { getUserRepos } from '@/serverActions/GetUserRepos' import { Loader2 } from 'lucide-react' import { toast } from 'sonner' type Props = { repos: PaginatedDocs | null user: User } const HoldRequestNotifications = (props: Props) => { const [repos, setRepos] = useState | null>(props.repos) const [openedModalId, setOpenedModalId] = useState(null) const totalHoldNotifications = repos?.docs .flatMap((r) => r.holdRequests?.docs) .filter((r) => { const request = r as HoldRequest return !request.isCheckedOut && !request.isRejected }).length || 0 const [isRejectingId, setIsRejectingId] = useState() const handleRejectHoldClick = useCallback( async (holdRequestId: number) => { if (isRejectingId) return setIsRejectingId(holdRequestId) const rejectRequest = await rejectHoldRequest({ holdRequestId }) if (rejectRequest?.isRejected) { const updatedRepos = await getUserRepos({ userId: props.user.id }) setRepos(updatedRepos) toast('Request was rejected') } else { toast('Error rejecting request') } setIsRejectingId(null) }, [isRejectingId, setIsRejectingId, props.user.id], ) const holdRequestsByRepoElements = repos?.docs.map((r) => { return (
    {r.holdRequests?.docs ?.map((h) => { const hold = h as HoldRequest const book = hold.book as Book const authors = book.authors as Author[] const dateRequested = hold.dateRequested ? new Date(hold.dateRequested) : new Date() const holdingUntilDate = hold.holdingUntilDate ? new Date(hold.holdingUntilDate) : new Date() const userRequested = hold.userRequested as User const userName = `${userRequested.firstName} ${userRequested.lastName}` if (hold.isRejected) return null return (
  • {book.title}

    {authors.map((a) => a.lf).join(' | ')}

    {hold.isHolding ? ( {userName} Until ) : ( {userName} )}
    {hold.isHolding ? ( setOpenedModalId(null)} holdRequest={hold} /> ) : ( setOpenedModalId(null)} holdRequest={hold} /> )}
  • ) }) .filter((element) => !!element)}
) }) return (

Incoming Hold Requests

{!!totalHoldNotifications && ( {totalHoldNotifications} Unaddressed )}
{holdRequestsByRepoElements}
) } export default HoldRequestNotifications