import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import { Book } from '@/types/book'; import { BookMetadata } from '@/libs/document'; import { useEnv } from '@/context/EnvContext'; import { useSettingsStore } from '@/store/settingsStore'; import { useTranslation } from '@/hooks/useTranslation'; import { useMetadataEdit } from './useMetadataEdit'; import Alert from '@/components/Alert'; import Dialog from '@/components/Dialog'; import Spinner from '@/components/Spinner'; import BookDetailView from './BookDetailView'; import BookDetailEdit from './BookDetailEdit'; import SourceSelector from './SourceSelector'; interface BookDetailModalProps { book: Book; isOpen: boolean; onClose: () => void; handleBookDownload?: (book: Book, redownload?: boolean) => void; handleBookUpload?: (book: Book) => void; handleBookDelete?: (book: Book) => void; handleBookDeleteCloudBackup?: (book: Book) => void; handleBookMetadataUpdate?: (book: Book, updatedMetadata: BookMetadata) => void; } const BookDetailModal: React.FC = ({ book, isOpen, onClose, handleBookDownload, handleBookUpload, handleBookDelete, handleBookDeleteCloudBackup, handleBookMetadataUpdate, }) => { const _ = useTranslation(); const [loading, setLoading] = useState(false); const [showDeleteAlert, setShowDeleteAlert] = useState(false); const [showDeleteCloudBackupAlert, setShowDeleteCloudBackupAlert] = useState(false); const [editMode, setEditMode] = useState(false); const [bookMeta, setBookMeta] = useState(null); const [fileSize, setFileSize] = useState(null); const { envConfig } = useEnv(); const { settings } = useSettingsStore(); // Initialize metadata edit hook const { editedMeta, fieldSources, lockedFields, fieldErrors, searchLoading, showSourceSelection, availableSources, handleFieldChange, handleToggleFieldLock, handleLockAll, handleUnlockAll, handleAutoRetrieve, handleSourceSelection, handleCloseSourceSelection, resetToOriginal, } = useMetadataEdit(bookMeta); useEffect(() => { const loadingTimeout = setTimeout(() => setLoading(true), 300); const fetchBookDetails = async () => { const appService = await envConfig.getAppService(); try { const details = book.metadata || (await appService.fetchBookDetails(book, settings)); setBookMeta(details); const size = await appService.getBookFileSize(book); setFileSize(size); } finally { if (loadingTimeout) clearTimeout(loadingTimeout); setLoading(false); } }; fetchBookDetails(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [book]); const handleClose = () => { setBookMeta(null); setEditMode(false); onClose(); }; const handleEditMetadata = () => { setEditMode(true); }; const handleCancelEdit = () => { resetToOriginal(); setEditMode(false); }; const handleSaveMetadata = () => { if (editedMeta && handleBookMetadataUpdate) { setBookMeta({ ...editedMeta }); handleBookMetadataUpdate(book, editedMeta); setEditMode(false); } }; const handleDelete = () => { setShowDeleteAlert(true); }; const handleDeleteCloudBackup = () => { setShowDeleteCloudBackupAlert(true); }; const confirmDelete = async () => { handleClose(); setShowDeleteAlert(false); if (handleBookDelete) { handleBookDelete(book); } }; const confirmDeleteCloudBackup = async () => { handleClose(); setShowDeleteCloudBackupAlert(false); if (handleBookDeleteCloudBackup) { handleBookDeleteCloudBackup(book); } }; const handleRedownload = async () => { handleClose(); if (handleBookDownload) { handleBookDownload(book, true); } }; const handleReupload = async () => { handleClose(); if (handleBookUpload) { handleBookUpload(book); } }; if (!bookMeta) return ( loading && (
) ); return ( <>
{editMode ? ( ) : ( )}
{/* Source Selection Modal */} {/* Delete Alerts */} {showDeleteAlert && (
setShowDeleteAlert(false)} onConfirm={confirmDelete} />
)} {showDeleteCloudBackupAlert && (
setShowDeleteCloudBackupAlert(false)} onConfirm={confirmDeleteCloudBackup} />
)}
); }; export default BookDetailModal;