diff --git a/easyflow-ui-admin/app/src/components/chat/chat.vue b/easyflow-ui-admin/app/src/components/chat/chat.vue
index 6ab8e74b..a8dca141 100644
--- a/easyflow-ui-admin/app/src/components/chat/chat.vue
+++ b/easyflow-ui-admin/app/src/components/chat/chat.vue
@@ -578,6 +578,9 @@ watch(
{ flush: 'post' },
);
onBeforeUnmount(() => {
+ if (sending.value) {
+ stopSse();
+ }
if (bubbleListScrollElement.value) {
bubbleListScrollElement.value.removeEventListener(
'scroll',
diff --git a/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue b/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue
index 8944942f..6b8ec329 100644
--- a/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue
+++ b/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue
@@ -1,5 +1,5 @@
diff --git a/easyflow-ui-usercenter/packages/effects/layouts/src/widgets/check-updates/check-updates.vue b/easyflow-ui-usercenter/packages/effects/layouts/src/widgets/check-updates/check-updates.vue
index 939e2682..c893e2b8 100644
--- a/easyflow-ui-usercenter/packages/effects/layouts/src/widgets/check-updates/check-updates.vue
+++ b/easyflow-ui-usercenter/packages/effects/layouts/src/widgets/check-updates/check-updates.vue
@@ -20,6 +20,8 @@ const props = withDefaults(defineProps(), {
});
let isCheckingUpdates = false;
+let versionCheckController: AbortController | null = null;
+const VERSION_CHECK_TIMEOUT_MS = 10_000;
const currentVersionTag = ref('');
const lastVersionTag = ref('');
const timer = ref>();
@@ -36,6 +38,12 @@ const [UpdateNoticeModal, modalApi] = useEasyFlowModal({
});
async function getVersionTag() {
+ const controller = new AbortController();
+ versionCheckController = controller;
+ const timeout = setTimeout(
+ () => controller.abort(),
+ VERSION_CHECK_TIMEOUT_MS,
+ );
try {
if (
location.hostname === 'localhost' ||
@@ -47,14 +55,22 @@ async function getVersionTag() {
cache: 'no-cache',
method: 'HEAD',
redirect: 'manual',
+ signal: controller.signal,
});
return (
response.headers.get('etag') || response.headers.get('last-modified')
);
- } catch {
- console.error('Failed to fetch version tag');
+ } catch (error) {
+ if (!controller.signal.aborted) {
+ console.error('Failed to fetch version tag', error);
+ }
return null;
+ } finally {
+ clearTimeout(timeout);
+ if (versionCheckController === controller) {
+ versionCheckController = null;
+ }
}
}
@@ -71,23 +87,35 @@ async function checkForUpdates() {
}
if (lastVersionTag.value !== versionTag && versionTag) {
- clearInterval(timer.value);
+ stop();
handleNotice(versionTag);
}
}
+
+async function runUpdateCheck() {
+ if (isCheckingUpdates) return;
+ isCheckingUpdates = true;
+ try {
+ await checkForUpdates();
+ } finally {
+ isCheckingUpdates = false;
+ }
+}
+
function handleNotice(versionTag: string) {
currentVersionTag.value = versionTag;
modalApi.open();
}
function start() {
+ stop();
if (props.checkUpdatesInterval <= 0) {
return;
}
// 每 checkUpdatesInterval(默认值为1) 分钟检查一次
timer.value = setInterval(
- checkForUpdates,
+ () => void runUpdateCheck(),
props.checkUpdatesInterval * 60 * 1000,
);
}
@@ -96,18 +124,21 @@ function handleVisibilitychange() {
if (document.hidden) {
stop();
} else {
- if (!isCheckingUpdates) {
- isCheckingUpdates = true;
- checkForUpdates().finally(() => {
- isCheckingUpdates = false;
+ runUpdateCheck().finally(() => {
+ if (!document.hidden) {
start();
- });
- }
+ }
+ });
}
}
function stop() {
- clearInterval(timer.value);
+ if (timer.value !== undefined) {
+ clearInterval(timer.value);
+ timer.value = undefined;
+ }
+ versionCheckController?.abort();
+ versionCheckController = null;
}
onMounted(() => {