feat(ai-assistant): 统一 AI 回复内链接导航时的浮窗策略

- 移动端:点任意 in-app 链接(task/project/file/contact/message/深链)一律关闭浮窗,避免全屏遮挡目标
- 桌面端:一律保留浮窗以便继续对话;若处于全屏则退出全屏让目标露出
- modal 模式:点链接一律关闭(居中弹窗会挡住目标)
- 策略集中到 AssistantModal.prepareForNavigate,DialogMarkdown 各链接类型统一调用 beforeNavigate

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
kuaifan 2026-06-18 11:10:13 +00:00
parent 7453b79c8d
commit 8e591503dd
3 changed files with 38 additions and 5 deletions

View File

@ -1,5 +1,6 @@
<template>
<AssistantModal
ref="assistantModal"
v-model="showModal"
:displayMode="displayMode"
:shouldCreateNewSession="shouldCreateNewSession"
@ -147,7 +148,7 @@
v-if="response.rawOutput"
class="ai-assistant-output-markdown no-dark-content"
:text="response.displayOutput || response.rawOutput"
:before-navigate="() => { showModal = false }"/>
:before-navigate="onMarkdownNavigate"/>
<div v-else class="ai-assistant-output-placeholder">
{{ response.status === 'error' ? (response.error || $L('发送失败')) : $L('等待 AI 回复...') }}
</div>
@ -689,6 +690,18 @@ export default {
}
},
/**
* 点击 AI 回复内链接导航前的处理策略委托给 AssistantModal.prepareForNavigate
*/
onMarkdownNavigate() {
const modal = this.$refs.assistantModal;
if (modal && typeof modal.prepareForNavigate === 'function') {
modal.prepareForNavigate();
} else {
this.showModal = false;
}
},
/**
* 输入框键盘事件回车发送Shift+回车换行上下键切换历史
* 注意输入法组合输入时如中文候选字不发送

View File

@ -576,6 +576,25 @@ export default {
});
},
/**
* 点击 AI 回复内链接导航前的处理统一策略
* - modal 模式一律关闭居中弹窗会挡住目标
* - chat 模式 + 移动端关闭全屏会挡住目标
* - chat 模式 + 桌面端全屏退出全屏保留浮窗以便继续对话
* - chat 模式 + 桌面端非全屏保持打开
*/
prepareForNavigate() {
if (this.displayMode !== 'chat') {
this.$emit('input', false);
return;
}
if (this.isMobile) {
this.$emit('input', false);
} else if (this.isFullscreen) {
this.isFullscreen = false;
}
},
/**
* 关闭直接关闭浮窗不区分显示模式由外部控制 visible 变为 false
*/

View File

@ -125,6 +125,7 @@ export default {
switch (type) {
case 'task':
this.beforeNavigate?.();
this.$store.dispatch('openTask', { id: (numId2 && numId2 > 0) ? numId2 : numId });
break;
@ -149,12 +150,14 @@ export default {
break;
case 'contact':
this.beforeNavigate?.();
this.$store.dispatch('openDialogUserid', numId).catch(({ msg }) => {
$A.modalError(msg);
});
break;
case 'message':
this.beforeNavigate?.();
this.$store.dispatch('openDialog', numId).then(() => {
if (numId2) {
this.$store.state.dialogSearchMsgId = numId2;
@ -175,10 +178,8 @@ export default {
if (!match || !isDeepLinkId(match[1])) {
return;
}
// 便
if (this.$store.state.windowPortrait) {
this.beforeNavigate?.();
}
// beforeNavigate退
this.beforeNavigate?.();
openDeepLink(match[1]);
},