import React, { useState, useRef } from 'react'; import PropTypes from 'prop-types'; import './ImageUpload.scss'; import initMatrix from '../../../client/initMatrix'; import Text from '../../atoms/text/Text'; import Avatar from '../../atoms/avatar/Avatar'; import Spinner from '../../atoms/spinner/Spinner'; import RawIcon from '../../atoms/system-icons/RawIcon'; import PlusIC from '../../../../public/res/ic/outlined/plus.svg'; function ImageUpload({ text, bgColor, imageSrc, onUpload, onRequestRemove, size, }) { const [uploadPromise, setUploadPromise] = useState(null); const uploadImageRef = useRef(null); async function uploadImage(e) { const file = e.target.files.item(0); if (file === null) return; try { const uPromise = initMatrix.matrixClient.uploadContent(file); setUploadPromise(uPromise); const res = await uPromise; if (typeof res?.content_uri === 'string') onUpload(res.content_uri); setUploadPromise(null); } catch { setUploadPromise(null); } uploadImageRef.current.value = null; } function cancelUpload() { initMatrix.matrixClient.cancelUpload(uploadPromise); setUploadPromise(null); uploadImageRef.current.value = null; } return (
{ (typeof imageSrc === 'string' || uploadPromise !== null) && ( )}
); } ImageUpload.defaultProps = { text: null, bgColor: 'transparent', imageSrc: null, size: 'large', }; ImageUpload.propTypes = { text: PropTypes.string, bgColor: PropTypes.string, imageSrc: PropTypes.string, onUpload: PropTypes.func.isRequired, onRequestRemove: PropTypes.func.isRequired, size: PropTypes.oneOf(['large', 'normal']), }; export default ImageUpload;