import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import Image from 'next/image'; import { Book } from '@/types/book'; import { useEnv } from '@/context/EnvContext'; import { useSettingsStore } from '@/store/settingsStore'; import { useTranslation } from '@/hooks/useTranslation'; import { formatDate, formatSubject } from '@/utils/book'; import WindowButtons from '@/components/WindowButtons'; import Spinner from './Spinner'; interface BookDetailModalProps { book: Book; isOpen: boolean; onClose: () => void; } const BookDetailModal = ({ book, isOpen, onClose }: BookDetailModalProps) => { const _ = useTranslation(); const [loading, setLoading] = useState(false); const [bookMeta, setBookMeta] = useState(null); const { envConfig } = useEnv(); const { settings } = useSettingsStore(); 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(); }; if (!isOpen) return null; if (!bookMeta) return ( loading && (
) ); return (
{book.title} { (e.target as HTMLImageElement).style.display = 'none'; (e.target as HTMLImageElement).nextElementSibling?.classList.remove('invisible'); }} />
{book.title}

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

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

{_('Publisher:')}

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

{_('Published:')}

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

{_('Updated:')}

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

{_('Language:')}

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

{_('Identifier:')}

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

{_('Subjects:')}

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

); }; export default BookDetailModal;