|
106 | 106 | let notificationText = ''; |
107 | 107 | let successText = "Done"; |
108 | 108 | let errorText = "Error"; |
| 109 | + let note = ''; |
109 | 110 |
|
110 | 111 | /** @type {number} */ |
111 | 112 | let messageInputTimeout; |
|
193 | 194 | let isDisplayNotification = false; |
194 | 195 | let isComplete = false; |
195 | 196 | let isError = false; |
| 197 | + let clickCopy = false; |
196 | 198 | |
197 | 199 | $: { |
198 | 200 | // const editor = lastBotMsg?.rich_content?.editor || ''; |
|
1169 | 1171 | sendChatMessage(text, data); |
1170 | 1172 | } |
1171 | 1173 |
|
| 1174 | + /** |
| 1175 | + * @param {any} e |
| 1176 | + * @param {any} message |
| 1177 | + */ |
| 1178 | + function copyMessage(e, message) { |
| 1179 | + e.preventDefault(); |
| 1180 | +
|
| 1181 | + const elem = document.getElementById(`message-note-${message.message_id}`); |
| 1182 | + if (!elem) return; |
| 1183 | +
|
| 1184 | + const text = message?.rich_content?.message?.text || message?.text || ''; |
| 1185 | + elem.classList.remove('hide'); |
| 1186 | + |
| 1187 | + navigator.clipboard.writeText(text).then(() => { |
| 1188 | + elem.textContent = 'Copied!'; |
| 1189 | + }).catch(() => { |
| 1190 | + elem.textContent = 'Error!'; |
| 1191 | + }).finally(() => { |
| 1192 | + clickCopy = false; |
| 1193 | + setTimeout(() => { |
| 1194 | + elem.classList.add('hide'); |
| 1195 | + }, 800); |
| 1196 | + }); |
| 1197 | + } |
| 1198 | +
|
1172 | 1199 | function toggleNotificationModal() { |
1173 | 1200 | isDisplayNotification = !isDisplayNotification; |
1174 | 1201 | if (!isDisplayNotification) { |
|
1636 | 1663 | <div class="msg-container"> |
1637 | 1664 | <RcMessage containerClasses={'bot-msg'} markdownClasses={'markdown-dark text-dark'} message={message} /> |
1638 | 1665 | {#if message?.message_id === lastBotMsg?.message_id && message?.uuid === lastBotMsg?.uuid} |
1639 | | - <div style="display: flex; gap: 10px;"> |
| 1666 | + <div style="display: flex; gap: 10px; flex-wrap: wrap;"> |
1640 | 1667 | {#if PUBLIC_LIVECHAT_SPEAKER_ENABLED === 'true'} |
1641 | 1668 | <AudioSpeaker |
1642 | 1669 | id={message?.message_id} |
|
1675 | 1702 | </div> |
1676 | 1703 | </div> |
1677 | 1704 | {/if} |
| 1705 | + <div class="line-align-center" style="font-size: 17px;"> |
| 1706 | + <!-- svelte-ignore a11y-click-events-have-key-events --> |
| 1707 | + <!-- svelte-ignore a11y-no-static-element-interactions --> |
| 1708 | + <div |
| 1709 | + class="clickable" |
| 1710 | + style="height: 85%;" |
| 1711 | + data-bs-toggle="tooltip" |
| 1712 | + data-bs-placement="top" |
| 1713 | + title="Copy" |
| 1714 | + on:mouseup={e => copyMessage(e, message)} |
| 1715 | + on:mousedown={() => clickCopy = true} |
| 1716 | + > |
| 1717 | + {#if clickCopy} |
| 1718 | + <i class="bx bxs-copy text-primary" /> |
| 1719 | + {:else} |
| 1720 | + <i class="bx bx-copy text-primary" /> |
| 1721 | + {/if} |
| 1722 | + </div> |
| 1723 | + </div> |
| 1724 | + <div |
| 1725 | + class="line-align-center text-primary hide" |
| 1726 | + style={'font-size: 0.8em;'} |
| 1727 | + id={`message-note-${message.message_id}`} |
| 1728 | + > |
| 1729 | + </div> |
1678 | 1730 | </div> |
1679 | 1731 | {/if} |
1680 | 1732 | {#if !!message.is_chat_message || !!message.has_message_files} |
|
0 commit comments