0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-08 17:53:55 +08:00
discourse/plugins/chat/lib/onebox/templates/discourse_chat_thread.mustache
Régis Hanol ce2767cf38
FIX: Chat channel onebox icons render and support channel emoji (#39826)
Chat channel oneboxes have been rendering with no icon next to the
channel title since #20744. That PR changed the mustache templates to
emit `<svg><use href="#d-chat"></use></svg>` and registered a JS-side
`replaceIcon("d-chat", "comment")` to compensate. The replacement only
runs through `iconHTML()` / `{{icon}}` at render time though — the
mustache markup is cooked into the post HTML server-side, so the JS swap
never touches it. `d-chat` has never been part of the SVG sprite, which
means the browser cannot resolve `#d-chat` and the badge renders empty.

This commit pre-renders the channel badge in `Chat::OneboxHandler` and
passes it to the templates as a single HTML blob:

* When the channel has an emoji, it is rendered via
`Emoji.codes_to_img`.
* Otherwise we fall back to the chat bubble (`#comment`, which is in the
sprite) tinted with the channel's category color.

The fix covers all three onebox templates (channel, message, thread). A
post-deploy migration flips `baked_version` to 0 on every post whose
cooked HTML contains `chat-onebox`, so the recurring `Post.rebake_old`
job picks them up and rebakes them in the background with the fixed
templates.

Ref - t/183234
2026-05-11 15:17:36 +02:00

29 lines
1.1 KiB
Text
Vendored

<aside class="onebox chat-onebox">
<article class="onebox-body chat-onebox-body">
<div class="chat-transcript-user">
<h3 class="chat-onebox-title">
<a href="/chat/c/-/{{channel_id}}/t/{{thread_id}}">
<span class="category-chat-badge" style="color: #{{color}}">
<svg class="fa d-icon d-icon-discourse-threads svg-icon svg-string" xmlns="http://www.w3.org/2000/svg"><use href="#discourse-threads"></use></svg>
</span>
<span class="clear-badge">{{thread_title}}</span>
</a>
</h3>
<span class="thread-title-connector">{{thread_title_connector}}</span>
<a href="/chat/c/-/{{channel_id}}">
{{{channel_badge}}}
<span class="clear-badge">{{channel_name}}</span>
</a>
</div>
{{#cooked}}
<div class="chat-onebox-cooked">
{{{cooked}}}
</div>
{{/cooked}}
<div class="chat-onebox-images onebox">
{{#images}}
<img src="{{url}}" loading="lazy" alt="{{original_filename}}" width="{{width}}" height="{{height}}">
{{/images}}
</div>
</article>
</aside>