mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-27 21:33:41 +02:00
Submitting a composer mid-upload silently lost the file: the editor holds a `blob:` placeholder that gets stripped during serialization, and the attachment id does not exist yet, so the send succeeded without the file. Chat and Quick Create gated this; manual issue create, Feedback's button, comments, replies and comment edit did not. Gate every action that FIXES a draft — Send/Create/Save, Cmd/Ctrl+Enter, Enter on the title, and the manual/agent mode switches — behind one source of truth: the editor document, which IS the upload queue. ContentEditor publishes queue transitions via `onUploadingChange` (a transaction listener, not `onUpdate` — that path is debounced and skips no-change emissions, and a failed upload leaves byte-identical markdown, so the un-gate would never fire). `useUploadGate` pairs that render state with an `isBlocked()` re-read at submit time, since the shortcut paths never consult the button. The publisher emits its current answer on subscribe rather than only on flips: hosts outlive editor instances (comment edit remounts on cancel, chat swaps by key on agent switch), and an editor torn down mid-upload would otherwise leave submit wedged shut with no pending node left to reopen it. Also fixes the failure toast that never fired: `uploadWithToast` only reported errors if a caller passed `onError`, and none did, so failed uploads removed their placeholder and vanished unexplained. `useEditorUpload` now supplies it once for every composer. Per MUL-4808: drops Quick Create's upload-time lock on the attach button (files can queue), and leaves description autosave ungated by design. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: multica-agent <github@multica.ai>
30 lines
1.2 KiB
TypeScript
30 lines
1.2 KiB
TypeScript
export {
|
|
ContentEditor,
|
|
type ContentEditorProps,
|
|
type ContentEditorRef,
|
|
} from "./content-editor";
|
|
export {
|
|
TitleEditor,
|
|
type TitleEditorProps,
|
|
type TitleEditorRef,
|
|
} from "./title-editor";
|
|
export { ReadonlyContent } from "./readonly-content";
|
|
export { useFileDropZone } from "./use-file-drop-zone";
|
|
export { useUploadGate, type UploadGate } from "./use-upload-gate";
|
|
export { useEditorUpload } from "./use-editor-upload";
|
|
export { FileDropOverlay } from "./file-drop-overlay";
|
|
export { useLazyEditor, type LazyEditorHandle, type LazyFocusTarget } from "./use-lazy-editor";
|
|
export { anchorFromPoint, type TextAnchor } from "./text-anchor";
|
|
export { useDownloadAttachment } from "./use-download-attachment";
|
|
export { AttachmentDownloadProvider } from "./attachment-download-context";
|
|
export {
|
|
AttachmentPreviewModal,
|
|
useAttachmentPreview,
|
|
isPreviewable,
|
|
} from "./attachment-preview-modal";
|
|
export type { AttachmentPreviewHandle } from "./attachment-preview-modal";
|
|
export { AttachmentCard } from "./attachment-card";
|
|
export type { AttachmentCardProps } from "./attachment-card";
|
|
export { Attachment } from "./attachment";
|
|
export type { AttachmentInput, AttachmentProps } from "./attachment";
|