// Dependencies import { slugify, slugifyNoTrim, cloudflareImageUrl } from 'shared/utils.mjs' // Hooks import { useTranslation } from 'react-i18next' import { useEffect, useState, useCallback } from 'react' import { useBackend } from 'shared/hooks/use-backend.mjs' import { useDropzone } from 'react-dropzone' import { Popout } from 'shared/components/popout/index.mjs' import { Loading } from 'shared/components/spinner.mjs' import { DownloadIcon } from 'shared/components/icons.mjs' export const ns = ['account'] export const CaptionInput = ({ caption, setCaption }) => ( setCaption(evt.target.value)} /> ) export const IntroInput = ({ intro, setIntro }) => ( setIntro(evt.target.value)} /> ) export const BodyInput = ({ body, setBody }) => ( setBody(evt.target.value)} rows={16} value={body} /> ) export const TitleInput = ({ title, setTitle }) => ( setTitle(evt.target.value)} /> ) export const SlugInput = ({ slug, setSlug, title, slugAvailable }) => { useEffect(() => { if (title !== slug) setSlug(slugify(title)) }, [title]) return ( setSlug(slugifyNoTrim(evt.target.value))} /> ) } export const ImageInput = ({ slug = false, setImg, img, type = 'showcase', subId = false }) => { const backend = useBackend() const { t } = useTranslation(ns) const [uploading, setUploading] = useState(false) const [url, setUrl] = useState('') const onDrop = useCallback( (acceptedFiles) => { const reader = new FileReader() reader.onload = async () => { setUploading(true) const result = await backend.uploadImage({ type, subId, slug, img: reader.result }) setUploading(false) if (result.success) setImg(result.data.imgId) } acceptedFiles.forEach((file) => reader.readAsDataURL(file)) }, [slug] ) const imageFromUrl = async () => { setUploading(true) const result = await backend.uploadImage({ type, subId, slug, url }) setUploading(false) if (result.success) setImg(result.data.imgId) } const { getRootProps, getInputProps } = useDropzone({ onDrop }) const removeImage = async () => { setUploading(true) const result = await backend.removeImage(img) setUploading(false) if (result.response.status === 204) setImg('') } if (!slug) return ( A slug is mandatory ) if (!subId) return ( A subId prop is mandatory ) if (uploading) return if (img) return ( Remove Image ) return ( {t('imgDragAndDropImageHere')} {t('or')} {t('imgSelectImage')} {t('or')} setUrl(evt.target.value)} /> ) }
{t('imgDragAndDropImageHere')}
{t('or')}