Skip to content

Commit 9d55510

Browse files
committed
fix(ChatMessages): added message slot to support custom message item
1 parent 41e5a18 commit 9d55510

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

src/runtime/components/ChatMessages.vue

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,23 @@ export interface ChatMessagesProps {
5959
ui?: ChatMessages['slots']
6060
}
6161
62+
type ChatSlotMessageProps = ChatMessageProps & {
63+
message?: UIMessage
64+
slots?: {
65+
[K in keyof ChatMessageSlots]?: ExtendSlotWithVersion<K>
66+
}
67+
}
68+
6269
type ExtendSlotWithVersion<K extends keyof ChatMessageSlots>
6370
= ChatMessageSlots[K] extends (props: infer P) => any
6471
? (props: P & { message: UIMessage }) => any
6572
: ChatMessageSlots[K]
6673
67-
export type ChatMessagesSlots = {
68-
[K in keyof ChatMessageSlots]: ExtendSlotWithVersion<K>
69-
} & {
70-
default(props?: {}): any
71-
indicator(props: { ui: ChatMessages['ui'] }): any
72-
viewport(props: { ui: ChatMessages['ui'], onClick: () => void }): any
74+
export type ChatMessagesSlots = ChatSlotMessageProps['slots'] & {
75+
default?(): any
76+
indicator?(props: { ui: ChatMessages['ui'] }): any
77+
viewport?(props: { ui: ChatMessages['ui'], onClick: () => void }): any
78+
message?(props: ChatSlotMessageProps): any
7379
}
7480
7581
</script>
@@ -293,19 +299,18 @@ onMounted(() => {
293299
:style="{ '--last-message-height': `${lastMessageHeight}px` }"
294300
>
295301
<slot>
296-
<UChatMessage
297-
v-for="message in messages"
298-
:key="message.id"
299-
v-bind="{ ...message, ...(message.role === 'user' ? userProps : assistantProps) }"
300-
:ref="(el) => registerMessageRef(message.id, el as ComponentPublicInstance)"
301-
:compact="compact"
302-
>
303-
<template v-for="(_, name) in getProxySlots()" #[name]="slotData">
304-
<slot :name="name" v-bind="(slotData as any)" :message="message" />
305-
</template>
306-
</UChatMessage>
302+
<template v-for="message in messages" :key="message.id">
303+
<component
304+
:is="$slots.message ? $slots.message : UChatMessage"
305+
v-bind="{ ...message, ...(message.role === 'user' ? userProps : assistantProps), compact, message, slots: getProxySlots() }"
306+
:ref="(el: ComponentPublicInstance) => registerMessageRef(message.id, el)"
307+
>
308+
<template v-for="(_, name) in getProxySlots()" #[name]="slotData">
309+
<slot :name="name" v-bind="slotData" :message="message" />
310+
</template>
311+
</component>
312+
</template>
307313
</slot>
308-
309314
<UChatMessage
310315
v-if="status === 'submitted'"
311316
id="indicator"

0 commit comments

Comments
 (0)