diff --git a/src/pages/exhibit/detail.vue b/src/pages/exhibit/detail.vue index 7f25712..24d1f96 100644 --- a/src/pages/exhibit/detail.vue +++ b/src/pages/exhibit/detail.vue @@ -164,6 +164,7 @@ import { } from '@/utils/placeholders' import { isEmbeddedInWechatMiniProgram } from '@/utils/hostEnvironment' import { normalizeGuideAudioLanguage } from '@/data/adapters/guideStopInfoAdapter' +import { explainGuideStopListUrl } from '@/utils/explainNavigation' const defaultDetail: ExplainDetailPageViewModel = { id: '', @@ -871,23 +872,53 @@ const handleNavigate = async () => { }) } -const fallbackToExplainHome = () => { +type ExplainDetailPageStackEntry = { + route?: string +} + +const decodeRouteParam = (value: string) => { + let decoded = value + // Hash route parameters can accumulate extra encoding layers across H5 transitions. + for (let index = 0; index < 8; index += 1) { + try { + const next = decodeURIComponent(decoded) + if (next === decoded) break + decoded = next + } catch { + break + } + } + + return decoded +} + +const fallbackToExplainObjectList = () => { + const hallId = detailEntryRequest.value?.hallId || exhibit.value.hallId + const hallName = decodeRouteParam(detailEntryRequest.value?.hallName || exhibit.value.hallName || '讲解') + const url = hallId + ? explainGuideStopListUrl(hallId, hallName) + : '/pages/explain/list' + uni.redirectTo({ - url: '/pages/index/index?tab=explain', + url, fail: () => { - uni.reLaunch({ - url: '/pages/index/index?tab=explain' - }) + uni.reLaunch({ url }) } }) } -const handleBack = () => { - uni.navigateBack({ - delta: 1, - fail: fallbackToExplainHome - }) +const returnToExplainObjectList = () => { + const pages = getCurrentPages() + const previousPage = pages[pages.length - 2] as ExplainDetailPageStackEntry | undefined + if (previousPage?.route === 'pages/explain/guide-stop-list') { + uni.navigateBack({ delta: 1, fail: fallbackToExplainObjectList }) + return + } + + fallbackToExplainObjectList() } + +const handleBack = returnToExplainObjectList