mirror of
https://github.com/kuaifan/dootask.git
synced 2026-06-25 16:52:20 +00:00
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:
parent
7453b79c8d
commit
8e591503dd
@ -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+回车换行,上下键切换历史
|
||||
* 注意:输入法组合输入时(如中文候选字)不发送
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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]);
|
||||
},
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user