修复导览楼层默认进入与模型复位状态
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-17 11:54:08 +08:00
parent 19ecca84e8
commit 122013ccfb
7 changed files with 407 additions and 69 deletions

View File

@@ -24,6 +24,14 @@ export type PoiDetailReturnContext = Readonly<{
requestId: number
}>
export type GuideModelResetReason = 'poi-detail-close' | 'floor-reset'
export type GuideModelResetRequest = Readonly<{
floorId: string
requestId: number
rendererReason: GuideModelResetReason
}>
type GuideModelReadyState = Readonly<{
view: 'overview' | 'floor' | 'multi'
floorId: string
@@ -52,6 +60,7 @@ const initialState = ref<GuideModelInitialState>(GUIDE_MODEL_INITIAL_STATE)
const pendingModelResetAfterPoiDetail = ref<PoiDetailReturnContext | null>(null)
const confirmedPoiDetailRequestId = ref<number | null>(null)
const requestGeneration = ref(0)
const pendingViewBaselineReset = ref<GuideModelResetRequest | null>(null)
let poiDetailRequestId = 0
export const useGuideModelState = () => {
@@ -107,15 +116,53 @@ export const useGuideModelState = () => {
return requestGeneration.value
}
const beginViewBaselineReset = ({ floorId, rendererReason }: {
floorId: string
rendererReason: GuideModelResetReason
}) => Object.freeze({
floorId,
rendererReason,
requestId: invalidatePendingRequests()
})
const isCurrentRequest = (requestId: number) => requestGeneration.value === requestId
// The renderer may not yet exist while the page has already received a return event.
// Keep exactly one latest request here so page lifecycle hooks cannot race each other.
const queueViewBaselineReset = (request: GuideModelResetRequest) => {
if (!isCurrentRequest(request.requestId)) return false
pendingViewBaselineReset.value = request
return true
}
const completeViewBaselineReset = (request: GuideModelResetRequest) => {
if (!isCurrentRequest(request.requestId)) return false
pendingViewBaselineReset.value = null
return true
}
const consumePendingViewBaselineReset = () => {
const request = pendingViewBaselineReset.value
if (!request || !isCurrentRequest(request.requestId)) return null
pendingViewBaselineReset.value = null
return request
}
return {
initialState: readonly(initialState),
pendingModelResetAfterPoiDetail: readonly(pendingModelResetAfterPoiDetail),
requestGeneration: readonly(requestGeneration),
pendingViewBaselineReset: readonly(pendingViewBaselineReset),
initializeModel,
beginPoiDetailReturn,
confirmPoiDetailReturn,
cancelPoiDetailReturn,
consumePoiDetailReturn,
invalidatePendingRequests
invalidatePendingRequests,
beginViewBaselineReset,
isCurrentRequest,
queueViewBaselineReset,
completeViewBaselineReset,
consumePendingViewBaselineReset
}
}