"use client"; import { useRef, useState } from "react"; import { ArrowUp, Loader2, Paperclip } from "lucide-react"; import { Button } from "@/components/ui/button"; import { RichTextEditor, type RichTextEditorRef } from "@/components/common/rich-text-editor"; import { useFileUpload } from "@/shared/hooks/use-file-upload"; interface CommentInputProps { issueId: string; onSubmit: (content: string, attachmentIds?: string[]) => Promise; } function CommentInput({ issueId, onSubmit }: CommentInputProps) { const editorRef = useRef(null); const fileInputRef = useRef(null); const attachmentIdsRef = useRef([]); const [isEmpty, setIsEmpty] = useState(true); const [submitting, setSubmitting] = useState(false); const { uploadWithToast, uploading } = useFileUpload(); const handleUpload = async (file: File) => { const result = await uploadWithToast(file, { issueId }); if (result) attachmentIdsRef.current.push(result.id); return result; }; const handleFileSelect = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; e.target.value = ""; const result = await handleUpload(file); if (result) { editorRef.current?.insertFile(result.filename, result.link, file.type.startsWith("image/")); } }; const handleSubmit = async () => { const content = editorRef.current?.getMarkdown()?.replace(/(\n\s*)+$/, "").trim(); if (!content || submitting) return; setSubmitting(true); try { const ids = attachmentIdsRef.current.length > 0 ? [...attachmentIdsRef.current] : undefined; await onSubmit(content, ids); editorRef.current?.clearContent(); attachmentIdsRef.current = []; setIsEmpty(true); } finally { setSubmitting(false); } }; return (
setIsEmpty(!md.trim())} onSubmit={handleSubmit} onUploadFile={handleUpload} debounceMs={100} />
); } export { CommentInput };