'use client' import { Book, Genre, HoldRequest, Repository } from '@/payload-types' import { Combobox, ComboboxLabel, ComboboxOption, ComboboxDescription } from '@/components/combobox' import { Field, Label } from '@/components/fieldset' import type { PaginatedDocs } from 'payload' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Loader2 } from 'lucide-react' import { RichText } from '@/components/RichText' import { useMemo, useState } from 'react' import requestHold from '../../serverCalls/requestHold' import { useGlobal } from '@/providers/GlobalProvider' import Link from 'next/link' type DropDownProps = { currentRepository: Repository repositories: Repository[] isDisabled: boolean doesHoldExist: boolean isRequesting: boolean onClickRequest: () => void onChange: (repo: Repository | null) => void } function RepoDropdown({ currentRepository, repositories, isRequesting, doesHoldExist, isDisabled, onClickRequest, onChange, }: DropDownProps) { return ( {doesHoldExist ? ( You have requested a hold for this book ) : ( <> From Repository repo?.name} defaultValue={currentRepository} className="" onChange={(repo) => onChange(repo)} > {(repo) => ( {repo.abbreviation} {repo.name} )} {isRequesting && } Request Hold > )} ) } type Props = { book: Book repositories: PaginatedDocs existingHolds: PaginatedDocs | null } export default function BookByIdPageClient(props: Props) { const { book, repositories, existingHolds } = props const repos = repositories.docs const { user } = useGlobal() console.log(user) const [isRequestingCopy, setIsRequestingCopy] = useState(false) const [selectedRepository, setSelectedRepository] = useState( repos.length ? repos[0] : null, ) const [doesHoldExist, setDoesHoldExist] = useState(!!existingHolds?.totalDocs) const isRequestDisabled = useMemo(() => { return isRequestingCopy }, [isRequestingCopy]) const onClickRequest = async () => { if (isRequestingCopy || !selectedRepository || !book || doesHoldExist) return setIsRequestingCopy(true) const newHoldResponse = await requestHold({ repositoryId: selectedRepository.id, bookId: book.id, }) if (newHoldResponse?.id) setDoesHoldExist(true) setIsRequestingCopy(false) } return ( {/* Book Cover */} {/* Book details */} {book.title} Book information {book.publication && ( Published: {book.publication} )} {book.summary} {!user ? ( Sign in to request a hold ) : ( setSelectedRepository(repo)} /> )} Genres {(book.genre as Genre[])?.map((g) => ( {g.name} ))} {book.description && ( Description )} ) }
{book.publication && ( Published: {book.publication} )}
{book.summary}