feat: improve upload flow (#240)
* feat: separate flow for folder and file uploads * feat: add basic index document detection * feat(wip): separate preview step * fix: fix kb and mb units * feat: add post upload summary, add some styling * feat: upload flow * fix: change element order and add conditional rendering * refactor: remove unused variables for now * fix: put back stamp creation to stamp page * refactor: rework postage stamps and grid * feat: add website and folder icons * feat: add asset preview to download flow, add file icon * feat: add basic design to postage stamp selection dialog * feat: add web icon, shorten stamp in preview * feat: extract swarm hash in download flow * fix: extract swarmbutton and solve icon hover and focus color * fix: always show buy button on stamp page * refactor: downgrade * refactor: speed up icon transition * style: improve download buttons * style: change [back to upload] icon * style: add spacing before swarm gateway text * style: post upload summary spacing * refactor: drop verticalspacing and use box * refactor: merge icons to one component * refactor: use conditions instead of weird assignment * docs: explain filter(x => x) * refactor: generalize capacity * refactor: avoid passing arrow functions * refactor: get rid of PaperGridContainer and Container * fix: fix hover color for postage stamps * feat: add disabled and loading state to buttons * fix: make drag and drop work for websites * feat: handle folders and non existing hashes * fix: provide empty default value to select to avoid console warning * style: remove body2 font variants * fix: remove typo * feat: disable folder upload, add website upload * fix: disable showPreviews to avoid flickering * feat(temp): remove folder upload * fix: remove stuck focus on buttons even after rendering different buttons * style: merge hover and focus styles, fix safari text wrap issue * style: remove dropbox outline in safari
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
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, getHumanReadableFileSize } from '../../utils/file'
|
||||
import { SwarmFile } from '../../utils/SwarmFile'
|
||||
import { AssetIcon } from './AssetIcon'
|
||||
|
||||
interface Props {
|
||||
files: SwarmFile[]
|
||||
}
|
||||
|
||||
export function AssetPreview({ files }: Props): ReactElement {
|
||||
const [previewComponent, setPreviewComponent] = useState<ReactElement | undefined>(undefined)
|
||||
const [previewUri, setPreviewUri] = useState<string | undefined>(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(<AssetIcon icon={<File />} />)
|
||||
}
|
||||
// collection
|
||||
} else if (detectIndexHtml(files)) {
|
||||
setPreviewUri(undefined)
|
||||
setPreviewComponent(<AssetIcon icon={<Web />} />)
|
||||
} else {
|
||||
setPreviewUri(undefined)
|
||||
setPreviewComponent(<AssetIcon icon={<Folder />} />)
|
||||
}
|
||||
}, [files])
|
||||
|
||||
const getPrimaryText = () => {
|
||||
if (files.length === 1) {
|
||||
return 'Filename: ' + files[0].name
|
||||
}
|
||||
|
||||
return 'Folder name: ' + files[0].path.split('/')[0]
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
return (
|
||||
<Box mb={4}>
|
||||
<Box bgcolor="background.paper">
|
||||
<Grid container direction="row">
|
||||
{previewComponent ? (
|
||||
previewComponent
|
||||
) : (
|
||||
<FitImage maxWidth="250px" maxHeight="175px" alt="Upload Preview" src={previewUri} />
|
||||
)}
|
||||
<Box p={2}>
|
||||
<Typography>{getPrimaryText()}</Typography>
|
||||
<Typography>Kind: {getKind()}</Typography>
|
||||
<Typography>Size: {getSize()}</Typography>
|
||||
</Box>
|
||||
</Grid>
|
||||
</Box>
|
||||
{isFolder() && (
|
||||
<Box mt={0.25} p={2} bgcolor="background.paper">
|
||||
<Grid container justifyContent="space-between" alignItems="center" direction="row">
|
||||
<Typography variant="subtitle2">Folder content</Typography>
|
||||
<Typography variant="subtitle2">{files.length} items</Typography>
|
||||
</Grid>
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user