Skip to content

Commit 2dbf61e

Browse files
authored
Merge pull request #400 from iceljc/features/refine-chat-window
Features/refine chat window
2 parents 5f1e85c + 1dd7543 commit 2dbf61e

File tree

34 files changed

+493
-256
lines changed

34 files changed

+493
-256
lines changed

src/lib/common/LoadingToComplete.svelte

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,20 @@
55
export let isLoading = false;
66
export let isComplete = false;
77
export let isError = false;
8+
export let spinnerClasses = '';
9+
export let spinnerStyles = '';
10+
export let spinnerSize = 50;
811
912
export let successText = 'Update completed!';
1013
export let errorText = 'Error!';
11-
export let spinnerSize = 50;
1214
</script>
1315

1416
{#if isLoading}
15-
<Loader size={spinnerSize} />
17+
<Loader
18+
size={spinnerSize}
19+
containerClasses={spinnerClasses}
20+
containerStyles={spinnerStyles}
21+
/>
1622
{/if}
1723

1824

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<script>
2+
import { onMount, onDestroy } from 'svelte';
3+
import { globalErrorStore, loaderStore } from '$lib/helpers/store';
4+
5+
/** @type {boolean} */
6+
export let isLoading = false;
7+
export let hasError = false;
8+
9+
/** @type {any} */
10+
let loaderUnsubscriber;
11+
/** @type {any} */
12+
let errorUnsubscriber;
13+
14+
onMount(() => {
15+
window?.speechSynthesis?.cancel();
16+
loaderUnsubscriber = loaderStore.subscribe(value => {
17+
isLoading = value;
18+
});
19+
20+
errorUnsubscriber = globalErrorStore.subscribe(value => {
21+
hasError = value;
22+
});
23+
});
24+
25+
onDestroy(() => {
26+
loaderUnsubscriber?.();
27+
errorUnsubscriber?.();
28+
});
29+
</script>

src/lib/helpers/http.js

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const retryQueue = {
3131
/** @param {{config: import('axios').InternalAxiosRequestConfig, resolve: (value: any) => void, reject: (reason?: any) => void}} item */
3232
enqueue(item) {
3333
this.queue.push(item);
34-
34+
console.log('queue', this.queue.length);
3535
if (!this.isRefreshingToken) {
3636
const user = getUserStore();
3737
if (!isTokenExired(user.expires)) {
@@ -130,7 +130,7 @@ axios.interceptors.response.use(
130130
loaderStore.set(false);
131131
const originalRequest = error?.config || {};
132132
const user = getUserStore();
133-
console.log("renew token count.", user.renew_token_count);
133+
134134
if (!user?.token || user.renew_token_count >= retryQueue.maxRenewTokenCount) {
135135
retryQueue.queue = [];
136136
redirectToLogin();
@@ -185,7 +185,7 @@ function skipLoader(config) {
185185
new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/create', 'g'),
186186
new RegExp('http(s*)://(.*?)/knowledge/document/(.*?)/page', 'g'),
187187
new RegExp('http(s*)://(.*?)/users', 'g'),
188-
new RegExp('http(s*)://(.*?)/instruct/chat-completion', 'g'),
188+
new RegExp('http(s*)://(.*?)/instruct/(.*?)', 'g'),
189189
new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'),
190190
new RegExp('http(s*)://(.*?)/agent/(.*?)/code-script/generate', 'g'),
191191
new RegExp('http(s*)://(.*?)/renew-token', 'g')
@@ -208,24 +208,30 @@ function skipLoader(config) {
208208

209209
/** @type {RegExp[]} */
210210
const getRegexes = [
211+
new RegExp('http(s*)://(.*?)/plugin/menu', 'g'),
211212
new RegExp('http(s*)://(.*?)/setting/(.*?)', 'g'),
213+
new RegExp('http(s*)://(.*?)/roles', 'g'),
214+
new RegExp('http(s*)://(.*?)/role/options', 'g'),
215+
new RegExp('http(s*)://(.*?)/role/(.*?)/details', 'g'),
216+
new RegExp('http(s*)://(.*?)/user/(.*?)/details', 'g'),
212217
new RegExp('http(s*)://(.*?)/user/me', 'g'),
213-
new RegExp('http(s*)://(.*?)/plugin/menu', 'g'),
214218
new RegExp('http(s*)://(.*?)/address/options(.*?)', 'g'),
219+
new RegExp('http(s*)://(.*?)/agents', 'g'),
220+
new RegExp('http(s*)://(.*?)/agent/options', 'g'),
221+
new RegExp('http(s*)://(.*?)/agent/labels', 'g'),
222+
new RegExp('http(s*)://(.*?)/agent/tasks', 'g'),
223+
new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'),
224+
new RegExp('http(s*)://(.*?)/conversation/state/keys', 'g'),
215225
new RegExp('http(s*)://(.*?)/conversation/(.*?)/files/(.*?)', 'g'),
226+
new RegExp('http(s*)://(.*?)/llm-configs', 'g'),
216227
new RegExp('http(s*)://(.*?)/llm-provider/(.*?)/models', 'g'),
217228
new RegExp('http(s*)://(.*?)/knowledge/vector/collections', 'g'),
218229
new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/exist', 'g'),
219-
new RegExp('http(s*)://(.*?)/role/options', 'g'),
220-
new RegExp('http(s*)://(.*?)/role/(.*?)/details', 'g'),
221-
new RegExp('http(s*)://(.*?)/user/(.*?)/details', 'g'),
222-
new RegExp('http(s*)://(.*?)/agent/labels', 'g'),
223-
new RegExp('http(s*)://(.*?)/conversation/state/keys', 'g'),
230+
new RegExp('http(s*)://(.*?)/logger/instruction/log', 'g'),
224231
new RegExp('http(s*)://(.*?)/logger/instruction/log/keys', 'g'),
225232
new RegExp('http(s*)://(.*?)/logger/conversation/(.*?)/content-log', 'g'),
226233
new RegExp('http(s*)://(.*?)/logger/conversation/(.*?)/state-log', 'g'),
227-
new RegExp('http(s*)://(.*?)/mcp/server-configs', 'g'),
228-
new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g')
234+
new RegExp('http(s*)://(.*?)/mcp/server-configs', 'g')
229235
];
230236

231237
if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) {
@@ -276,7 +282,9 @@ function skipGlobalError(config) {
276282
];
277283

278284
/** @type {RegExp[]} */
279-
const getRegexes = [];
285+
const getRegexes = [
286+
new RegExp('http(s*)://(.*?)/agents', 'g')
287+
];
280288

281289
if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) {
282290
return true;

src/lib/helpers/utils/common.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,19 @@ export function getPagingQueryParams(args, defaults = { defaultPageSize: 12, max
120120
/**
121121
* @param {URL} url
122122
* @param {import('$commonTypes').KeyValuePair[]} pairs
123-
* @param {() => void} [callback]
123+
* @param {(args0: URL) => void} [callback]
124124
*/
125125
export function setUrlQueryParams(url, pairs, callback) {
126126
if (!pairs?.length) {
127127
return;
128128
}
129129

130+
url.search = '';
130131
pairs?.map(p => {
131132
url.searchParams.set(p.key, p.value);
132133
});
133134

134-
callback?.();
135+
callback?.(url);
135136
}
136137

137138
/**
@@ -175,6 +176,19 @@ export function splitTextByCase(str) {
175176
return text;
176177
}
177178

179+
/**
180+
* @param {string} url
181+
*/
182+
export function getCleanUrl(url) {
183+
if (!url) return url;
184+
185+
if (url.startsWith('/')) {
186+
url = url.substring(1);
187+
}
188+
189+
return url;
190+
}
191+
178192
/**
179193
* @param {string} timeRange
180194
* @returns {{ startTime: string | null, endTime: string | null }}

src/lib/scss/custom/common/_common.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,17 @@ button:focus {
204204
text-overflow: ellipsis;
205205
}
206206
}
207+
208+
.text-btn {
209+
background: none;
210+
border: none;
211+
padding: 0;
212+
color: inherit;
213+
font-weight: 500;
214+
cursor: pointer;
215+
216+
&:hover {
217+
text-decoration: none;
218+
background: none;
219+
}
220+
}

src/lib/scss/custom/components/_loader.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.loader {
2-
position: fixed;
2+
position: absolute;
33
z-index: 9999;
44
background-color: rgba(255, 255, 255, 0.8);
55
top: 0;

src/lib/scss/custom/pages/_agent.scss

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,37 @@
11
.agents-header-container {
22
display: flex;
3+
flex-wrap: wrap;
34
justify-content: space-between;
5+
gap: 15px;
6+
align-items: center;
7+
8+
@media (max-width: 576px) {
9+
flex-direction: column;
10+
justify-content: center;
11+
gap: 12px;
12+
13+
> div {
14+
width: 100%;
15+
display: flex;
16+
justify-content: center;
17+
}
18+
}
419

520
.agent-filter {
621
display: flex;
7-
gap: 10px
22+
flex-wrap: wrap;
23+
gap: 10px;
24+
align-items: center;
25+
26+
@media (max-width: 576px) {
27+
width: 100%;
28+
flex-direction: column;
29+
gap: 8px;
30+
31+
> * {
32+
width: 100%;
33+
}
34+
}
835
}
936
}
1037

src/lib/services/agent-service.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ export async function getSettings() {
1616
* Get agent list
1717
* @param {import('$agentTypes').AgentFilter} filter
1818
* @param {boolean} checkAuth
19+
* @param {AbortSignal | null} signal
1920
* @returns {Promise<import('$commonTypes').PagedItems<import('$agentTypes').AgentModel>>}
2021
*/
21-
export async function getAgents(filter, checkAuth = false) {
22+
export async function getAgents(filter, checkAuth = false, signal = null) {
2223
let url = endpoints.agentListUrl;
2324
const response = await axios.get(url, {
2425
params: {
@@ -28,7 +29,8 @@ export async function getAgents(filter, checkAuth = false) {
2829
paramsSerializer: {
2930
dots: true,
3031
indexes: null,
31-
}
32+
},
33+
signal: signal || undefined
3234
});
3335
return response.data;
3436
}

src/lib/services/role-service.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { endpoints } from './api-endpoints.js';
22
import axios from 'axios';
3+
import qs from 'qs';
34

45
/**
56
* Get role options
@@ -17,7 +18,10 @@ export async function getRoleOptions() {
1718
* @returns {Promise<import('$roleTypes').RoleModel[]>}
1819
*/
1920
export async function getRoles(filter = null) {
20-
const response = await axios.post(endpoints.rolesUrl, filter);
21+
const response = await axios.get(endpoints.rolesUrl, {
22+
params: filter,
23+
paramsSerializer: (params) => qs.stringify(params, { encode: false, allowDots: true, arrayFormat: "indices" })
24+
});
2125
return response.data;
2226
}
2327

src/routes/+layout.svelte

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,15 @@
11
<script>
22
import { addMessages, init, getLocaleFromNavigator } from 'svelte-i18n';
33
import en from '$lib/langs/en.json';
4-
import '$lib/helpers/http';
5-
import { onDestroy, onMount } from 'svelte';
6-
import { globalErrorStore, loaderStore } from '$lib/helpers/store';
7-
import Loader from '$lib/common/Loader.svelte';
8-
import LoadingToComplete from '$lib/common/LoadingToComplete.svelte';
94
105
addMessages('en', en);
116
127
init({
138
fallbackLocale: 'en',
149
initialLocale: getLocaleFromNavigator()
1510
});
16-
17-
/** @type {boolean} */
18-
let isLoading = false;
19-
let hasError = false;
20-
21-
/** @type {any} */
22-
let loaderUnsubscriber;
23-
/** @type {any} */
24-
let errorUnsubscriber;
25-
26-
onMount(() => {
27-
window?.speechSynthesis?.cancel();
28-
loaderUnsubscriber = loaderStore.subscribe(value => {
29-
isLoading = value;
30-
});
31-
32-
errorUnsubscriber = globalErrorStore.subscribe(value => {
33-
hasError = value;
34-
});
35-
})
36-
37-
onDestroy(() => {
38-
loaderUnsubscriber?.();
39-
errorUnsubscriber?.();
40-
});
4111
</script>
4212

43-
{#if isLoading}
44-
<Loader size={50}/>
45-
{/if}
46-
47-
<LoadingToComplete isError={hasError} />
48-
4913
<slot />
5014

5115
<style lang="scss">

0 commit comments

Comments
 (0)