import { CopyButton } from '@shared/components/ui/CopyButton'
import { base64ToUtf8 } from '@shared/lib/utils'
import { type Component, createRoot, getOwner, onCleanup, onMount } from 'solid-js'
import { insert } from 'solid-js/web'
export const AssistantMessage: Component<{
message: string
}> = (props) => {
let contentRef!: HTMLDivElement
const disposers: Array<() => void> = []
const getHTML = () => {
return props.message
}
onMount(() => {
if (!contentRef) return
const owner = getOwner()
const codeBlocks = contentRef.querySelectorAll('.code-block-container')
codeBlocks.forEach((block) => {
const encoded = block.getAttribute('data-code')
if (!encoded) return
const code = base64ToUtf8(encoded)
const topContainer = document.createElement('div')
const bottomContainer = document.createElement('div')
block.prepend(topContainer)
block.append(bottomContainer)
createRoot((dispose) => {
insert(topContainer, () => <CopyButton code={code} position="top" />)
disposers.push(dispose)
}, owner)
createRoot((dispose) => {
insert(bottomContainer, () => <CopyButton code={code} position="bottom" />)
disposers.push(dispose)
}, owner)
})
})
onCleanup(() => {
disposers.forEach((d) => {
d()
})
})
return (
<div>
<div ref={contentRef} innerHTML={getHTML()} />
</div>
)
}
import { CopyButton } from '@shared/components/ui/CopyButton'
import { base64ToUtf8 } from '@shared/lib/utils'
import { type Component, createRoot, getOwner, onCleanup, onMount } from 'solid-js'
import { insert } from 'solid-js/web'
export const AssistantMessage: Component<{
message: string
}> = (props) => {
let contentRef!: HTMLDivElement
const disposers: Array<() => void> = []
const getHTML = () => {
return props.message
}
onMount(() => {
if (!contentRef) return
const owner = getOwner()
const codeBlocks = contentRef.querySelectorAll('.code-block-container')
codeBlocks.forEach((block) => {
const encoded = block.getAttribute('data-code')
if (!encoded) return
const code = base64ToUtf8(encoded)
const topContainer = document.createElement('div')
const bottomContainer = document.createElement('div')
block.prepend(topContainer)
block.append(bottomContainer)
createRoot((dispose) => {
insert(topContainer, () => <CopyButton code={code} position="top" />)
disposers.push(dispose)
}, owner)
createRoot((dispose) => {
insert(bottomContainer, () => <CopyButton code={code} position="bottom" />)
disposers.push(dispose)
}, owner)
})
})
onCleanup(() => {
disposers.forEach((d) => {
d()
})
})
return (
<div>
<div ref={contentRef} innerHTML={getHTML()} />
</div>
)
}