import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import { MdDelete, MdCloudDownload, MdCloudUpload } from 'react-icons/md'; 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 { formatAuthors, formatDate, formatFileSize, formatLanguage, formatPublisher, formatSubject, formatTitle, } from '@/utils/book'; import Alert from '@/components/Alert'; import Dialog from './Dialog'; import Spinner from './Spinner'; import BookCover from './BookCover'; interface BookDetailModalProps { book: Book; isOpen: boolean; onClose: () => void; handleBookDownload?: (book: Book) => void; handleBookUpload?: (book: Book) => void; handleBookDelete?: (book: Book) => void; } const BookDetailModal = ({ book, isOpen, onClose, handleBookDownload, handleBookUpload, handleBookDelete, }: BookDetailModalProps) => { const _ = useTranslation(); const [loading, setLoading] = useState(false); const [showDeleteAlert, setShowDeleteAlert] = useState(false); const [bookMeta, setBookMeta] = useState(null); const [fileSize, setFileSize] = useState(null); const { envConfig } = useEnv(); const { settings } = useSettingsStore(); useEffect(() => { const loadingTimeout = setTimeout(() => setLoading(true), 300); const fetchBookDetails = async () => { const appService = await envConfig.getAppService(); try { const details = await appService.fetchBookDetails(book, settings); const size = await appService.getBookFileSize(book); setBookMeta(details); setFileSize(size); } finally { if (loadingTimeout) clearTimeout(loadingTimeout); setLoading(false); } }; fetchBookDetails(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [book]); const handleClose = () => { setBookMeta(null); onClose(); }; const handleDelete = () => { setShowDeleteAlert(true); }; const confirmDelete = async () => { handleClose(); setShowDeleteAlert(false); if (handleBookDelete) { handleBookDelete(book); } }; const handleRedownload = async () => { handleClose(); if (handleBookDownload) { handleBookDownload(book); } }; const handleReupload = async () => { handleClose(); if (handleBookUpload) { handleBookUpload(book); } }; if (!bookMeta) return ( loading && (
) ); return (

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

{formatAuthors(book.author, book.primaryLanguage) || _('Unknown')}

{handleBookDelete && ( )} {book.uploadedAt && handleBookDownload && ( )} {book.downloadedAt && handleBookUpload && ( )}
{_('Publisher:')}

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

{_('Published:')}

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

{_('Updated:')}

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

{_('Added:')}

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

{_('Language:')}

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

{_('Subjects:')}

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

{_('Format:')}

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

{_('File Size:')}

{formatFileSize(fileSize) || _('Unknown')}

{_('Description:')}

{bookMeta.description || _('No description available')}

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