/** * Inline issue-comment composer — thin wrapper around the shared * `` with comment-specific wiring: * * - `onSubmit` → `useCreateComment(issueId).mutateAsync` * - Reply target sourced from `useReplyTargetStore` (set by the * comment long-press action sheet) * - Mention picker path → `/[workspace]/mention-picker?mode=comment` * - Upload context binds attachments to this issue * * All UI / state / chip plumbing lives in `MessageComposer`. The chat * composer (`components/chat/chat-composer.tsx`) uses the same component * with chat-mode props. */ import { useCallback } from "react"; import { useCreateComment } from "@/data/mutations/issues"; import { useReplyTargetStore } from "@/data/stores/reply-target-store"; import { useWorkspaceStore } from "@/data/workspace-store"; import { MessageComposer } from "@/components/composer/message-composer"; export function InlineCommentComposer({ issueId }: { issueId: string }) { const createComment = useCreateComment(issueId); const wsSlug = useWorkspaceStore((s) => s.currentWorkspaceSlug); const replyTarget = useReplyTargetStore((s) => s.target); const clearReplyTarget = useReplyTargetStore((s) => s.clear); const onSubmit = useCallback( async ({ content, attachmentIds, }: { content: string; attachmentIds: string[]; }) => { try { await createComment.mutateAsync({ content, parentId: replyTarget?.commentId, attachmentIds: attachmentIds.length > 0 ? attachmentIds : undefined, }); } catch (err) { // Rethrow so MessageComposer's catch path restores text + chips. // The optimistic timeline row stays with its inline // Failed · Retry · Discard affordance. throw err; } }, [createComment, replyTarget?.commentId], ); return ( ); }