'use client'; import { useState } from 'react'; import { Button } from './ui/button'; import { Database, RefreshCw, CheckCircle } from 'lucide-react'; import { useRegisterModal } from './modal/ModalStackProvider'; import type { Storage } from '~/server/services/storageService'; interface StorageSelectionModalProps { isOpen: boolean; onClose: () => void; onSelect: (storage: Storage) => void; storages: Storage[]; isLoading: boolean; onRefresh: () => void; title?: string; description?: string; filterFn?: (storage: Storage) => boolean; showBackupTag?: boolean; } export function StorageSelectionModal({ isOpen, onClose, onSelect, storages, isLoading, onRefresh, title = 'Select Storage', description = 'Select a storage to use.', filterFn, showBackupTag = true }: StorageSelectionModalProps) { const [selectedStorage, setSelectedStorage] = useState(null); useRegisterModal(isOpen, { id: 'storage-selection-modal', allowEscape: true, onClose }); if (!isOpen) return null; const handleSelect = () => { if (selectedStorage) { onSelect(selectedStorage); setSelectedStorage(null); } }; const handleClose = () => { setSelectedStorage(null); onClose(); }; // Filter storages using filterFn if provided, otherwise filter to show only backup-capable storages const filteredStorages = filterFn ? storages.filter(filterFn) : storages.filter(s => s.supportsBackup); return (
{/* Header */}

{title}

{/* Content */}
{isLoading ? (

Loading storages...

) : filteredStorages.length === 0 ? (

No backup-capable storages found

Make sure your server has storages configured with backup content type.

) : ( <>

{description}

{/* Storage List */}
{filteredStorages.map((storage) => (
setSelectedStorage(storage)} className={`p-4 border rounded-lg cursor-pointer transition-all ${ selectedStorage?.name === storage.name ? 'border-primary bg-primary/10' : 'border-border hover:border-primary/50 hover:bg-accent/50' }`} >

{storage.name}

{showBackupTag && ( Backup )} {storage.type}
Content: {storage.content.join(', ')} {storage.nodes && storage.nodes.length > 0 && ( • Nodes: {storage.nodes.join(', ')} )}
{selectedStorage?.name === storage.name && ( )}
))}
{/* Refresh Button */}
)} {/* Action Buttons */}
); }