This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user