import { Box, Grid, Typography } from '@material-ui/core' import { Web } from '@material-ui/icons' import { ReactElement, useEffect, useState } from 'react' import { File, Folder } from 'react-feather' import { FitImage } from '../../components/FitImage' import { detectIndexHtml, getAssetNameFromFiles, getHumanReadableFileSize } from '../../utils/file' import { SwarmFile } from '../../utils/SwarmFile' import { AssetIcon } from './AssetIcon' interface Props { assetName?: string files: SwarmFile[] } // TODO: add optional prop for indexDocument when it is already known (e.g. downloading a manifest) export function AssetPreview({ assetName, files }: Props): ReactElement { const [previewComponent, setPreviewComponent] = useState(undefined) const [previewUri, setPreviewUri] = useState(undefined) useEffect(() => { if (files.length === 1) { // single image if (files[0].type.startsWith('image/')) { files[0].arrayBuffer().then(value => { const blob = new Blob([value]) setPreviewUri(URL.createObjectURL(blob)) }) // single non-image } else { setPreviewUri(undefined) setPreviewComponent(} />) } // collection } else if (detectIndexHtml(files)) { setPreviewUri(undefined) setPreviewComponent(} />) } else { setPreviewUri(undefined) setPreviewComponent(} />) } }, [files]) const getPrimaryText = () => { const name = getAssetNameFromFiles(files) if (files.length === 1) { return 'Filename: ' + (assetName || name) } return 'Folder name: ' + (assetName || name) } const getKind = () => { if (files.length === 1) { return files[0].type } if (detectIndexHtml(files)) { return 'Website' } return 'Folder' } const isFolder = () => ['Folder', 'Website'].includes(getKind()) const getSize = () => { const bytes = files.reduce((total, item) => total + item.size, 0) return getHumanReadableFileSize(bytes) } const size = getSize() return ( {previewComponent ? ( previewComponent ) : ( )} {getPrimaryText()} Kind: {getKind()} {size !== '0 bytes' && Size: {size}} {isFolder() && ( Folder content {files.length} items )} ) }