This commit is contained in:
@@ -918,11 +918,9 @@ const loadGuideFloors = async () => {
|
||||
? normalizeGuideFloorId(activeGuideFloor.value)
|
||||
: ''
|
||||
activeGuideFloor.value = floors.find((floor) => floor.id === normalizedActiveFloorId)?.id
|
||||
|| floors.find((floor) => floor.label === '1F')?.id
|
||||
|| floors[0]?.id
|
||||
|| activeGuideFloor.value
|
||||
renderedFloorId.value = activeGuideFloor.value
|
||||
guideModelState.initializeModel(activeGuideFloor.value)
|
||||
} catch (error) {
|
||||
console.error('加载导览楼层失败:', error)
|
||||
guideFloors.value = []
|
||||
@@ -1038,7 +1036,12 @@ const handleAutoSwitch = (event: { from: 'overview' | 'floor'; to: 'overview' |
|
||||
}
|
||||
|
||||
const handleInitialModelReady = (event: { view: GuideIndoorView; floorId?: string; elapsedMs?: number }) => {
|
||||
guideModelState.initializeModel(event.floorId || activeGuideFloor.value)
|
||||
const readyFloorId = event.floorId || activeGuideFloor.value
|
||||
if (event.view === 'overview' && readyFloorId) {
|
||||
activeGuideFloor.value = readyFloorId
|
||||
renderedFloorId.value = readyFloorId
|
||||
guideModelState.initializeModel({ view: event.view, floorId: readyFloorId })
|
||||
}
|
||||
settleLaunchOverlayByModel('ready', event)
|
||||
if (pendingGuideModelResetUntilReady) {
|
||||
const context = pendingGuideModelResetUntilReady
|
||||
@@ -1127,12 +1130,49 @@ const resolveSelectedPoiHall = async (): Promise<MuseumHall | null> => {
|
||||
}) || null
|
||||
}
|
||||
|
||||
const navigateToHallDetail = (hallId: string) => {
|
||||
const navigateToPoiDetail = ({
|
||||
url,
|
||||
floorId,
|
||||
failureMessage
|
||||
}: {
|
||||
url: string
|
||||
floorId: string
|
||||
failureMessage: string
|
||||
}) => {
|
||||
const returnContext = guideModelState.beginPoiDetailReturn(floorId)
|
||||
uni.navigateTo({
|
||||
url: `/pages/hall/detail?id=${encodeURIComponent(hallId)}&tab=explain`
|
||||
url,
|
||||
success: () => {
|
||||
guideModelState.confirmPoiDetailReturn(returnContext.requestId)
|
||||
},
|
||||
fail: () => {
|
||||
guideModelState.cancelPoiDetailReturn(returnContext.requestId)
|
||||
uni.showToast({
|
||||
title: failureMessage,
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const navigateFromSelectedPoiToDetail = (url: string) => {
|
||||
const poi = selectedGuidePoi.value
|
||||
if (!poi) return
|
||||
|
||||
// Detail pages do not own the mounted renderer. The homepage consumes this once on return.
|
||||
navigateToPoiDetail({
|
||||
url,
|
||||
floorId: poi.floorId,
|
||||
failureMessage: '讲解详情打开失败,请重试'
|
||||
})
|
||||
}
|
||||
|
||||
const navigateToHallDetail = (hallId: string) => {
|
||||
navigateFromSelectedPoiToDetail(
|
||||
`/pages/hall/detail?id=${encodeURIComponent(hallId)}&tab=explain`
|
||||
)
|
||||
}
|
||||
|
||||
const handleViewSelectedHall = async () => {
|
||||
const hall = await resolveSelectedPoiHall()
|
||||
if (!hall) {
|
||||
@@ -1166,9 +1206,9 @@ const handleSelectedPoiRelated = async () => {
|
||||
}
|
||||
|
||||
if (firstExhibit?.exhibitId) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/exhibit/detail?id=${encodeURIComponent(firstExhibit.exhibitId)}&tab=explain`
|
||||
})
|
||||
navigateFromSelectedPoiToDetail(
|
||||
`/pages/exhibit/detail?id=${encodeURIComponent(firstExhibit.exhibitId)}&tab=explain`
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1470,7 +1510,7 @@ const resetGuideModelToInitial = async ({
|
||||
floorId: string
|
||||
}) => {
|
||||
const initial = guideModelState.initialState.value
|
||||
guideModelState.invalidatePendingRequests()
|
||||
const resetRequestId = guideModelState.invalidatePendingRequests()
|
||||
searchTargetFocusRequest.value = null
|
||||
searchVisiblePoiIds.value = null
|
||||
homeCategoryModeActive.value = false
|
||||
@@ -1490,7 +1530,6 @@ const resetGuideModelToInitial = async ({
|
||||
guideOutdoorState.value = 'home'
|
||||
indoorView.value = 'floor'
|
||||
activeGuideFloor.value = floorId || initial.defaultActiveFloorId || activeGuideFloor.value
|
||||
renderedFloorId.value = activeGuideFloor.value
|
||||
closeArrivalPanel()
|
||||
await homeSearchPanelRef.value?.resetSearchState?.()
|
||||
closeHomeSearchDock()
|
||||
@@ -1500,12 +1539,15 @@ const resetGuideModelToInitial = async ({
|
||||
floorId: activeGuideFloor.value,
|
||||
reason: 'poi-detail-close'
|
||||
})
|
||||
if (!resetApplied) {
|
||||
if (resetApplied) {
|
||||
renderedFloorId.value = activeGuideFloor.value
|
||||
pendingGuideModelResetUntilReady = null
|
||||
} else {
|
||||
// The renderer is still becoming ready; retain only the latest requested reset.
|
||||
pendingGuideModelResetUntilReady = Object.freeze({
|
||||
floorId: activeGuideFloor.value,
|
||||
resetMode: 'floor-baseline',
|
||||
requestId: guideModelState.invalidatePendingRequests()
|
||||
requestId: resetRequestId
|
||||
})
|
||||
}
|
||||
console.info('馆内三维模型已恢复统一初始状态:', { reason })
|
||||
@@ -1617,16 +1659,10 @@ const createSearchDetailUrl = (poi: MuseumPoi, context: PoiSearchContext) => {
|
||||
const handleHomeSearchResultTap = async (poi: MuseumPoi, context: PoiSearchContext) => {
|
||||
// The homepage keeps its renderer mounted; detail close is consumed by onShow once.
|
||||
searchTargetFocusRequest.value = null
|
||||
guideModelState.beginPoiDetailReturn(poi.floorId)
|
||||
uni.navigateTo({
|
||||
navigateToPoiDetail({
|
||||
url: createSearchDetailUrl(poi, context),
|
||||
fail: () => {
|
||||
guideModelState.cancelPoiDetailReturn()
|
||||
uni.showToast({
|
||||
title: '点位详情打开失败,请重试',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
floorId: poi.floorId,
|
||||
failureMessage: '点位详情打开失败,请重试'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user