'use client'; import { useState, useEffect, useRef, forwardRef, useImperativeHandle, } from 'react'; import { Button } from '@/components/ui/Button'; import { useEnterSubmit } from '@/lib/hooks/useEnterSubmit'; import Img from '../ui/Img'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/Tooltip'; import { IconImage, IconArrowUp, IconClose } from '@/components/ui/Icons'; import { cn } from '@/lib/utils'; import Chip from '../ui/Chip'; import Textarea from 'react-textarea-autosize'; import useMediaUpload from '@/lib/hooks/useMediaUpload'; export interface ComposerProps { onSubmit: (params: { input: string; mediaUrl: string }) => Promise; disabled?: boolean; title?: string; initMediaUrl?: string; initInput?: string; } export interface ComposerRef { setMediaUrl: (url: string) => void; setInput: (input: string) => void; } const Composer = forwardRef( ({ disabled, onSubmit, initMediaUrl, initInput }, ref) => { const { formRef, onKeyDown } = useEnterSubmit(); const inputRef = useRef(null); const [localMediaUrl, setLocalMediaUrl] = useState( initMediaUrl, ); const [isSubmitting, setIsSubmitting] = useState(false); const [input, setLocalInput] = useState(initInput ?? ''); const noMediaValidation = !localMediaUrl && !!input; const { getRootProps, getInputProps, isDragActive, isUploading, openUpload, } = useMediaUpload(uploadUrl => setLocalMediaUrl(uploadUrl)); const finalLoading = isUploading || isSubmitting; const finalDisabled = finalLoading || disabled; useEffect(() => { if (inputRef.current) { inputRef.current.focus(); } }, []); useImperativeHandle(ref, () => ({ setMediaUrl(mediaUrl) { setLocalMediaUrl(mediaUrl); }, setInput(input) { setLocalInput(input); }, })); const mediaName = localMediaUrl?.split('/').pop(); return (
{localMediaUrl ? (

{mediaName ?? 'unnamed_media'}

zoomed-in-image
) : ( )}
{ e.preventDefault(); if (!input?.trim() || !localMediaUrl) { return; } setIsSubmitting(true); try { await onSubmit({ input, mediaUrl: localMediaUrl }); } finally { setIsSubmitting(false); setLocalInput(''); } }} ref={formRef} className="h-full mt-4" > {/*
*/}