'use client' import { useState, useEffect } from 'react' import { IconFolder, IconClock, IconTrash, IconScan } from '@tabler/icons-react' import { Directory } from '@/types/photo' import Button from "@/components/Button"; interface DirectoryListProps { onDirectorySelect?: (directory: Directory) => void selectedDirectory?: string refreshTrigger?: number // Add a trigger to force refresh } export default function DirectoryList({ onDirectorySelect, selectedDirectory, refreshTrigger }: DirectoryListProps) { const [directories, setDirectories] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [scanningDirectories, setScanningDirectories] = useState>(new Set()) const fetchDirectories = async () => { try { setLoading(true) const response = await fetch('/api/directories') if (!response.ok) { throw new Error('Failed to fetch directories') } const data = await response.json() setDirectories(data.directories || []) setError(null) } catch (error) { console.error('Error fetching directories:', error) setError('Failed to load directories') } finally { setLoading(false) } } const deleteDirectory = async (directoryId: string) => { try { const response = await fetch(`/api/directories/${directoryId}`, { method: 'DELETE', }) if (!response.ok) { throw new Error('Failed to delete directory') } // Refresh the list fetchDirectories() } catch (error) { console.error('Error deleting directory:', error) } } const scanDirectory = async (directory: Directory) => { const requestStartTime = Date.now() console.log(`[CLIENT] Starting scan request for directory: ${directory.path}`) console.log(`[CLIENT] Directory details:`, { id: directory.id, name: directory.name, path: directory.path, lastScanned: directory.last_scanned, photoCount: directory.photo_count }) try { // Mark directory as scanning setScanningDirectories(prev => new Set(prev).add(directory.path)) console.log(`[CLIENT] Marked directory as scanning: ${directory.path}`) console.log(`[CLIENT] Sending POST request to /api/scan`) const response = await fetch('/api/scan', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ directoryPath: directory.path }), }) const requestDuration = Date.now() - requestStartTime console.log(`[CLIENT] API response received after ${requestDuration}ms, status: ${response.status}`) if (!response.ok) { const errorText = await response.text() console.error(`[CLIENT] API request failed:`, errorText) throw new Error(`Failed to start directory scan: ${response.status} ${errorText}`) } const result = await response.json() console.log(`[CLIENT] Directory scan started successfully:`, result) console.log(`[CLIENT] Background scan is now running for: ${directory.path}`) // Remove scanning status after a brief delay (scan runs in background) setTimeout(() => { console.log(`[CLIENT] Removing scanning status for: ${directory.path}`) setScanningDirectories(prev => { const newSet = new Set(prev) newSet.delete(directory.path) return newSet }) // Refresh directory list to show updated last_scanned time console.log(`[CLIENT] Refreshing directory list to show updated scan time`) fetchDirectories() }, 2000) } catch (error) { const requestDuration = Date.now() - requestStartTime console.error(`[CLIENT] Error starting directory scan for ${directory.path} after ${requestDuration}ms:`, error) // Remove scanning status on error setScanningDirectories(prev => { const newSet = new Set(prev) newSet.delete(directory.path) return newSet }) } } useEffect(() => { fetchDirectories() }, [refreshTrigger]) const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) } const formatFileSize = (bytes: number) => { if (bytes === 0) return '0 B' const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB', 'TB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } if (loading) { return (

Saved Directories

{[...Array(3)].map((_, i) => (
))}
) } if (error) { return (

Saved Directories

{error}
) } return (

Saved Directories

{directories.length === 0 ? (
No directories saved yet
) : (
{directories.map((directory) => (
onDirectorySelect?.(directory)} >
{directory.name}
{directory.path}
{formatDate(directory.last_scanned)}
{directory.photo_count > 0 && (
{directory.photo_count} photos
)} {directory.total_size > 0 && (
{formatFileSize(directory.total_size)}
)}
))}
)}
) }