import * as React from "react" import type { Editor } from "@tiptap/react" import { Button } from "@/components/ui/button" import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { cn } from "@/lib/utils" import { storeImageFn } from "@shared/actions" import { ZodError } from "zod" interface ImageEditBlockProps extends React.HTMLAttributes { editor: Editor close: () => void } const ImageEditBlock = ({ editor, className, close, ...props }: ImageEditBlockProps) => { const fileInputRef = React.useRef(null) const [link, setLink] = React.useState("") const [isUploading, setIsUploading] = React.useState(false) const [error, setError] = React.useState(null) const handleClick = (e: React.MouseEvent) => { e.preventDefault() e.stopPropagation() fileInputRef.current?.click() } const handleLink = () => { editor.chain().focus().setImage({ src: link }).run() close() } const handleFile = async (e: React.ChangeEvent) => { const files = e.target.files if (!files || files.length === 0) return setIsUploading(true) setError(null) const formData = new FormData() formData.append("file", files[0]) try { const response = await storeImageFn(formData) editor .chain() .setImage({ src: response.fileModel.content.src }) .focus() .run() close() } catch (error) { if (error instanceof Error) { try { const errors = JSON.parse(error.message) if (errors.body.name === "ZodError") { setError( (errors.body as ZodError).issues .map((issue) => issue.message) .join(", "), ) } else { setError(error.message) } } catch (parseError) { setError(error.message) } } else { setError("An unknown error occurred") } } finally { setIsUploading(false) } } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() e.stopPropagation() handleLink() } return (
setLink(e.target.value)} />
{error && (
{error}
)}
) } export { ImageEditBlock }