summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/message-part.tsx
diff options
context:
space:
mode:
authorFilip <[email protected]>2026-03-02 08:57:34 +0100
committerGitHub <[email protected]>2026-03-02 13:27:34 +0530
commitbf2cc3aa2f0f0576317d048852d83d45a4724c46 (patch)
tree19fb1349fca81579f6c09d6d20294da54cee2048 /packages/ui/src/components/message-part.tsx
parent4b9e19f72f8ebbf05f6b951fd96cf68ba0b23957 (diff)
downloadopencode-bf2cc3aa2f0f0576317d048852d83d45a4724c46.tar.gz
opencode-bf2cc3aa2f0f0576317d048852d83d45a4724c46.zip
feat(app): show which messages are queued (#15587)
Diffstat (limited to 'packages/ui/src/components/message-part.tsx')
-rw-r--r--packages/ui/src/components/message-part.tsx17
1 files changed, 15 insertions, 2 deletions
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 02a99f9dd..39a2b4c23 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -92,6 +92,7 @@ export interface MessageProps {
parts: PartType[]
showAssistantCopyPartID?: string | null
interrupted?: boolean
+ queued?: boolean
showReasoningSummaries?: boolean
}
@@ -500,6 +501,7 @@ export function Message(props: MessageProps) {
message={userMessage() as UserMessage}
parts={props.parts}
interrupted={props.interrupted}
+ queued={props.queued}
/>
)}
</Match>
@@ -679,7 +681,12 @@ function ContextToolGroup(props: { parts: ToolPart[]; busy?: boolean }) {
)
}
-export function UserMessageDisplay(props: { message: UserMessage; parts: PartType[]; interrupted?: boolean }) {
+export function UserMessageDisplay(props: {
+ message: UserMessage
+ parts: PartType[]
+ interrupted?: boolean
+ queued?: boolean
+}) {
const data = useData()
const dialog = useDialog()
const i18n = useI18n()
@@ -759,6 +766,7 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
<div
data-slot="user-message-attachment"
data-type={file.mime.startsWith("image/") ? "image" : "file"}
+ data-queued={props.queued ? "" : undefined}
onClick={() => {
if (file.mime.startsWith("image/") && file.url) {
openImagePreview(file.url, file.filename)
@@ -787,9 +795,14 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
<Show when={text()}>
<>
<div data-slot="user-message-body">
- <div data-slot="user-message-text">
+ <div data-slot="user-message-text" data-queued={props.queued ? "" : undefined}>
<HighlightedText text={text()} references={inlineFiles()} agents={agents()} />
</div>
+ <Show when={props.queued}>
+ <div data-slot="user-message-queued-indicator">
+ <TextShimmer text={i18n.t("ui.message.queued")} />
+ </div>
+ </Show>
</div>
<div data-slot="user-message-copy-wrapper" data-interrupted={props.interrupted ? "" : undefined}>
<Show when={metaHead() || metaTail()}>