const { ipcRenderer } = require('electron'); const fs = require('fs'); /** * ModalManager - Manages video preview modal */ class ModalManager { constructor() { this.videoPreviewModal = null; } /** * Open video preview modal * @param {string} filePath - File path to preview */ async openVideoPreview(filePath) { console.log('Opening video preview for:', filePath); // Create modal if it doesn't exist if (!this.videoPreviewModal) { this.createVideoPreviewModal(); } // Show the modal this.videoPreviewModal.style.display = 'block'; // Load video content await this.loadVideoPreview(filePath); } /** * Create video preview modal */ createVideoPreviewModal() { // Create modal container this.videoPreviewModal = document.createElement('div'); this.videoPreviewModal.id = 'video-preview-modal'; this.videoPreviewModal.style.cssText = ` display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.9); z-index: 1000; justify-content: center; align-items: center; overflow: auto; `; // Create modal content const modalContent = document.createElement('div'); modalContent.style.cssText = ` position: relative; max-width: 90%; max-height: 90%; background-color: #fff; border-radius: 8px; padding: 20px; margin: 20px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); `; // Create close button const closeButton = document.createElement('span'); closeButton.innerHTML = '×'; closeButton.style.cssText = ` position: absolute; top: 10px; right: 15px; font-size: 30px; font-weight: bold; color: #aaa; cursor: pointer; transition: color 0.3s; `; closeButton.addEventListener('mouseenter', function() { this.style.color = '#000'; }); closeButton.addEventListener('click', function() { this.videoPreviewModal.style.display = 'none'; }.bind(this)); // Create video container const videoContainer = document.createElement('div'); videoContainer.id = 'video-preview-container'; videoContainer.style.cssText = ` text-align: center; margin-bottom: 15px; `; // Create file info display const fileInfo = document.createElement('div'); fileInfo.id = 'video-preview-file-info'; fileInfo.style.cssText = ` text-align: center; margin-bottom: 15px; padding: 10px; background-color: #f8f9fa; border-radius: 5px; font-size: 14px; `; // Create loading indicator const loadingIndicator = document.createElement('div'); loadingIndicator.id = 'video-preview-loading'; loadingIndicator.textContent = 'Loading video preview...'; loadingIndicator.style.cssText = ` text-align: center; padding: 20px; font-size: 16px; color: #666; `; // Assemble modal modalContent.appendChild(closeButton); modalContent.appendChild(fileInfo); modalContent.appendChild(videoContainer); modalContent.appendChild(loadingIndicator); this.videoPreviewModal.appendChild(modalContent); // Add click outside to close this.videoPreviewModal.addEventListener('click', function(e) { if (e.target === this.videoPreviewModal) { this.videoPreviewModal.style.display = 'none'; } }.bind(this)); // Add to body document.body.appendChild(this.videoPreviewModal); } /** * Load video preview * @param {string} filePath - File path to load */ async loadVideoPreview(filePath) { const fileInfo = document.getElementById('video-preview-file-info'); const videoContainer = document.getElementById('video-preview-container'); const loadingIndicator = document.getElementById('video-preview-loading'); // Show loading loadingIndicator.style.display = 'block'; videoContainer.innerHTML = ''; fileInfo.innerHTML = `Loading: ${filePath.split('/').pop()}`; try { // Check if file exists if (!fs.existsSync(filePath)) { throw new Error('File not found'); } // Get file stats for info const stats = fs.statSync(filePath); const fileName = filePath.split('/').pop(); // Update file info fileInfo.innerHTML = ` File: ${fileName}
Size: ${(stats.size / (1024 * 1024)).toFixed(2)} MB
Path: ${filePath} `; // For MKV files, open directly in default player const ext = filePath.toLowerCase().split('.').pop(); if (ext === 'mkv') { // Close the modal and open in default player directly this.videoPreviewModal.style.display = 'none'; ipcRenderer.invoke('open-file-in-player', filePath); } else { // For other formats, try to create a video player videoContainer.innerHTML = ` `; // Hide loading loadingIndicator.style.display = 'none'; } } catch (error) { console.error('Error loading video preview:', error); fileInfo.innerHTML = `Error: Could not load preview for ${filePath}`; videoContainer.innerHTML = '

Error loading video preview

'; loadingIndicator.style.display = 'none'; } } /** * Close the video preview modal */ closeVideoPreview() { if (this.videoPreviewModal) { this.videoPreviewModal.style.display = 'none'; } } /** * Get the modal element * @returns {HTMLElement|null} Modal element */ getModal() { return this.videoPreviewModal; } } module.exports = ModalManager;