import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import Image from 'next/image'; import { Book } from '@/types/book'; import { BookDoc } from '@/libs/document'; import { useEnv } from '@/context/EnvContext'; import { useSettingsStore } from '@/store/settingsStore'; import { useTranslation } from '@/hooks/useTranslation'; import { useLibraryStore } from '@/store/libraryStore'; import { formatDate, formatLanguage, formatPublisher, formatSubject } from '@/utils/book'; import Alert from '@/components/Alert'; import Spinner from './Spinner'; import Dialog from './Dialog'; interface BookDetailModalProps { book: Book; isOpen: boolean; onClose: () => void; } const BookDetailModal = ({ book, isOpen, onClose }: BookDetailModalProps) => { const _ = useTranslation(); const [loading, setLoading] = useState(false); const [showDeleteAlert, setShowDeleteAlert] = useState(false); const [bookMeta, setBookMeta] = useState(null); const { envConfig } = useEnv(); const { settings } = useSettingsStore(); const { deleteBook } = useLibraryStore(); useEffect(() => { const loadingTimeout = setTimeout(() => setLoading(true), 300); const fetchBookDetails = async () => { const appService = await envConfig.getAppService(); const details = await appService.fetchBookDetails(book, settings); setBookMeta(details); setLoading(false); if (loadingTimeout) clearTimeout(loadingTimeout); }; fetchBookDetails(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [book]); const handleClose = () => { setBookMeta(null); onClose(); }; const handleDelete = () => { setShowDeleteAlert(true); }; const confirmDelete = () => { deleteBook(envConfig, book); handleClose(); setShowDeleteAlert(false); }; if (!bookMeta) return ( loading && (
) ); return ( <>
{book.title} { (e.target as HTMLImageElement).style.display = 'none'; (e.target as HTMLImageElement).nextElementSibling?.classList.remove( 'invisible', ); }} />
{book.title}

{book.title || _('Untitled')}

{book.author || _('Unknown')}

{window.innerWidth >= 400 && (
)}
{window.innerWidth < 400 && (
)}
{_('Publisher:')}

{formatPublisher(bookMeta.publisher || '') || _('Unknown')}

{_('Published:')}

{formatDate(bookMeta.published) || _('Unknown')}

{_('Updated:')}

{formatDate(book.lastUpdated) || ''}

{_('Language:')}

{formatLanguage(bookMeta.language) || _('Unknown')}

{_('Identifier:')}

{bookMeta.identifier || 'N/A'}

{_('Subjects:')}

{formatSubject(bookMeta.subject) || _('Unknown')}

{showDeleteAlert && ( { setShowDeleteAlert(false); }} onClickConfirm={confirmDelete} /> )} ); }; export default BookDetailModal;