ipfs/src/components/Add.tsx

100 lines
2.4 KiB
TypeScript
Raw Normal View History

2020-07-08 01:30:27 +02:00
import React, { useState, ReactElement } from 'react'
2021-09-12 21:19:07 +02:00
import { ipfsGateway } from '../../site.config'
2021-09-13 21:09:46 +02:00
import Dropzone from './Dropzone'
2019-10-20 01:40:55 +02:00
import styles from './Add.module.css'
2019-10-20 03:23:38 +02:00
import Loader from './Loader'
import useIpfsApi from '../hooks/use-ipfs-api'
2021-09-12 16:41:30 +02:00
import { FileIpfs } from '../@types/ipfs'
2021-09-13 21:09:46 +02:00
import { FileWithPath } from 'react-dropzone'
function FileLink({
file,
cidFolder,
cid
}: {
file: FileIpfs
cidFolder: string
cid?: string
}) {
const title = cid ? `ipfs://${cid}` : `ipfs://${cidFolder}/${file.path}`
const href = cid
? `${ipfsGateway}/ipfs/${cid}`
: `${ipfsGateway}/ipfs/${cidFolder}/${file.path}`
return cidFolder !== cid ? (
<a
className={styles.link}
target="_blank"
rel="noopener noreferrer"
href={href}
>
{title}
</a>
) : null
}
function Files({ files }: { files: FileIpfs[] }) {
const cidFolder = files.filter((file) => file.path === '')[0].cid.toString()
return (
<ul className={styles.files}>
{files?.map((file) => (
<li key={file.path}>
<h3 className={styles.title}>
{file.path === '' ? 'Folder with all files' : file.path}
</h3>
<FileLink
file={file}
cidFolder={cidFolder}
cid={file.cid.toString()}
/>
<p>
<FileLink file={file} cidFolder={cidFolder} />
</p>
</li>
))}
</ul>
)
}
2019-10-20 01:40:55 +02:00
2020-07-08 01:30:27 +02:00
export default function Add(): ReactElement {
2021-09-12 21:19:07 +02:00
const { ipfs, isIpfsReady, ipfsError, addFiles } = useIpfsApi()
2021-09-12 16:41:30 +02:00
const [files, setFiles] = useState<FileIpfs[]>()
2019-10-20 01:40:55 +02:00
const [loading, setLoading] = useState(false)
const [message] = useState()
2021-09-12 16:41:30 +02:00
const [error, setError] = useState<string>()
2019-10-20 01:40:55 +02:00
2021-09-13 21:09:46 +02:00
async function handleOnDrop(acceptedFiles: FileWithPath[]): Promise<void> {
2021-09-12 16:41:30 +02:00
if (!acceptedFiles || !ipfs || !isIpfsReady) return
2019-10-20 01:40:55 +02:00
setLoading(true)
2021-09-12 16:41:30 +02:00
setError(undefined)
2019-10-20 01:40:55 +02:00
try {
2021-09-12 16:41:30 +02:00
const addedFiles = await addFiles(acceptedFiles)
setFiles(addedFiles)
2019-10-20 01:40:55 +02:00
setLoading(false)
} catch (error) {
2021-09-12 16:41:30 +02:00
setError(`Adding to IPFS failed: ${(error as Error).message}`)
return
2019-10-20 01:40:55 +02:00
}
}
return (
<div className={styles.add}>
{loading ? (
2019-10-20 03:23:38 +02:00
<Loader message={message} />
2021-09-12 16:41:30 +02:00
) : files?.length ? (
2021-09-13 21:09:46 +02:00
<Files files={files} />
2019-10-20 01:40:55 +02:00
) : (
<Dropzone
2021-09-12 16:41:30 +02:00
multiple
2019-10-20 01:40:55 +02:00
handleOnDrop={handleOnDrop}
disabled={!isIpfsReady}
error={error || ipfsError}
/>
)}
</div>
)
}