This commit is contained in:
@@ -24,6 +24,11 @@ export type PoiDetailReturnContext = Readonly<{
|
||||
requestId: number
|
||||
}>
|
||||
|
||||
type GuideModelReadyState = Readonly<{
|
||||
view: 'overview' | 'floor' | 'multi'
|
||||
floorId: string
|
||||
}>
|
||||
|
||||
// The object is frozen so callers cannot accidentally turn a captured baseline into live state.
|
||||
export const GUIDE_MODEL_INITIAL_STATE: GuideModelInitialState = Object.freeze({
|
||||
mode: '3d',
|
||||
@@ -45,12 +50,14 @@ export const GUIDE_MODEL_INITIAL_STATE: GuideModelInitialState = Object.freeze({
|
||||
|
||||
const initialState = ref<GuideModelInitialState>(GUIDE_MODEL_INITIAL_STATE)
|
||||
const pendingModelResetAfterPoiDetail = ref<PoiDetailReturnContext | null>(null)
|
||||
const confirmedPoiDetailRequestId = ref<number | null>(null)
|
||||
const requestGeneration = ref(0)
|
||||
let poiDetailRequestId = 0
|
||||
|
||||
export const useGuideModelState = () => {
|
||||
const initializeModel = (floorId: string) => {
|
||||
const initializeModel = ({ view, floorId }: GuideModelReadyState) => {
|
||||
if (initialState.value.defaultActiveFloorId) return initialState.value
|
||||
if (view !== 'overview' || !floorId.trim()) return initialState.value
|
||||
initialState.value = Object.freeze({
|
||||
...GUIDE_MODEL_INITIAL_STATE,
|
||||
defaultActiveFloorId: floorId,
|
||||
@@ -66,16 +73,31 @@ export const useGuideModelState = () => {
|
||||
requestId: ++poiDetailRequestId
|
||||
})
|
||||
pendingModelResetAfterPoiDetail.value = context
|
||||
confirmedPoiDetailRequestId.value = null
|
||||
return context
|
||||
}
|
||||
|
||||
const cancelPoiDetailReturn = () => {
|
||||
const confirmPoiDetailReturn = (requestId: number) => {
|
||||
if (pendingModelResetAfterPoiDetail.value?.requestId !== requestId) return false
|
||||
confirmedPoiDetailRequestId.value = requestId
|
||||
return true
|
||||
}
|
||||
|
||||
const cancelPoiDetailReturn = (requestId?: number) => {
|
||||
if (
|
||||
requestId !== undefined
|
||||
&& pendingModelResetAfterPoiDetail.value?.requestId !== requestId
|
||||
) return false
|
||||
pendingModelResetAfterPoiDetail.value = null
|
||||
confirmedPoiDetailRequestId.value = null
|
||||
return true
|
||||
}
|
||||
|
||||
const consumePoiDetailReturn = () => {
|
||||
const context = pendingModelResetAfterPoiDetail.value
|
||||
if (!context || confirmedPoiDetailRequestId.value !== context.requestId) return null
|
||||
pendingModelResetAfterPoiDetail.value = null
|
||||
confirmedPoiDetailRequestId.value = null
|
||||
return context
|
||||
}
|
||||
|
||||
@@ -91,6 +113,7 @@ export const useGuideModelState = () => {
|
||||
requestGeneration: readonly(requestGeneration),
|
||||
initializeModel,
|
||||
beginPoiDetailReturn,
|
||||
confirmPoiDetailReturn,
|
||||
cancelPoiDetailReturn,
|
||||
consumePoiDetailReturn,
|
||||
invalidatePendingRequests
|
||||
|
||||
Reference in New Issue
Block a user