- Shipped
- August 13, 2026 at 5:22 AM UTC
- Author
- kamo
- Commit
- f0896c7
A support ticket and a social DM are the same thing as a member chat — a media session with messages on it — but they were answered through a bare text field. An agent could be sent a screenshot by a customer and had no way to send one back: no attach button, no drag-drop, no paste, no emoji, and an input that would not grow past one line. Both now render the member chat's Composer, so the upload machinery, the attachment tray, the transfer panel, the emoji picker and Enter-to-send are one implementation across all three. Received and sent attachments render in the bubbles via the same AttachmentChip. Two things the tabbed support window forced out into the open: - Drafts are parked per conversation (useDraftParking). One composer serves several tickets and the send posts to whoever is on screen, so a draft left in the box is one customer's words aimed at another. Discarding after a send takes the key the send started with, or switching tabs mid-flight would wipe the reply being typed to somebody else. - Staged attachments are held per session too. A flat list put one customer's file in another's tray and uploaded it there; uploadAll now addresses the session the files were staged for, whatever tab is in view when it lands. Social replies are capped at one file of 10 MB: a message carries a single MediaObjSocialRef, so a second attachment could be stored and never relayed, and 10 MB is the tightest provider ceiling we send through. Refusing it in the composer beats losing it silently. A failed send is now reported separately from a failed upload — the files are up, the message is not, and the draft is still there to try again.