Skip to content

Commit e6bfc8c

Browse files
authored
Merge pull request #378 from iceljc/features/refine-chat-window
refine js interpreter styles
2 parents 20d5492 + 83a3fe8 commit e6bfc8c

File tree

2 files changed

+47
-13
lines changed

2 files changed

+47
-13
lines changed

src/routes/chat/[agentId]/[conversationId]/rich-content/rc-js-interpreter.svelte

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44
import 'overlayscrollbars/overlayscrollbars.css';
55
import { OverlayScrollbars } from 'overlayscrollbars';
66
import { v4 as uuidv4 } from 'uuid';
7+
import LoadingDots from "$lib/common/LoadingDots.svelte";
78
89
/** @type {import('$conversationTypes').ChatResponseModel?} */
910
export let message;
1011
12+
/** @type {string} */
13+
export let containerClasses = '';
14+
15+
/** @type {string} */
16+
export let containerStyles = '';
17+
1118
/** @type {boolean} */
1219
export let scrollable = false;
1320
@@ -24,6 +31,9 @@
2431
}
2532
};
2633
34+
/** @type {boolean} */
35+
let isLoading = false;
36+
2737
onMount(() => {
2838
if (scrollable) {
2939
initScrollbar();
@@ -46,24 +56,43 @@
4656
const parsedText = marked.lexer(text);
4757
// @ts-ignore
4858
const codeText = parsedText.filter(x => !!x.text).map(x => x.text).join('');
49-
loadScript(codeText);
59+
isLoading = true;
60+
loadScript(codeText).finally(() => {
61+
isLoading = false;
62+
});
5063
} catch (error) {
5164
console.error('Error parsing js code:', error);
5265
}
5366
}
5467
55-
/** @param {string} codeText */
68+
/**
69+
* @param {string} codeText
70+
* @returns {Promise<boolean>}
71+
*/
5672
function loadScript(codeText) {
57-
const code = codeText.replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gi, '$1');
58-
const scriptTags = [...codeText.matchAll(/<script\s+[^>]*src\s*=\s*["']([^"']+)["'][^>]*>/gi)];
59-
const matchedSrcs = scriptTags.filter(x => !!x[1]).map(x => x[1]);
73+
return new Promise((resolve, reject) => {
74+
const code = codeText.replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gi, '$1');
75+
const scriptTags = [...codeText.matchAll(/<script\s+[^>]*src\s*=\s*["']([^"']+)["'][^>]*>/gi)];
76+
const matchedSrcs = scriptTags.filter(x => !!x[1]).map(x => x[1]);
6077
61-
if (matchedSrcs.length > 0) {
62-
const promises = matchedSrcs.map(x => loadScriptSrc(x));
63-
Promise.all(promises).then(() => setTimeout(() => eval(code), 0));
64-
} else {
65-
setTimeout(() => eval(code), 0);
66-
}
78+
if (matchedSrcs.length > 0) {
79+
const promises = matchedSrcs.map(x => loadScriptSrc(x));
80+
Promise.all(promises).then(() => {
81+
setTimeout(() => {
82+
eval(code);
83+
resolve(true);
84+
}, 0);
85+
}).catch(() => {
86+
reject(false);
87+
});
88+
} else {
89+
setTimeout(() => {
90+
eval(code);
91+
resolve(true);
92+
}, 0);
93+
}
94+
});
95+
6796
}
6897
6998
/** @param {string} src */
@@ -95,10 +124,15 @@
95124
}
96125
</script>
97126
98-
<div>
127+
<div class={`${containerClasses}`} style={`${containerStyles}`}>
99128
{#if message?.text}
100129
<div class="mb-3">{message.text}</div>
101130
{/if}
131+
{#if isLoading}
132+
<div class="mb-3">
133+
<LoadingDots duration={'1s'} size={5} gap={3} color={'var(--bs-primary)'} />
134+
</div>
135+
{/if}
102136
<div id={`${scrollbarId}`}>
103137
<div id={`chart-${message?.message_id}`} style="min-width: 800px; max-height: 500px;"></div>
104138
</div>

src/routes/page/conversation/[conversationId]/conv-dialog-element.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
>
2323
{#if dialog?.rich_content?.message?.rich_type === RichType.ProgramCode
2424
&& dialog?.rich_content?.message?.language === 'javascript'}
25-
<RcJsInterpreter message={dialog} scrollable />
25+
<RcJsInterpreter message={dialog} scrollable containerStyles={'color: var(--bs-primary);'} />
2626
{:else}
2727
<Markdown
2828
containerClasses={'dialog-item-text'}

0 commit comments

Comments
 (0)