// 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 { useToast } from 'shared/hooks/use-toast.mjs' import { useDropzone } from 'react-dropzone' import { Popout } from 'shared/components/popout/index.mjs' import { Loading } from 'shared/components/spinner.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 }) => ( ) export const TitleInput = ({ title, setTitle }) => ( setTitle(evt.target.value)} /> ) export const SlugInput = ({ slug, setSlug, title }) => { 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 toast = useToast() const { t } = useTranslation(ns) const [uploading, setUploading] = useState(false) 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 { 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 (
) return (

{t('imgDragAndDropImageHere')}

{t('or')}

) }