import React, { useEffect, useMemo, useState } from 'react' function getScreenshotName(item, fallbackIndex) { if (item && typeof item === 'object' && typeof item.name === 'string' && item.name.trim()) { return item.name.trim() } return `Screenshot ${fallbackIndex + 1}` } function resolveScreenshotSource(item) { if (!item) return { src: null, revoke: null } if (typeof item === 'string') { return { src: item, revoke: null } } if (typeof item === 'object') { if (typeof item.preview === 'string' && item.preview) { return { src: item.preview, revoke: null } } if (typeof item.src === 'string' && item.src) { return { src: item.src, revoke: null } } if (typeof item.url === 'string' && item.url) { return { src: item.url, revoke: null } } if (typeof File !== 'undefined' && item instanceof File) { const objectUrl = URL.createObjectURL(item) return { src: objectUrl, revoke: () => URL.revokeObjectURL(objectUrl), } } } return { src: null, revoke: null } } export default function ArchiveScreenshotPicker({ screenshots = [], selectedIndex = 0, onSelect, compact = false, title = 'Screenshots', description = 'Choose which screenshot should be used as the default preview.', }) { const [resolvedScreenshots, setResolvedScreenshots] = useState([]) useEffect(() => { const cleanup = [] const next = (Array.isArray(screenshots) ? screenshots : []).map((item, index) => { const { src, revoke } = resolveScreenshotSource(item) if (revoke) cleanup.push(revoke) return { src, alt: getScreenshotName(item, index), } }).filter((item) => Boolean(item.src)) setResolvedScreenshots(next) return () => { cleanup.forEach((revoke) => revoke()) } }, [screenshots]) const normalizedIndex = useMemo(() => { if (resolvedScreenshots.length === 0) return 0 if (!Number.isFinite(selectedIndex)) return 0 return Math.min(Math.max(0, Math.floor(selectedIndex)), resolvedScreenshots.length - 1) }, [resolvedScreenshots.length, selectedIndex]) const selectedScreenshot = resolvedScreenshots[normalizedIndex] ?? null if (!selectedScreenshot) { return null } return (

{title}

{description}

Default preview
{selectedScreenshot.alt}
{resolvedScreenshots.map((item, index) => { const isSelected = index === normalizedIndex return ( ) })}
) }