import React, { useState, useEffect } from 'react' import useIpfsApi, { IpfsConfig } from '../hooks/use-ipfs-api' import { formatBytes, addToIpfs } from '../utils' import { ipfsNodeUri, ipfsGateway } from '../../site.config' import Dropzone from './Dropzone' import styles from './Add.module.css' import Spinner from './Spinner' const { hostname, port, protocol } = new URL(ipfsNodeUri) const ipfsConfig: IpfsConfig = { protocol: protocol.replace(':', ''), host: hostname, port: port || '443' } export default function Add() { const { ipfs, isIpfsReady, ipfsError } = useIpfsApi(ipfsConfig) const [fileHash, setFileHash] = useState() const [loading, setLoading] = useState(false) const [message, setMessage] = useState() const [error, setError] = useState() const [fileSize, setFileSize] = useState() const [fileSizeReceived, setFileSizeReceived] = useState('') useEffect(() => { setMessage( `Adding to IPFS
${fileSizeReceived || 0}/${fileSize}
` ) }, [fileSize, fileSizeReceived]) async function handleOnDrop(acceptedFiles: File[]) { if (!acceptedFiles[0]) return setLoading(true) setError(null) const totalSize = formatBytes(acceptedFiles[0].size, 0) setFileSize(totalSize) try { const cid = await addToIpfs(acceptedFiles, setFileSizeReceived, ipfs) if (!cid) return setFileHash(cid) setLoading(false) } catch (error) { setError(`Adding to IPFS failed: ${error.message}`) return null } } return (
{loading ? ( ) : fileHash ? ( ipfs://{fileHash} ) : ( )}
) }