import { useState } from 'react' import { ImageRecord, useGalleryStore } from '../../store' import { mediaSrc } from '../../lib/mediaSrc' import { Tooltip } from '../Tooltip' import { CheckIcon, PhotoIcon, PlayIcon, StarIcon, WarningIcon } from '../icons' import { formatDuration } from './format' import { TruncatedFilename } from './TruncatedFilename' export function ImageTile({ image, onClick, onContextMenu, }: { image: ImageRecord onClick: () => void onContextMenu: (event: React.MouseEvent) => void }) { const [loaded, setLoaded] = useState(false) const [errored, setErrored] = useState(false) const findSimilar = useGalleryStore((state) => state.findSimilar) const selected = useGalleryStore((state) => state.gallerySelectedIds.has(image.id)) const selectionActive = useGalleryStore((state) => state.gallerySelectedIds.size > 0) const toggleGallerySelected = useGalleryStore((state) => state.toggleGallerySelected) const canFindSimilar = image.embedding_status === 'ready' const src = mediaSrc(image.thumbnail_path) return (
{src && !errored ? ( <> {!loaded ?
: null} {image.filename} setLoaded(true)} onError={() => setErrored(true)} /> ) : (
{image.media_kind === 'video' ? ( ) : ( )}
)} {image.media_kind === 'video' ? (
) : null}
{image.embedding_status === 'failed' ? (
) : null} {image.favorite ? (
) : null} {image.rating > 0 ? (
{Array.from({ length: image.rating }, (_, index) => ( ))}
) : null} {image.media_kind === 'video' && image.duration_ms ? (
{formatDuration(image.duration_ms)}
) : null}
{image.rating > 0 ? (
{Array.from({ length: image.rating }, (_, index) => ( ))}
) : ( )}
) }