Commit a564e5ad authored by nick zheng's avatar nick zheng

chore: 移动端应用提问中离开页面打断后再次进入支持重新生成

parent 0572c27c
......@@ -167,6 +167,7 @@ common_module:
upload_image_size_error_message: 'The size of the uploaded image cannot exceed 5 MB'
upload_image_format_error_message: 'Only png, jpg, jpeg, webp format images can be uploaded, please upload again'
do_not_exit_page: 'Do not leave the page during the generation to avoid interrupting the conversation'
content_interrupted: 'Content generation is interrupted. Whether to regenerate it'
data_table_module:
action: 'Controls'
......
......@@ -166,6 +166,7 @@ common_module:
upload_image_size_error_message: '上传图片大小不能超过5M'
upload_image_format_error_message: '只能上传png、jpg、jpeg、webp格式图片,请重新上传'
do_not_exit_page: '生成期间请勿离开页面,以免中断对话流程'
content_interrupted: '内容生成被中断,是否重新生成'
data_table_module:
action: '操作'
......
......@@ -166,6 +166,7 @@ common_module:
upload_image_size_error_message: '上傳圖片大小不能超過5M'
upload_image_format_error_message: '只能上傳png、jpg、jpeg、webp格式圖片,請重新上傳'
do_not_exit_page: '生成期間請勿離開頁面,以免中斷對話流程'
content_interrupted: '內容生成被中斷,是否重新生成'
data_table_module:
action: '操作'
......
......@@ -54,12 +54,11 @@ const userStore = useUserStore()
const { uploadFileList, handleLimitUpload, handleUpload, handleRemoveFile } = useDialogueFile()
const { uploadImageList, handleLimitUploadImage, handleUploadImage, handleRemoveUploadImage } = useUploadImage()
const isAnswerResponseLoading = defineModel<boolean>('isAnswerResponseLoading', { required: true })
const isAnswerResponseWait = defineModel<boolean>('isAnswerResponseLoading', { required: true })
const emitter = inject<Emitter<MittEvents>>('emitter')
const inputMessageContent = ref('')
const isAnswerResponseWait = ref(false)
const currentReplyContentSentenceExtractIndex = ref(0)
const sentenceFragmentSerialNo = ref(0)
const sentenceExtractCheckEnabled = ref(false)
......@@ -154,12 +153,16 @@ function handleInputMessageEnter(event: KeyboardEvent) {
}
}
function handleMessageSend() {
function handleMessageSend(lastQuestionContent?: string) {
if (!isLogin.value) {
window.$message.warning(t('common_module.not_login_text'))
return
}
if (lastQuestionContent) {
inputMessageContent.value = lastQuestionContent
}
if (!inputMessageContent.value.trim() || isInputMessageDisabled.value) {
return
}
......@@ -198,7 +201,6 @@ function handleMessageSend() {
let replyTextContent = ''
let reasoningContent = ''
isAnswerResponseLoading.value = true
isAnswerResponseWait.value = true
currentReplyContentSentenceExtractIndex.value = 0
sentenceFragmentSerialNo.value = 0
......@@ -272,7 +274,6 @@ function handleMessageSend() {
isAnswerResponseLoading: false,
})
isAnswerResponseLoading.value = false
isCreateContinueQuestions.value && emit('createContinueQuestions', replyTextContent)
emit('updatePageScroll')
isAnswerResponseWait.value = false
......@@ -441,6 +442,7 @@ function ttsSocketSendText(text: string, audioUrlSerialNo: number, messageId: st
defineExpose({
blockMessageResponse,
errorMessageResponse,
handleMessageSend,
})
</script>
......@@ -545,7 +547,7 @@ defineExpose({
? 'opacity-60'
: 'cursor-pointer'
"
@click="handleMessageSend"
@click="handleMessageSend()"
/>
<div v-show="!isLogin" class="absolute left-3 top-[5px] flex h-[30px] items-center text-[#84868c]">
......
......@@ -15,6 +15,7 @@ interface Props {
continuousQuestionList: string[]
isAnswerResponseLoading: boolean
createContinueQuestionsException: boolean
lastQuestionContent?: string
}
const props = defineProps<Props>()
......@@ -37,7 +38,8 @@ const isShowContinueQuestion = computed(() => {
props.continuousQuestionStatus === 'default' &&
props.messageList.size > 1 &&
!props.isAnswerResponseLoading &&
!props.createContinueQuestionsException
!props.createContinueQuestionsException &&
!props.lastQuestionContent
)
})
......
......@@ -34,6 +34,24 @@ const { isMobile } = useLayoutConfig()
useEventListener(document, 'visibilitychange', () => {
if (document.visibilityState === 'hidden') {
handleExitPage()
handleAudioPause()
} else if (document.visibilityState === 'visible' && lastQuestionContent.value) {
window.$dialog.warning({
title: t('share_agent_module.create_agent_dialogue_title'),
content: t('common_module.dialogue_module.content_interrupted'),
negativeText: t('common_module.cancel_btn_text'),
positiveText: t('common_module.confirm_btn_text'),
onPositiveClick() {
footerInputRef.value?.handleMessageSend(lastQuestionContent.value)
lastQuestionContent.value = ''
},
onNegativeClick() {
lastQuestionContent.value = ''
},
onAfterLeave() {
lastQuestionContent.value = ''
},
})
}
})
......@@ -58,6 +76,7 @@ const currentSoundCtl = shallowRef<Howl | null>(null)
const isSoundCtlCreated = ref(false)
const isAnswerResponseLoading = ref(false)
const createContinueQuestionsException = ref(false)
const lastQuestionContent = ref('') // 上一次提问内容
const isEnableDocumentParse = computed(() => {
return agentApplicationConfig.value.knowledgeConfig.isDocumentParsing === 'Y'
......@@ -325,7 +344,14 @@ function handleInitSoundPlay() {
// 退出页面中断对话
function handleExitPage() {
footerInputRef.value?.errorMessageResponse()
if (messageList.value.size > 0 && isAnswerResponseLoading.value) {
const messageListArr = Array.from(messageList.value.values())
if (messageListArr.length >= 2) {
lastQuestionContent.value = messageListArr[messageListArr.length - 2]?.textContent || ''
}
footerInputRef.value?.errorMessageResponse()
}
}
</script>
......@@ -362,6 +388,7 @@ function handleExitPage() {
:continuous-question-list="continueQuestionList"
:is-answer-response-loading="isAnswerResponseLoading"
:create-continue-questions-exception="createContinueQuestionsException"
:last-question-content="lastQuestionContent"
@audio-play="handleAudioPlay"
@audio-pause="handleAudioPause"
/>
......
......@@ -166,6 +166,7 @@ declare namespace I18n {
upload_image_size_error_message: string
upload_image_format_error_message: string
do_not_exit_page: string
content_interrupted: string
}
data_table_module: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment