@mappedin/dynamic-focus 6.0.1-beta.60 → 6.0.1-beta.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["<define:process>", "../../src/dynamic-focus.ts", "../../../packages/common/array-utils.ts", "../../../packages/common/pubsub.ts", "../../src/building.ts", "../../src/dynamic-focus-scene.ts", "../../src/types.ts", "../../src/validation.ts", "../../../packages/common/Mappedin.Logger.ts", "../../../packages/common/math-utils.ts", "../../src/logger.ts", "../../src/outdoors.ts", "../../src/constants.ts"],
4
- "sourcesContent": ["{\"env\":{\"npm_package_version\":\"6.0.1-beta.60\"}}", "import type {\n\tCameraTransform,\n\tFacade,\n\tFloorStack,\n\tMapData,\n\tMapView,\n\tTEvents,\n\tTFloorState,\n} from '@mappedin/mappedin-js';\nimport { Floor, getMultiFloorState } from '@mappedin/mappedin-js';\nimport { arraysEqual } from '@packages/internal/common/array-utils';\nimport { PubSub } from '@packages/internal/common/pubsub';\nimport { Building } from './building';\nimport {\n\tgetFloorToShow,\n\tshouldShowIndoor,\n\tgetBuildingAnimationType,\n\tgetZoomState,\n\tgetOutdoorOpacity,\n\tgetSetFloorTargetFromZoomState,\n\tgetBuildingStates,\n\tshouldDeferSetFloor,\n} from './dynamic-focus-scene';\nimport { DYNAMIC_FOCUS_MODES } from './types';\nimport type {\n\tViewState,\n\tZoomState,\n\tBuildingFacadeState,\n\tDynamicFocusEventPayload,\n\tDynamicFocusEvents,\n\tDynamicFocusMode,\n\tDynamicFocusState,\n\tBuildingFloorStackState,\n\tInternalDynamicFocusEvents,\n} from './types';\nimport { validateFloorForStack, validateZoomThreshold } from './validation';\nimport { getOutdoorFloorStack, Outdoors } from './outdoors';\nimport { Logger } from './logger';\nimport MappedinJSLogger from '../../packages/common/Mappedin.Logger';\nimport { DEFAULT_STATE } from './constants';\nimport type { MapViewExtension } from '@packages/internal/common/extensions';\n\n/**\n * Dynamic Focus is a MapView scene manager that maintains the visibility of the outdoors\n * while fading in and out building interiors as the camera pans.\n */\nexport class DynamicFocus implements MapViewExtension<DynamicFocusState> {\n\t#pubsub: PubSub<DynamicFocusEvents & InternalDynamicFocusEvents>;\n\t#mapView: MapView;\n\t#mapData: MapData;\n\t#state: Required<DynamicFocusState> = DEFAULT_STATE;\n\t/**\n\t * The buildings that are currently in view, sorted by the order they are in the facades-in-view-change event.\n\t * While these will be within the camera view, these may not be in focus or showIndoor depending on the mode.\n\t */\n\t#sortedBuildingsInView: Building[] = [];\n\t/**\n\t * The buildings that are currently in view, as a set of building ids.\n\t */\n\t#buildingIdsInViewSet = new Set<string>();\n\t#buildings = new Map<string, Building>();\n\t#outdoors: Outdoors;\n\t#userInteracting = false;\n\t#pendingFacadeUpdate = false;\n\t#floorElevation = 0;\n\t#cameraElevation = 0;\n\t/**\n\t * Tracks the current zoom state based on camera zoom level:\n\t * - 'in-range': Camera is zoomed in enough to show indoor details (>= indoorZoomThreshold)\n\t * - 'out-of-range': Camera is zoomed out to show outdoor context (<= outdoorZoomThreshold)\n\t * - 'transition': Camera is between the two thresholds (no floor changes occur)\n\t */\n\t#zoomState: ZoomState = 'transition';\n\t#viewState: ViewState = 'outdoor';\n\t/**\n\t * The facades that are actually focused and shown (filtered by showIndoor logic)\n\t */\n\t#facadesInFocus: Facade[] = [];\n\t#enabled = false;\n\n\t/**\n\t * @internal\n\t * Used to await the current scene update before starting a new one, or when the scene is updated asynchronously by an event.\n\t */\n\tprivate sceneUpdateQueue: Promise<void> = Promise.resolve();\n\n\t/**\n\t * Creates a new instance of the Dynamic Focus controller.\n\t *\n\t * @param mapView - The {@link MapView} to attach Dynamic Focus to.\n\t * @param options - Options for configuring Dynamic Focus.\n\t *\n\t * @example\n\t * ```ts\n\t * const mapView = show3dMap(...);\n\t * const df = new DynamicFocus(mapView);\n\t * df.enable({ autoFocus: true });\n\t *\n\t * // pause the listener\n\t * df.updateState({ autoFocus: false });\n\t *\n\t * // manually trigger a focus\n\t * df.focus();\n\t * ```\n\t */\n\tconstructor(mapView: MapView) {\n\t\tthis.#pubsub = new PubSub<DynamicFocusEvents & InternalDynamicFocusEvents>();\n\t\tthis.#mapView = mapView;\n\t\tLogger.setLevel(MappedinJSLogger.logState);\n\t\tthis.#mapData = this.#mapView.getMapData();\n\t\tthis.#floorElevation = this.#mapView.currentFloor.elevation;\n\t\tthis.#cameraElevation = this.#mapView.Camera.elevation;\n\t\t// initialize the buildings\n\t\tfor (const facade of this.#mapData.getByType('facade')) {\n\t\t\tthis.#buildings.set(facade.floorStack.id, new Building(facade.floorStack, this.#mapView));\n\t\t}\n\t\tthis.#outdoors = new Outdoors(\n\t\t\tgetOutdoorFloorStack(this.#mapData.getByType('floor-stack'), this.#buildings),\n\t\t\tthis.#mapView,\n\t\t);\n\t\tthis.#mapView.on('floor-change-start', this.#handleFloorChangeStart);\n\t\tthis.#mapView.on('camera-change', this.#handleCameraChange);\n\t\tthis.#mapView.on('facades-in-view-change', this.#handleFacadesInViewChange);\n\t\tthis.#mapView.on('user-interaction-start', this.#handleUserInteractionStart);\n\t\tthis.#mapView.on('user-interaction-end', this.#handleUserInteractionEnd);\n\t}\n\n\t/**\n\t * Enables Dynamic Focus with the given options.\n\t * @param options - The options to enable Dynamic Focus with.\n\t */\n\tenable(options?: Partial<DynamicFocusState>): void {\n\t\tif (this.#enabled) {\n\t\t\tLogger.warn('enable() called on an already enabled Dynamic Focus instance.');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#enabled = true;\n\t\tthis.#mapView.manualFloorVisibility = true;\n\t\tthis.#outdoors.show();\n\t\tthis.updateState({ ...this.#state, ...options });\n\t\t// fire the camera change event to set the initial state\n\t\tthis.#handleCameraChange({\n\t\t\tzoomLevel: this.#mapView.Camera.zoomLevel,\n\t\t\tcenter: this.#mapView.Camera.center,\n\t\t\tbearing: this.#mapView.Camera.bearing,\n\t\t\tpitch: this.#mapView.Camera.pitch,\n\t\t} as CameraTransform);\n\t\t// fire dynamic focus change to set initial state of facades\n\t\tthis.#mapView.Camera.updateFacadesInView();\n\t}\n\t/**\n\t * Disables Dynamic Focus and returns the MapView to it's previous state.\n\t */\n\tdisable(): void {\n\t\tif (!this.#enabled) {\n\t\t\tLogger.warn('disable() called on an already disabled Dynamic Focus instance.');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#enabled = false;\n\t\tthis.#mapView.manualFloorVisibility = false;\n\t}\n\n\t/**\n\t * Returns true if Dynamic Focus is enabled.\n\t */\n\tget isEnabled(): boolean {\n\t\treturn this.#enabled;\n\t}\n\n\t/**\n\t * Returns true if the current view state is indoor.\n\t */\n\tget isIndoor() {\n\t\treturn this.#viewState === 'indoor';\n\t}\n\n\t/**\n\t * Returns true if the current view state is outdoor.\n\t */\n\tget isOutdoor() {\n\t\treturn this.#viewState === 'outdoor';\n\t}\n\n\t/**\n\t * Sets the view state to indoor, regardless of the current zoom level.\n\t */\n\tsetIndoor() {\n\t\tthis.#viewState = 'indoor';\n\t\tthis.#zoomState = 'in-range';\n\n\t\tthis.#handleViewStateChange();\n\t}\n\n\t/**\n\t * Sets the view state to outdoor, regardless of the current zoom level.\n\t */\n\tsetOutdoor() {\n\t\tthis.#viewState = 'outdoor';\n\t\tthis.#zoomState = 'out-of-range';\n\n\t\tthis.#handleViewStateChange();\n\t}\n\n\t#handleViewStateChange() {\n\t\tif (this.#state.autoFocus) {\n\t\t\t// Only set the floor if setFloorOnFocus is true and the view state changed due to a user interaction\n\t\t\t// Camera animations will not trigger a focus change until they settle.\n\t\t\tif (this.#userInteracting) {\n\t\t\t\tthis.focus();\n\t\t\t} else {\n\t\t\t\tthis.#pendingFacadeUpdate = true;\n\t\t\t}\n\t\t}\n\t\tthis.#pubsub.publish('state-change');\n\t}\n\n\t#preloadFloors(mode: DynamicFocusMode) {\n\t\tthis.#mapView.preloadFloors(\n\t\t\tthis.#mapData\n\t\t\t\t.getByType('facade')\n\t\t\t\t.map(facade => getFloorToShow(this.#buildings.get(facade.floorStack.id)!, mode, this.#floorElevation))\n\t\t\t\t.filter(f => f != null && Floor.is(f)),\n\t\t);\n\t}\n\n\t/**\n\t * Returns the facades that are currently in focus.\n\t */\n\tget focusedFacades() {\n\t\treturn [...this.#facadesInFocus];\n\t}\n\n\t/**\n\t * Subscribe to a Dynamic Focus event.\n\t */\n\ton = <EventName extends keyof DynamicFocusEvents>(\n\t\teventName: EventName,\n\t\tfn: (payload: DynamicFocusEventPayload<EventName>) => void,\n\t) => {\n\t\tthis.#pubsub.on(eventName, fn);\n\t};\n\n\t/**\n\t * Unsubscribe from a Dynamic Focus event.\n\t */\n\toff = <EventName extends keyof DynamicFocusEvents>(\n\t\teventName: EventName,\n\t\tfn: (payload: DynamicFocusEventPayload<EventName>) => void,\n\t) => {\n\t\tthis.#pubsub.off(eventName, fn);\n\t};\n\n\t/**\n\t * Returns the current state of the Dynamic Focus controller.\n\t */\n\tgetState(): DynamicFocusState {\n\t\treturn { ...this.#state };\n\t}\n\n\t/**\n\t * Updates the state of the Dynamic Focus controller.\n\t * @param state - The state to update.\n\t */\n\tupdateState(state: Partial<DynamicFocusState>) {\n\t\tlet shouldReapplyBuildingStates = false;\n\n\t\tif (state.indoorZoomThreshold != null) {\n\t\t\tstate.indoorZoomThreshold = validateZoomThreshold(\n\t\t\t\tstate.indoorZoomThreshold,\n\t\t\t\tthis.#state.outdoorZoomThreshold,\n\t\t\t\tthis.#mapView.Camera.maxZoomLevel,\n\t\t\t\t'indoorZoomThreshold',\n\t\t\t);\n\t\t}\n\t\tif (state.outdoorZoomThreshold != null) {\n\t\t\tstate.outdoorZoomThreshold = validateZoomThreshold(\n\t\t\t\tstate.outdoorZoomThreshold,\n\t\t\t\tthis.#mapView.Camera.minZoomLevel,\n\t\t\t\tthis.#state.indoorZoomThreshold,\n\t\t\t\t'outdoorZoomThreshold',\n\t\t\t);\n\t\t}\n\n\t\tif (state.mode != null) {\n\t\t\tstate.mode = DYNAMIC_FOCUS_MODES.includes(state.mode) ? state.mode : 'default-floor';\n\t\t}\n\n\t\tif (state.autoAdjustFacadeHeights != null) {\n\t\t\tthis.#state.autoAdjustFacadeHeights = state.autoAdjustFacadeHeights;\n\t\t}\n\n\t\tif (\n\t\t\tstate.dynamicBuildingInteriors != null &&\n\t\t\tstate.dynamicBuildingInteriors !== this.#state.dynamicBuildingInteriors\n\t\t) {\n\t\t\tshouldReapplyBuildingStates = true;\n\t\t}\n\n\t\t// assign state and ignore undefined values\n\t\tthis.#state = Object.assign(\n\t\t\t{},\n\t\t\tthis.#state,\n\t\t\tObject.fromEntries(Object.entries(state).filter(([, value]) => value != null)),\n\t\t);\n\n\t\t// preload the initial floors that will be included in the mode\n\t\tif (state.mode != null && state.preloadFloors) {\n\t\t\tthis.#preloadFloors(state.mode);\n\t\t}\n\n\t\tif (shouldReapplyBuildingStates) {\n\t\t\tthis.#applyBuildingStates();\n\t\t}\n\t}\n\n\t/**\n\t * Destroys the Dynamic Focus instance and unsubscribes all MapView event listeners.\n\t */\n\tdestroy() {\n\t\tthis.disable();\n\t\tthis.#mapView.off('facades-in-view-change', this.#handleFacadesInViewChange);\n\t\tthis.#mapView.off('floor-change-start', this.#handleFloorChangeStart);\n\t\tthis.#mapView.off('camera-change', this.#handleCameraChange);\n\t\tthis.#mapView.off('user-interaction-start', this.#handleUserInteractionStart);\n\t\tthis.#mapView.off('user-interaction-end', this.#handleUserInteractionEnd);\n\t\tthis.#buildings.forEach(building => building.destroy());\n\t\tthis.#outdoors.destroy();\n\t\tthis.#pubsub.destroy();\n\t}\n\n\t/**\n\t * Perform a manual visual update of the focused facades, and optionally set the floor.\n\t * @param setFloor - Whether to set the floor. This will default to the current state of setFloorOnFocus.\n\t */\n\tasync focus(setFloor = this.#state.setFloorOnFocus) {\n\t\tif (setFloor) {\n\t\t\tif (shouldDeferSetFloor(this.#cameraElevation, this.#mapView.Camera.elevation, this.#userInteracting)) {\n\t\t\t\tthis.#cameraElevation = this.#mapView.Camera.elevation;\n\t\t\t\tthis.#pendingFacadeUpdate = true;\n\t\t\t} else {\n\t\t\t\tconst target = getSetFloorTargetFromZoomState(this.#sortedBuildingsInView, this.#outdoors, this.#zoomState);\n\n\t\t\t\tconst floor = target ? getFloorToShow(target, this.#state.mode, this.#floorElevation) : undefined;\n\n\t\t\t\tif (floor && floor.id !== this.#mapView.currentFloor.id) {\n\t\t\t\t\tthis.#mapView.setFloor(floor, { context: 'dynamic-focus' });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tawait this.#applyBuildingStates();\n\t\t// must publish after the scene is updated to ensure the focusedFacades array is up to date\n\t\tthis.#pubsub.publish('focus', { facades: this.focusedFacades });\n\t}\n\n\t/**\n\t * Preloads the initial floors for each building to improve performance when rendering the building for the first time. See {@link DynamicFocusState.preloadFloors}.\n\t */\n\tpreloadFloors() {\n\t\tthis.#preloadFloors(this.#state.mode);\n\t}\n\n\t/**\n\t * Sets the default floor for a floor stack. This is the floor that will be shown when focusing on a facade if there is no currently active floor in the stack.\n\t * See {@link resetDefaultFloorForStack} to reset the default floor.\n\t * @param floorStack - The floor stack to set the default floor for.\n\t * @param floor - The floor to set as the default floor.\n\t */\n\tsetDefaultFloorForStack(floorStack: FloorStack, floor: Floor) {\n\t\tif (!validateFloorForStack(floor, floorStack)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst building = this.#buildings.get(floorStack.id);\n\t\tif (building) {\n\t\t\tbuilding.defaultFloor = floor;\n\t\t}\n\t}\n\n\t/**\n\t * Resets the default floor for a floor stack to it's initial value.\n\t * @param floorStack - The floor stack to reset the default floor for.\n\t */\n\tresetDefaultFloorForStack(floorStack: FloorStack) {\n\t\tconst building = this.#buildings.get(floorStack.id);\n\t\tif (building) {\n\t\t\tbuilding.defaultFloor = floorStack.defaultFloor;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the current default floor for a floor stack.\n\t * @param floorStack - The floor stack to get the default floor for.\n\t * @returns The current default floor for the floor stack.\n\t */\n\tgetDefaultFloorForStack(floorStack: FloorStack) {\n\t\treturn this.#buildings.get(floorStack.id)?.defaultFloor || floorStack.defaultFloor || floorStack.floors[0];\n\t}\n\n\t/**\n\t * Sets the current floor for a floor stack. If the floor stack is currently focused, this floor will become visible.\n\t * @param floorStack - The floor stack to set the current floor for.\n\t */\n\tsetCurrentFloorForStack(floorStack: FloorStack, floor: Floor) {\n\t\tif (!validateFloorForStack(floor, floorStack)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst building = this.#buildings.get(floorStack.id);\n\t\tif (building) {\n\t\t\tbuilding.activeFloor = floor;\n\t\t\tthis.#applyBuildingStates();\n\t\t}\n\t}\n\n\t/**\n\t * Excludes a floor stack from visibility changes.\n\t * @param excluded - The floor stack or stacks to exclude.\n\t */\n\texclude(excluded: FloorStack | FloorStack[]) {\n\t\tconst excludedFloorStacks = Array.isArray(excluded) ? excluded : [excluded];\n\t\tfor (const floorStack of excludedFloorStacks) {\n\t\t\tconst building = this.#buildings.get(floorStack.id);\n\t\t\tif (building) {\n\t\t\t\tbuilding.excluded = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Includes a floor stack in visibility changes.\n\t * @param included - The floor stack or stacks to include.\n\t */\n\tinclude(included: FloorStack | FloorStack[]) {\n\t\tconst includedFloorStacks = Array.isArray(included) ? included : [included];\n\t\tfor (const floorStack of includedFloorStacks) {\n\t\t\tconst building = this.#buildings.get(floorStack.id);\n\t\t\tif (building) {\n\t\t\t\tbuilding.excluded = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the current floor for a floor stack.\n\t * @param floorStack - The floor stack to get the current floor for.\n\t * @returns The current floor for the floor stack.\n\t */\n\tgetCurrentFloorForStack(floorStack: FloorStack) {\n\t\treturn this.#buildings.get(floorStack.id)?.activeFloor || this.getDefaultFloorForStack(floorStack);\n\t}\n\n\t/**\n\t * Handles management of focused facades but doesn't trigger view updates unless enabled.\n\t * @see {@link focus} to manually trigger a view update.\n\t */\n\t#handleFacadesInViewChange = (event: TEvents['facades-in-view-change']) => {\n\t\tif (!this.isEnabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { facades } = event;\n\n\t\t// if the facades are the same, or we're in between outdoor/indoor, don't do anything unless we're pending a facade update\n\t\tif (arraysEqual(facades, this.focusedFacades) && this.#viewState === 'transition' && !this.#pendingFacadeUpdate) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#pendingFacadeUpdate = false;\n\n\t\tthis.#sortedBuildingsInView = [];\n\t\tthis.#buildingIdsInViewSet.clear();\n\t\tif (facades.length > 0) {\n\t\t\tfor (const facade of facades) {\n\t\t\t\tconst building = this.#buildings.get(facade.floorStack.id);\n\t\t\t\tif (building) {\n\t\t\t\t\tthis.#buildingIdsInViewSet.add(building.id);\n\t\t\t\t\tthis.#sortedBuildingsInView.push(building);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#state.autoFocus) {\n\t\t\tthis.focus();\n\t\t}\n\t};\n\t/**\n\t * Handles floor and facade visibility when the floor changes.\n\t */\n\t#handleFloorChangeStart = async (event: TEvents['floor-change-start']) => {\n\t\tif (!this.isEnabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { floor: newFloor } = event;\n\t\tconst building = this.#buildings.get(newFloor.floorStack.id);\n\t\tif (building) {\n\t\t\tbuilding.activeFloor = newFloor;\n\t\t}\n\t\t// Don't update elevation when switching to outdoor floor stack\n\t\tif (building?.excluded === false && !this.#outdoors.matchesFloorStack(newFloor.floorStack)) {\n\t\t\tthis.#floorElevation = newFloor.elevation;\n\t\t}\n\n\t\tif (this.#mapView.manualFloorVisibility === true) {\n\t\t\tif (event.reason !== 'dynamic-focus') {\n\t\t\t\tawait this.#applyBuildingStates(newFloor);\n\t\t\t\t// Despite this not really being a focus event, we've changed the focused facades, so we need to publish it\n\t\t\t\tthis.#pubsub.publish('focus', { facades: this.focusedFacades });\n\t\t\t}\n\n\t\t\tconst altitude = building?.floorsAltitudesMap.get(newFloor.elevation)?.altitude ?? 0;\n\t\t\tif (\n\t\t\t\tthis.#mapView.options.multiFloorView != null &&\n\t\t\t\tthis.#mapView.options.multiFloorView?.enabled &&\n\t\t\t\tthis.#mapView.options.multiFloorView?.updateCameraElevationOnFloorChange &&\n\t\t\t\tthis.#mapView.Camera.elevation !== altitude\n\t\t\t) {\n\t\t\t\tthis.#mapView.Camera.animateElevation(altitude, {\n\t\t\t\t\tduration: 750,\n\t\t\t\t\teasing: 'ease-in-out',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\t#handleUserInteractionStart = () => {\n\t\tthis.#userInteracting = true;\n\t};\n\t#handleUserInteractionEnd = () => {\n\t\tthis.#userInteracting = false;\n\t};\n\n\t/**\n\t * Handles camera moving in and out of zoom range and fires a focus event if the camera is in range.\n\t */\n\t#handleCameraChange = (event: TEvents['camera-change']) => {\n\t\tif (!this.isEnabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { zoomLevel } = event;\n\t\tconst newZoomState = getZoomState(zoomLevel, this.#state.indoorZoomThreshold, this.#state.outdoorZoomThreshold);\n\n\t\tif (this.#zoomState !== newZoomState) {\n\t\t\tthis.#zoomState = newZoomState;\n\n\t\t\tif (newZoomState === 'in-range') {\n\t\t\t\tthis.setIndoor();\n\t\t\t} else if (newZoomState === 'out-of-range') {\n\t\t\t\tthis.setOutdoor();\n\t\t\t}\n\t\t}\n\t};\n\n\t#updateFloorVisibility(floorStates: BuildingFloorStackState['floorStates'], shouldShow: boolean, inFocus?: boolean) {\n\t\tfloorStates.forEach(floorState => {\n\t\t\tif (floorState.floor) {\n\t\t\t\tif (shouldShow) {\n\t\t\t\t\tconst state =\n\t\t\t\t\t\tinFocus !== undefined\n\t\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t\t...floorState.state,\n\t\t\t\t\t\t\t\t\tlabels: {\n\t\t\t\t\t\t\t\t\t\t...floorState.state.labels,\n\t\t\t\t\t\t\t\t\t\tenabled: floorState.state.labels.enabled && inFocus,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tmarkers: {\n\t\t\t\t\t\t\t\t\t\t...floorState.state.markers,\n\t\t\t\t\t\t\t\t\t\tenabled: floorState.state.markers.enabled && inFocus,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tocclusion: {\n\t\t\t\t\t\t\t\t\t\t...floorState.state.occlusion,\n\t\t\t\t\t\t\t\t\t\t// We don't want this floor to occlude if it's not in focus\n\t\t\t\t\t\t\t\t\t\t// Allows us to show a label above this floor while it's not active\n\t\t\t\t\t\t\t\t\t\tenabled: floorState.state.occlusion.enabled && inFocus,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t } satisfies TFloorState)\n\t\t\t\t\t\t\t: floorState.state;\n\n\t\t\t\t\tthis.#mapView.updateState(floorState.floor, state);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#mapView.updateState(floorState.floor, { visible: false });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tasync #animateIndoorSequence(\n\t\tbuilding: Building,\n\t\tfloorStackState: BuildingFloorStackState,\n\t\tfacadeState: BuildingFacadeState,\n\t\tinFocus: boolean,\n\t) {\n\t\t// show floor first then fade in the facade\n\t\tthis.#updateFloorVisibility(floorStackState.floorStates, true, inFocus);\n\n\t\treturn building.animateFacade(facadeState.state, this.#state.indoorAnimationOptions);\n\t}\n\n\tasync #animateOutdoorSequence(\n\t\tbuilding: Building,\n\t\tfloorStackState: BuildingFloorStackState,\n\t\tfacadeState: BuildingFacadeState,\n\t\tfloorStackIdsInNavigation: string[],\n\t) {\n\t\t// fade in facade then hide floors when complete\n\t\tconst result = await building.animateFacade(facadeState.state, this.#state.outdoorAnimationOptions);\n\n\t\tif (result.result === 'completed') {\n\t\t\t// Re-check if we should still show indoor after animation completes\n\t\t\tthis.#updateFloorVisibility(\n\t\t\t\tfloorStackState.floorStates,\n\t\t\t\tshouldShowIndoor(\n\t\t\t\t\tbuilding,\n\t\t\t\t\tthis.#mapView.currentFloor,\n\t\t\t\t\tthis.#zoomState === 'in-range',\n\t\t\t\t\tthis.#buildingIdsInViewSet.has(building.id),\n\t\t\t\t\tthis.#state.mode,\n\t\t\t\t\tthis.#floorElevation,\n\t\t\t\t\tfloorStackIdsInNavigation.includes(building.floorStack.id),\n\t\t\t\t\tthis.#state.dynamicBuildingInteriors,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t#applyBuildingStates = async (newFloor?: Floor) => {\n\t\tif (this.#mapView.manualFloorVisibility !== true || !this.isEnabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentFloor = newFloor || this.#mapView.currentFloor;\n\t\tconst multiFloorView = this.#mapView.options.multiFloorView;\n\t\tconst floorIdsInNavigation = this.#mapView.Navigation?.floors?.map(f => f.id) || [];\n\t\tconst floorStackIdsInNavigation = this.#mapView.Navigation?.floorStacks.map(fs => fs.id) || [];\n\n\t\t// Create a new promise for this update\n\t\tconst updatePromise = new Promise<void>(async resolve => {\n\t\t\t// Wait for the previous update to complete\n\t\t\tawait this.sceneUpdateQueue;\n\n\t\t\tconst buildingStates = getBuildingStates(\n\t\t\t\tArray.from(this.#buildings.values()),\n\t\t\t\tthis.#buildingIdsInViewSet,\n\t\t\t\tcurrentFloor,\n\t\t\t\tthis.#zoomState,\n\t\t\t\tthis.#state.mode,\n\t\t\t\tthis.#floorElevation,\n\t\t\t\tfloorIdsInNavigation,\n\t\t\t\tfloorStackIdsInNavigation,\n\t\t\t\tmultiFloorView,\n\t\t\t\tthis.#state.customMultiFloorVisibilityState ?? getMultiFloorState,\n\t\t\t\tthis.#state.dynamicBuildingInteriors,\n\t\t\t);\n\n\t\t\tconst floorStackStates: BuildingFloorStackState[] = [];\n\t\t\tawait Promise.all(\n\t\t\t\tArray.from(buildingStates.values()).map(async buildingState => {\n\t\t\t\t\tconst { building, showIndoor, floorStackState, facadeState, inFocus } = buildingState;\n\n\t\t\t\t\tfloorStackStates.push(floorStackState);\n\n\t\t\t\t\tconst animation = getBuildingAnimationType(building, showIndoor);\n\n\t\t\t\t\tif (animation === 'indoor') {\n\t\t\t\t\t\treturn this.#animateIndoorSequence(building, floorStackState, facadeState, inFocus);\n\t\t\t\t\t} else if (animation === 'outdoor') {\n\t\t\t\t\t\treturn this.#animateOutdoorSequence(building, floorStackState, facadeState, floorStackIdsInNavigation);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tthis.#mapView.Outdoor.setOpacity(getOutdoorOpacity(floorStackStates, this.#state.mode));\n\n\t\t\t// Filter #facadesInFocus to maintain sort order, keeping only buildings with showIndoor true\n\t\t\tthis.#facadesInFocus = this.#sortedBuildingsInView\n\t\t\t\t.filter(building => buildingStates.get(building.id)?.showIndoor === true)\n\t\t\t\t.map(building => building.facade);\n\n\t\t\tthis.#pubsub.publish('focus', { facades: this.#facadesInFocus });\n\n\t\t\tresolve();\n\t\t});\n\n\t\t// Update the queue with the new promise\n\t\tthis.sceneUpdateQueue = updatePromise;\n\n\t\treturn updatePromise;\n\t};\n}\n", "/**\n * Compare two arrays for equality\n */\nexport function arraysEqual(arr1: any[] | null | undefined, arr2: any[] | null | undefined) {\n\tif (arr1 == null || arr2 == null) {\n\t\treturn arr1 === arr2;\n\t}\n\n\tif (arr1.length !== arr2.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < arr1.length; i++) {\n\t\tif (arr1[i] !== arr2[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n", "/**\n * Generic PubSub class implementing the Publish-Subscribe pattern for event handling.\n *\n * @template EVENT_PAYLOAD - The type of the event payload.\n * @template EVENT - The type of the event.\n */\nexport class PubSub<EVENT_PAYLOAD, EVENT extends keyof EVENT_PAYLOAD = keyof EVENT_PAYLOAD> {\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tprivate _subscribers: any = {};\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tprivate _destroyed = false;\n\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tpublish<EVENT_NAME extends EVENT>(eventName: EVENT_NAME, data?: EVENT_PAYLOAD[EVENT_NAME]) {\n\t\tif (!this._subscribers || !this._subscribers[eventName] || this._destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._subscribers[eventName]!.forEach(function (fn) {\n\t\t\tif (typeof fn !== 'function') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfn(data);\n\t\t});\n\t}\n\n\t/**\n\t * Subscribe a function to an event.\n\t *\n\t * @param eventName An event name which, when fired, will call the provided\n\t * function.\n\t * @param fn A callback that gets called when the corresponding event is fired. The\n\t * callback will get passed an argument with a type that's one of event payloads.\n\t * @example\n\t * // Subscribe to the 'click' event\n\t * const handler = (event) => {\n\t * const { coordinate } = event;\n\t * const { latitude, longitude } = coordinate;\n\t * \tconsole.log(`Map was clicked at ${latitude}, ${longitude}`);\n\t * };\n\t * map.on('click', handler);\n\t */\n\ton<EVENT_NAME extends EVENT>(\n\t\teventName: EVENT_NAME,\n\t\tfn: (\n\t\t\tpayload: EVENT_PAYLOAD[EVENT_NAME] extends {\n\t\t\t\tdata: null;\n\t\t\t}\n\t\t\t\t? EVENT_PAYLOAD[EVENT_NAME]['data']\n\t\t\t\t: EVENT_PAYLOAD[EVENT_NAME],\n\t\t) => void,\n\t) {\n\t\tif (!this._subscribers || this._destroyed) {\n\t\t\tthis._subscribers = {};\n\t\t}\n\t\tthis._subscribers[eventName] = this._subscribers[eventName] || [];\n\t\tthis._subscribers[eventName]!.push(fn);\n\t}\n\n\t/**\n\t * Unsubscribe a function previously subscribed with {@link on}\n\t *\n\t * @param eventName An event name to which the provided function was previously\n\t * subscribed.\n\t * @param fn A function that was previously passed to {@link on}. The function must\n\t * have the same reference as the function that was subscribed.\n\t * @example\n\t * // Unsubscribe from the 'click' event\n\t * const handler = (event) => {\n\t * \tconsole.log('Map was clicked', event);\n\t * };\n\t * map.off('click', handler);\n\t */\n\toff<EVENT_NAME extends EVENT>(\n\t\teventName: EVENT_NAME,\n\t\tfn: (\n\t\t\tpayload: EVENT_PAYLOAD[EVENT_NAME] extends {\n\t\t\t\tdata: null;\n\t\t\t}\n\t\t\t\t? EVENT_PAYLOAD[EVENT_NAME]['data']\n\t\t\t\t: EVENT_PAYLOAD[EVENT_NAME],\n\t\t) => void,\n\t) {\n\t\tif (!this._subscribers || this._subscribers[eventName] == null || this._destroyed) {\n\t\t\treturn;\n\t\t}\n\t\tconst itemIdx = this._subscribers[eventName]!.indexOf(fn);\n\n\t\tif (itemIdx !== -1) {\n\t\t\tthis._subscribers[eventName]!.splice(itemIdx, 1);\n\t\t}\n\t}\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tdestroy() {\n\t\tthis._destroyed = true;\n\t\tthis._subscribers = {};\n\t}\n}\n", "import type { MapView, TAnimateStateResult, TFacadeState } from '@mappedin/mappedin-js';\nimport { Facade, Floor, FloorStack } from '@mappedin/mappedin-js';\nimport type { DynamicFocusAnimationOptions } from './types';\n\nexport class Building {\n\t__type = 'building';\n\t#floorStack: FloorStack;\n\t#floorsById = new Map<string, Floor>();\n\t#floorsByElevation = new Map<number, Floor>();\n\t#floorsByElevationSorted: Floor[] = [];\n\t#mapView: MapView;\n\t#animationInProgress: { state: TFacadeState; animation: ReturnType<MapView['animateState']> } | undefined;\n\n\tdefaultFloor: Floor;\n\tactiveFloor: Floor;\n\texcluded = false;\n\tfloorsAltitudesMap: Map<number, { altitude: number; effectiveHeight: number }> = new Map();\n\taboveGroundFloors: Floor[] = [];\n\n\tconstructor(floorStack: FloorStack, mapView: MapView) {\n\t\tthis.#floorStack = floorStack;\n\t\tthis.#floorsById = new Map(floorStack.floors.map(floor => [floor.id, floor]));\n\t\tthis.#floorsByElevation = new Map(floorStack.floors.map(floor => [floor.elevation, floor]));\n\t\tthis.#floorsByElevationSorted = Array.from(this.#floorsByElevation.values()).sort(\n\t\t\t(a, b) => a.elevation - b.elevation,\n\t\t);\n\t\tthis.defaultFloor = floorStack.defaultFloor;\n\t\tthis.activeFloor = this.defaultFloor;\n\t\tthis.#mapView = mapView;\n\t\tthis.aboveGroundFloors = this.#floorsByElevationSorted.filter(floor => floor.elevation >= 0);\n\n\t\tconst sortedSpaces = floorStack.facade?.spaces\n\t\t\t.map(space => this.#mapView.getState(space))\n\t\t\t.sort((a, b) => a.altitude - b.altitude);\n\t\tif (sortedSpaces && sortedSpaces.length === this.aboveGroundFloors.length) {\n\t\t\tfor (const idx in this.aboveGroundFloors) {\n\t\t\t\tconst floor = this.aboveGroundFloors[idx];\n\t\t\t\tconst space = sortedSpaces[idx];\n\t\t\t\tthis.floorsAltitudesMap.set(floor.elevation, {\n\t\t\t\t\taltitude: space.altitude,\n\t\t\t\t\teffectiveHeight: space.height,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tget id() {\n\t\treturn this.#floorStack.id;\n\t}\n\n\tget name() {\n\t\treturn this.#floorStack.name;\n\t}\n\n\tget floors() {\n\t\treturn this.#floorStack.floors;\n\t}\n\n\tget floorStack() {\n\t\treturn this.#floorStack;\n\t}\n\n\tget facade() {\n\t\t// the floorstack must have a facade if we created a building for it\n\t\treturn this.#floorStack.facade!;\n\t}\n\n\tget isCurrentFloorStack() {\n\t\treturn this.id === this.#mapView.currentFloorStack.id;\n\t}\n\n\tget isIndoor() {\n\t\tconst state = this.#mapView.getState(this.facade);\n\n\t\treturn this.isCurrentFloorStack || (state?.visible === false && state?.opacity === 0);\n\t}\n\n\tget canSetFloor() {\n\t\treturn this.isIndoor || !this.excluded;\n\t}\n\n\t#maxElevation: number | undefined;\n\tget maxElevation() {\n\t\tif (this.#maxElevation == null) {\n\t\t\tthis.#maxElevation = Math.max(...this.#floorsByElevation.keys());\n\t\t}\n\n\t\treturn this.#maxElevation;\n\t}\n\n\t#minElevation: number | undefined;\n\tget minElevation() {\n\t\tif (this.#minElevation == null) {\n\t\t\tthis.#minElevation = Math.min(...this.#floorsByElevation.keys());\n\t\t}\n\n\t\treturn this.#minElevation;\n\t}\n\n\thas(f: Floor | FloorStack | Facade) {\n\t\tif (Floor.is(f)) {\n\t\t\treturn this.#floorsById.has(f.id);\n\t\t}\n\n\t\tif (FloorStack.is(f)) {\n\t\t\treturn f.id === this.#floorStack.id;\n\t\t}\n\n\t\tif (Facade.is(f)) {\n\t\t\treturn f.id === this.facade.id;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tgetFloorByElevation(elevation: number) {\n\t\treturn this.#floorsByElevation.get(elevation);\n\t}\n\n\tgetNearestFloorByElevation(targetElevation: number): Floor | undefined {\n\t\tconst exactMatch = this.getFloorByElevation(targetElevation);\n\t\tif (exactMatch) {\n\t\t\treturn exactMatch;\n\t\t}\n\n\t\tif (targetElevation >= 0) {\n\t\t\t// For positive elevations, return highest floor if target is above max\n\t\t\tif (targetElevation > this.maxElevation) {\n\t\t\t\treturn this.#floorsByElevationSorted[this.#floorsByElevationSorted.length - 1];\n\t\t\t}\n\n\t\t\t// Search backwards from the end\n\t\t\tfor (let i = this.#floorsByElevationSorted.length - 1; i >= 0; i--) {\n\t\t\t\tconst floor = this.#floorsByElevationSorted[i];\n\t\t\t\tif (floor.elevation <= targetElevation) {\n\t\t\t\t\treturn floor;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// For negative elevations (basements), return the lowest floor if target is below min\n\t\t\tif (targetElevation < this.minElevation) {\n\t\t\t\treturn this.#floorsByElevationSorted[0];\n\t\t\t}\n\n\t\t\t// Search forwards from the start\n\t\t\tfor (const floor of this.#floorsByElevationSorted) {\n\t\t\t\tif (floor.elevation >= targetElevation) {\n\t\t\t\t\treturn floor;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tgetHighestFloor(): Floor {\n\t\treturn this.#floorsByElevationSorted[this.#floorsByElevationSorted.length - 1];\n\t}\n\n\tcancelAnimation() {\n\t\tif (this.#animationInProgress) {\n\t\t\tthis.#animationInProgress.animation.cancel();\n\t\t\tthis.#animationInProgress = undefined;\n\t\t}\n\t}\n\n\tasync animateFacade(\n\t\tnewState: TFacadeState,\n\t\toptions: DynamicFocusAnimationOptions = { duration: 150 },\n\t): Promise<TAnimateStateResult> {\n\t\tconst currentState = this.#animationInProgress?.state || this.#mapView.getState(this.facade);\n\t\tif (\n\t\t\t!currentState ||\n\t\t\t!newState ||\n\t\t\t(currentState?.opacity === newState.opacity && currentState?.visible === newState.visible)\n\t\t) {\n\t\t\t// nothing to do\n\t\t\treturn { result: 'completed' };\n\t\t}\n\n\t\tthis.cancelAnimation();\n\t\tconst { opacity, visible } = newState;\n\n\t\t// always set facade visible so it can be seen during animation\n\t\tthis.#mapView.updateState(this.facade, {\n\t\t\tvisible: true,\n\t\t});\n\n\t\tif (opacity !== undefined) {\n\t\t\tthis.#animationInProgress = {\n\t\t\t\tanimation: this.#mapView.animateState(\n\t\t\t\t\tthis.facade,\n\t\t\t\t\t{\n\t\t\t\t\t\topacity,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: options.duration,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\tstate: newState,\n\t\t\t};\n\t\t\tconst result = await this.#animationInProgress.animation;\n\n\t\t\tthis.#animationInProgress = undefined;\n\n\t\t\tif (result.result === 'cancelled') {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\n\t\tif (visible === false) {\n\t\t\tthis.#mapView.updateState(this.facade, {\n\t\t\t\tvisible,\n\t\t\t});\n\t\t}\n\n\t\treturn { result: 'completed' };\n\t}\n\n\tdestroy() {\n\t\tthis.cancelAnimation();\n\t\t// Hide all floors except current floor\n\t\tthis.#floorStack.floors.forEach(floor => {\n\t\t\tthis.#mapView.updateState(floor, {\n\t\t\t\tvisible: floor.id === this.#mapView.currentFloor.id,\n\t\t\t});\n\t\t});\n\t\t// Show the facade if the current floor is not in this building\n\t\tif (!this.has(this.#mapView.currentFloor)) {\n\t\t\tthis.#mapView.updateState(this.facade, {\n\t\t\t\tvisible: true,\n\t\t\t\topacity: 1,\n\t\t\t});\n\t\t}\n\t}\n}\n", "import type { Facade, Floor, FloorStack, TFloorState } from '@mappedin/mappedin-js';\nimport type { Building } from './building';\nimport type {\n\tBuildingAnimation,\n\tBuildingFacadeState,\n\tBuildingFloorStackState,\n\tDynamicFocusMode,\n\tMultiFloorVisibilityState,\n\tZoomState,\n} from './types';\nimport type { Outdoors } from './outdoors';\n\n/**\n * Calculates the zoom state based on camera zoom level and thresholds.\n */\nexport function getZoomState(zoomLevel: number, indoorThreshold: number, outdoorThreshold: number): ZoomState {\n\tif (zoomLevel >= indoorThreshold) {\n\t\treturn 'in-range';\n\t}\n\tif (zoomLevel <= outdoorThreshold) {\n\t\treturn 'out-of-range';\n\t}\n\n\treturn 'transition';\n}\n\nexport function getFloorToShow(\n\ttarget: Building | Outdoors,\n\tmode: DynamicFocusMode,\n\televation: number,\n): Floor | undefined {\n\tif (target.__type === 'outdoors' && 'floor' in target) {\n\t\treturn target.floor;\n\t}\n\n\tconst building = target as Building;\n\tif (building.excluded) {\n\t\treturn building.activeFloor;\n\t}\n\n\tswitch (mode) {\n\t\tcase 'lock-elevation':\n\t\t\treturn building.getFloorByElevation(elevation);\n\t\tcase 'nearest-elevation':\n\t\t\treturn building.getNearestFloorByElevation(elevation);\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\t// if the building is already showing, don't switch to the default floor\n\treturn building.isIndoor ? building.activeFloor : building.defaultFloor;\n}\n\nexport function getFacadeState(facade: Facade, inFocus: boolean): BuildingFacadeState {\n\treturn {\n\t\tfacade,\n\t\tstate: {\n\t\t\ttype: 'facade',\n\t\t\tvisible: !inFocus,\n\t\t\topacity: inFocus ? 0 : 1,\n\t\t},\n\t};\n}\n\nexport function getSingleBuildingState(\n\tfloorStack: FloorStack,\n\tcurrentFloor: Floor,\n\tinFocus: boolean,\n): BuildingFloorStackState {\n\treturn {\n\t\toutdoorOpacity: 1,\n\t\tfloorStates: floorStack.floors.map(f => {\n\t\t\tconst visible = f.id === currentFloor.id && inFocus;\n\n\t\t\treturn {\n\t\t\t\tfloor: f,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: 'floor',\n\t\t\t\t\tvisible: visible,\n\t\t\t\t\tgeometry: {\n\t\t\t\t\t\tvisible: visible,\n\t\t\t\t\t},\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tenabled: visible,\n\t\t\t\t\t},\n\t\t\t\t\tmarkers: {\n\t\t\t\t\t\tenabled: visible,\n\t\t\t\t\t},\n\t\t\t\t\tfootprint: {\n\t\t\t\t\t\tvisible: false,\n\t\t\t\t\t},\n\t\t\t\t\tocclusion: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t},\n\t\t\t\t} as Required<TFloorState>,\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/**\n * Calculates the outdoor opacity based on floor stack states and mode.\n */\nexport function getOutdoorOpacity(floorStackStates: BuildingFloorStackState[], mode: DynamicFocusMode): number {\n\tif (!mode.includes('lock-elevation')) {\n\t\treturn 1;\n\t}\n\n\tfor (const state of floorStackStates) {\n\t\tif (state.outdoorOpacity >= 0 && state.outdoorOpacity <= 1) {\n\t\t\treturn state.outdoorOpacity;\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nexport function getSetFloorTargetFromZoomState(\n\tbuildings: Building[],\n\toutdoors: Outdoors,\n\tzoomState: ZoomState,\n): Building | Outdoors | undefined {\n\tswitch (zoomState) {\n\t\tcase 'in-range':\n\t\t\treturn buildings[0]?.canSetFloor ? buildings[0] : undefined;\n\t\tcase 'out-of-range':\n\t\t\treturn outdoors;\n\t\tcase 'transition':\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Gets the building states for all buildings.\n */\nexport function getBuildingStates(\n\tbuildings: Building[],\n\tinViewSet: Set<string>,\n\tcurrentFloor: Floor,\n\tzoomState: ZoomState,\n\tmode: DynamicFocusMode,\n\televation: number,\n\tfloorIdsInNavigation: string[],\n\tfloorStackIdsInNavigation: string[],\n\tmultiFloorView: any,\n\tgetMultiFloorState: MultiFloorVisibilityState,\n\tdynamicBuildingInteriors: boolean,\n): Map<\n\tstring,\n\t{\n\t\tbuilding: Building;\n\t\tshowIndoor: boolean;\n\t\tfloorStackState: BuildingFloorStackState;\n\t\tfacadeState: BuildingFacadeState;\n\t\tinFocus: boolean;\n\t\tfloorToShow: Floor | undefined;\n\t}\n> {\n\tconst buildingStates = new Map();\n\n\tfor (const building of buildings) {\n\t\tconst inCameraView = inViewSet.has(building.id);\n\t\tconst showIndoor = shouldShowIndoor(\n\t\t\tbuilding,\n\t\t\tcurrentFloor,\n\t\t\tzoomState === 'in-range',\n\t\t\tinCameraView,\n\t\t\tmode,\n\t\t\televation,\n\t\t\tfloorStackIdsInNavigation.includes(building.id),\n\t\t\tdynamicBuildingInteriors,\n\t\t);\n\n\t\tconst floorToShow =\n\t\t\tcurrentFloor.floorStack.id === building.id ? building.activeFloor : getFloorToShow(building, mode, elevation);\n\n\t\tconst floorStackState = multiFloorView.enabled\n\t\t\t? getMultiFloorState(\n\t\t\t\t\tbuilding.floors,\n\t\t\t\t\tfloorToShow || building.activeFloor,\n\t\t\t\t\tmultiFloorView?.floorGap,\n\t\t\t\t\tfloorIdsInNavigation,\n\t\t\t\t\tbuilding.floorsAltitudesMap,\n\t\t\t )\n\t\t\t: getSingleBuildingState(building.floorStack, floorToShow || building.activeFloor, showIndoor);\n\n\t\tconst facadeState = getFacadeState(building.facade, showIndoor);\n\t\tbuildingStates.set(building.id, {\n\t\t\tbuilding,\n\t\t\tshowIndoor,\n\t\t\tfloorStackState,\n\t\t\tfacadeState,\n\t\t\tinFocus: inCameraView,\n\t\t\tfloorToShow,\n\t\t});\n\t}\n\n\treturn buildingStates;\n}\n\nexport function getBuildingAnimationType(building: Building, showIndoor: boolean): BuildingAnimation {\n\tif (building.excluded) {\n\t\treturn 'none';\n\t}\n\n\tif (showIndoor) {\n\t\treturn 'indoor';\n\t}\n\n\treturn 'outdoor';\n}\n\n/**\n * Determines if a building's indoor floors should be shown through a number of different state checks.\n */\nexport function shouldShowIndoor(\n\tbuilding: Building,\n\tcurrentFloor: Floor,\n\tinRange: boolean,\n\tinFocus: boolean,\n\tmode: DynamicFocusMode,\n\televation: number,\n\tinNavigation: boolean,\n\tdynamicBuildingInteriors: boolean,\n): boolean {\n\t// always show the current floor regardless of any other states\n\tif (building.id === currentFloor.floorStack.id) {\n\t\treturn true;\n\t}\n\n\t// if the building is excluded, we don't control the visibility, so don't show it\n\tif (building.excluded) {\n\t\treturn false;\n\t}\n\n\t// if it's not excluded, always show the navigation\n\tif (inNavigation === true) {\n\t\treturn true;\n\t}\n\n\t// Without dynamic building interiors, we only rely on whether the current floor is indoor or outdoor\n\tif (!dynamicBuildingInteriors) {\n\t\treturn currentFloor.floorStack.type !== 'Outdoor';\n\t}\n\n\t// the following cases rely on the camera being in range\n\tif (!inRange) {\n\t\treturn false;\n\t}\n\n\t// the following cases rely on the building being in focus\n\tif (!inFocus) {\n\t\treturn false;\n\t}\n\n\tswitch (mode) {\n\t\tcase 'lock-elevation':\n\t\t\treturn building.getFloorByElevation(elevation) != null;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn true;\n}\n\nexport function shouldDeferSetFloor(\n\ttrackedCameraElevation: number,\n\tcurrentCameraElevation: number,\n\tuserInteracting: boolean,\n): boolean {\n\treturn trackedCameraElevation !== currentCameraElevation && !userInteracting;\n}\n", "import type { Facade, Floor, TFacadeState } from '@mappedin/mappedin-js';\nimport type { VisibilityState as BuildingFloorStackState } from '../../mappedin-js/src/api-geojson/multi-floor';\n\nexport type MultiFloorVisibilityState = (\n\tfloors: Floor[],\n\tcurrentFloor: Floor,\n\tfloorGap: number,\n\tfloorIdsInNavigation: Floor['id'][],\n\tfloorsVisualHeightMap?: Map<number, { altitude: number; effectiveHeight: number }>,\n) => BuildingFloorStackState;\n\nexport type DynamicFocusAnimationOptions = {\n\t/**\n\t * The duration of the animation in milliseconds.\n\t * @default 150\n\t */\n\tduration: number;\n};\n\n/**\n * Array of valid dynamic focus modes for runtime validation.\n */\nexport const DYNAMIC_FOCUS_MODES = ['default-floor', 'lock-elevation', 'nearest-elevation'] as const;\n\n/**\n * The mode which determines the indoor floor to reveal when the camera focuses on a facade.\n * - 'default-floor' - Show the default floor of the floor stack.\n * - 'lock-elevation' - Show the floor at the current elevation, if possible.\n * When a floor stack does not have a floor at the current elevation, no indoor floor will be shown.\n * - 'nearest-elevation' - Show the floor at the current elevation, if possible.\n * When a floor stack does not have a floor at the current elevation, show the indoor floor at the nearest lower elevation.\n */\nexport type DynamicFocusMode = (typeof DYNAMIC_FOCUS_MODES)[number];\n\n/**\n * State of the Dynamic Focus controller.\n */\nexport type DynamicFocusState = {\n\t/**\n\t * Whether to automatically focus on the outdoors when the camera moves in range.\n\t * @default true\n\t */\n\tautoFocus: boolean;\n\t/**\n\t * The zoom level at which the camera will fade out the facades and fade in the indoor floors.\n\t * @default 18\n\t */\n\tindoorZoomThreshold: number;\n\t/**\n\t * The zoom level at which the camera will fade in the facades and fade out the indoor floors.\n\t * @default 17\n\t */\n\toutdoorZoomThreshold: number;\n\t/**\n\t * Whether to set the floor to the outdoors when the camera moves in range.\n\t * @default true\n\t */\n\tsetFloorOnFocus: boolean;\n\t/**\n\t * Options for the animation when fading out the facade to reveal the interior.\n\t */\n\tindoorAnimationOptions: DynamicFocusAnimationOptions;\n\t/**\n\t * Options for the animation when fading in the facade to hide the interior.\n\t */\n\toutdoorAnimationOptions: DynamicFocusAnimationOptions;\n\t/**\n\t * The mode of the Dynamic Focus controller.\n\t * @default 'default-floor'\n\t */\n\tmode: DynamicFocusMode;\n\t/**\n\t * Whether to automatically adjust facade heights to align with floor boundaries in multi-floor buildings.\n\t * @default false\n\t */\n\tautoAdjustFacadeHeights: boolean;\n\t/**\n\t * Whether to automatically hide the indoors of buildings not in or near the camera's view.\n\t * @default true\n\t */\n\tdynamicBuildingInteriors: boolean;\n\t/**\n\t * Whether to preload the geometry of the initial floors in each building. Improves performance when rendering the building for the first time.\n\t * @default true\n\t */\n\tpreloadFloors: boolean;\n\n\t/**\n\t * @experimental\n\t * @internal\n\t * A custom function to override the default floor visibility state.\n\t * This is useful for customizing the floor visibility state for a specific building.\n\t */\n\tcustomMultiFloorVisibilityState?: MultiFloorVisibilityState;\n};\n\n/**\n * Internal events emitted for updating React state.\n */\nexport type InternalDynamicFocusEvents = {\n\t'state-change': undefined;\n};\n\n/**\n * Events emitted by the Dynamic Focus controller.\n */\nexport type DynamicFocusEvents = {\n\t/**\n\t * Emitted when the Dynamic Focus controller triggers a focus update either from a camera change or manually calling `focus()`.\n\t */\n\tfocus: {\n\t\tfacades: Facade[];\n\t};\n};\n\nexport type DynamicFocusEventPayload<EventName extends keyof DynamicFocusEvents> =\n\tDynamicFocusEvents[EventName] extends { data: null }\n\t\t? DynamicFocusEvents[EventName]['data']\n\t\t: DynamicFocusEvents[EventName];\n\nexport type BuildingFacadeState = {\n\tfacade: Facade;\n\tstate: TFacadeState;\n};\n\nexport type BuildingState = BuildingFloorStackState & {\n\tfacadeState: BuildingFacadeState;\n};\n\nexport type ZoomState = 'in-range' | 'out-of-range' | 'transition';\nexport type ViewState = 'indoor' | 'outdoor' | 'transition';\n\nexport type BuildingAnimation = 'indoor' | 'outdoor' | 'none';\n\nexport type { BuildingFloorStackState };\n", "import { Floor, FloorStack } from '@mappedin/mappedin-js';\nimport { clampWithWarning } from '@packages/internal/common/math-utils';\nimport Logger from '@packages/internal/common/Mappedin.Logger';\n\n/**\n * Validates that a floor belongs to the specified floor stack.\n */\nexport function validateFloorForStack(floor: Floor, floorStack: FloorStack): boolean {\n\tif (!Floor.is(floor) || floor?.floorStack == null || !FloorStack.is(floorStack)) {\n\t\treturn false;\n\t}\n\n\tif (floor.floorStack.id !== floorStack.id) {\n\t\tLogger.warn(`Floor (${floor.id}) does not belong to floor stack (${floorStack.id}).`);\n\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Validates and clamps zoom threshold values.\n */\nexport function validateZoomThreshold(value: number, min: number, max: number, name: string): number {\n\treturn clampWithWarning(value, min, max, `${name} must be between ${min} and ${max}.`);\n}\n", "/* eslint-disable no-console*/\nexport const MI_DEBUG_KEY = 'mi-debug';\nexport const MI_ERROR_LABEL = '[MappedinJS]';\n\nexport enum E_SDK_LOG_LEVEL {\n\tLOG,\n\tWARN,\n\tERROR,\n\tSILENT,\n}\n\nexport function createLogger(name = '', { prefix = MI_ERROR_LABEL } = {}) {\n\tconst label = `${prefix}${name ? `-${name}` : ''}`;\n\n\tconst rnDebug = (type: 'log' | 'warn' | 'error', args: any[]) => {\n\t\tif (typeof window !== 'undefined' && (window as any).rnDebug) {\n\t\t\tconst processed = args.map(arg => {\n\t\t\t\tif (arg instanceof Error && arg.stack) {\n\t\t\t\t\treturn `${arg.message}\\n${arg.stack}`;\n\t\t\t\t}\n\n\t\t\t\treturn arg;\n\t\t\t});\n\t\t\t(window as any).rnDebug(`${name} ${type}: ${processed.join(' ')}`);\n\t\t}\n\t};\n\n\treturn {\n\t\tlogState: process.env.NODE_ENV === 'test' ? E_SDK_LOG_LEVEL.SILENT : E_SDK_LOG_LEVEL.LOG,\n\n\t\tlog(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.LOG) {\n\t\t\t\tconsole.log(label, ...args);\n\t\t\t\trnDebug('log', args);\n\t\t\t}\n\t\t},\n\n\t\twarn(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.WARN) {\n\t\t\t\tconsole.warn(label, ...args);\n\t\t\t\trnDebug('warn', args);\n\t\t\t}\n\t\t},\n\n\t\terror(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.ERROR) {\n\t\t\t\tconsole.error(label, ...args);\n\n\t\t\t\trnDebug('error', args);\n\t\t\t}\n\t\t},\n\n\t\t// It's a bit tricky to prepend [MappedinJs] to assert and time because of how the output is structured in the console, so it is left out for simplicity\n\t\tassert(...args: any[]) {\n\t\t\tconsole.assert(...args);\n\t\t},\n\n\t\ttime(label: string) {\n\t\t\tconsole.time(label);\n\t\t},\n\n\t\ttimeEnd(label: string) {\n\t\t\tconsole.timeEnd(label);\n\t\t},\n\t\tsetLevel(level: E_SDK_LOG_LEVEL) {\n\t\t\tif (E_SDK_LOG_LEVEL.LOG <= level && level <= E_SDK_LOG_LEVEL.SILENT) {\n\t\t\t\tthis.logState = level;\n\t\t\t}\n\t\t},\n\t};\n}\n\nconst Logger = createLogger();\nexport function setLoggerLevel(level: E_SDK_LOG_LEVEL) {\n\tif (E_SDK_LOG_LEVEL.LOG <= level && level <= E_SDK_LOG_LEVEL.SILENT) {\n\t\tLogger.logState = level;\n\t}\n}\n\nexport default Logger;\n", "import Logger from './Mappedin.Logger';\n\n/**\n * Clamp a number between lower and upper bounds with a warning\n */\nexport function clampWithWarning(x: number, lower: number, upper: number, warning: string) {\n\tif (x < lower || x > upper) {\n\t\tLogger.warn(warning);\n\t}\n\n\treturn Math.min(upper, Math.max(lower, x));\n}\n", "import { createLogger } from '../../packages/common/Mappedin.Logger';\n\nexport const Logger = createLogger('', { prefix: '[DynamicFocus]' });\n", "import type { FloorStack, MapView } from '@mappedin/mappedin-js';\nimport { Logger } from './logger';\nimport type { Building } from './building';\n\nexport class Outdoors {\n\t__type = 'outdoors';\n\t#floorStack: FloorStack;\n\t#mapView: MapView;\n\n\tconstructor(floorStack: FloorStack, mapView: MapView) {\n\t\tthis.#floorStack = floorStack;\n\t\tthis.#mapView = mapView;\n\t}\n\n\tget id() {\n\t\treturn this.#floorStack.id;\n\t}\n\n\tget floorStack() {\n\t\treturn this.#floorStack;\n\t}\n\n\tget floor() {\n\t\t// outdoors should only have 1 floor\n\t\treturn this.#floorStack.defaultFloor;\n\t}\n\n\tmatchesFloorStack(floorStack: FloorStack | string) {\n\t\treturn floorStack === this.#floorStack || floorStack === this.#floorStack.id;\n\t}\n\n\t#setVisible(visible: boolean) {\n\t\tfor (const floor of this.#floorStack.floors) {\n\t\t\tthis.#mapView.updateState(floor, {\n\t\t\t\tvisible,\n\t\t\t});\n\t\t}\n\t}\n\n\tshow() {\n\t\tthis.#setVisible(true);\n\t}\n\n\thide() {\n\t\tthis.#setVisible(false);\n\t}\n\n\tdestroy() {\n\t\tif (!this.matchesFloorStack(this.#mapView.currentFloorStack)) {\n\t\t\tthis.hide();\n\t\t}\n\t}\n}\n\nexport function getOutdoorFloorStack(floorStacks: FloorStack[], buildingsSet: Map<string, Building>): FloorStack {\n\tconst outdoorFloorStack = floorStacks.find(floorStack => floorStack.type?.toLowerCase() === 'outdoor');\n\n\tif (outdoorFloorStack) {\n\t\treturn outdoorFloorStack;\n\t}\n\n\t// If no outdoor type found, find the first floor stack that does not have a facade or is already in the buildings set\n\tconst likelyOutdoorFloorStack = floorStacks.find(\n\t\tfloorStack => floorStack.facade == null && !buildingsSet.has(floorStack.id),\n\t);\n\n\tif (likelyOutdoorFloorStack) {\n\t\treturn likelyOutdoorFloorStack;\n\t}\n\n\tLogger.warn('No good candidate for the outdoor floor stack was found. Using the first floor stack.');\n\n\treturn floorStacks[0];\n}\n", "import { getMultiFloorState } from '@mappedin/mappedin-js';\nimport type { RequiredDeep } from 'type-fest';\nimport type { DynamicFocusState } from './types';\n\nexport const DEFAULT_STATE: RequiredDeep<DynamicFocusState> = {\n\tindoorZoomThreshold: 18,\n\toutdoorZoomThreshold: 17,\n\tsetFloorOnFocus: true,\n\tautoFocus: false,\n\tindoorAnimationOptions: {\n\t\tduration: 150,\n\t},\n\toutdoorAnimationOptions: {\n\t\tduration: 150,\n\t},\n\tautoAdjustFacadeHeights: false,\n\tmode: 'default-floor',\n\tpreloadFloors: true,\n\tcustomMultiFloorVisibilityState: getMultiFloorState,\n\tdynamicBuildingInteriors: true,\n};\n"],
5
- "mappings": "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",
6
- "names": ["Floor", "getMultiFloorState", "getMultiFloorState", "Floor", "FloorStack", "label", "Floor", "FloorStack", "Logger", "Logger", "Logger", "Floor", "getMultiFloorState"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/react/use-dynamic-focus.ts", "../../../src/react/use-dynamic-focus-event.ts"],
4
- "sourcesContent": ["import { useCallback, useState, useMemo } from 'react';\nimport { DynamicFocus } from '../dynamic-focus';\nimport { useMap, useMapViewExtension } from '@mappedin/react-sdk';\n\n/**\n * Simple hook to force a re-render when the returned function is called\n */\nfunction useForceUpdate() {\n\tconst [, setState] = useState({});\n\treturn useCallback(() => setState({}), []);\n}\n\nexport function useDynamicFocus(): DynamicFocus {\n\tconst { mapView } = useMap();\n\n\t// Force a re-render on dynamic focus state change to sync it up with react render cycle\n\t// The benefit of this is that dynamic focus states like isIndoor or isOutdoor changing will update the react component\n\tconst forceUpdate = useForceUpdate();\n\n\t// Register or retrieve the existing instance from the extension registry\n\tconst { register } = useMapViewExtension('dynamic-focus', {\n\t\tonRegister: () => {\n\t\t\tconst df = new DynamicFocus(mapView);\n\t\t\tdf.on('state-change' as any, forceUpdate);\n\t\t\treturn df;\n\t\t},\n\t\tonDeregister: df => {\n\t\t\tdf.off('state-change' as any, forceUpdate);\n\t\t\tdf.destroy();\n\t\t},\n\t});\n\tconst dynamicFocus = register();\n\n\tif (!dynamicFocus) {\n\t\t// We should never reach this error, but if we do something went really wrong\n\t\tthrow new Error('DynamicFocus is not initialized');\n\t}\n\n\t// Create a stable proxy using useMemo - only recreates when dynamicFocus changes\n\treturn useMemo(() => {\n\t\tconst boundFunctions = new WeakMap<object, unknown>();\n\n\t\treturn new Proxy(dynamicFocus, {\n\t\t\tget(target, prop) {\n\t\t\t\tconst value = target[prop as keyof DynamicFocus];\n\t\t\t\tif (typeof value === 'function') {\n\t\t\t\t\t// Cache bound functions by original function reference\n\t\t\t\t\tif (!boundFunctions.has(value)) {\n\t\t\t\t\t\tboundFunctions.set(value, value.bind(target));\n\t\t\t\t\t}\n\t\t\t\t\treturn boundFunctions.get(value);\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t},\n\t\t});\n\t}, [dynamicFocus]);\n}\n", "import { useCallback, useEffect, useRef } from 'react';\nimport type { DynamicFocusEvents } from '../types';\nimport { useDynamicFocus } from './use-dynamic-focus';\n\nexport function useDynamicFocusEvent<T extends keyof DynamicFocusEvents>(\n\tevent: T,\n\tcallback: (event: DynamicFocusEvents[T]) => void,\n) {\n\t// this may create a new instance of dynamic focus if the developer hasn't yet\n\t// but it will not be enabled until the developer calls enable()\n\tconst instance = useDynamicFocus();\n\tconst callbackRef = useRef(callback);\n\tcallbackRef.current = callback;\n\n\tconst handleCallback = useCallback(payload => {\n\t\tcallbackRef.current(payload);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (instance == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tinstance.on(event, handleCallback);\n\n\t\treturn () => {\n\t\t\tif (instance == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinstance.off(event, handleCallback);\n\t\t};\n\t}, [instance, event, handleCallback]);\n}\n"],
5
- "mappings": ";;;;;;AAAA,SAAS,aAAa,UAAU,eAAe;AAE/C,SAAS,QAAQ,2BAA2B;AAK5C,SAAS,iBAAiB;AACzB,QAAM,CAAC,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;AAChC,SAAO,YAAY,MAAM,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1C;AAHS;AAKF,SAAS,kBAAgC;AAC/C,QAAM,EAAE,QAAQ,IAAI,OAAO;AAI3B,QAAM,cAAc,eAAe;AAGnC,QAAM,EAAE,SAAS,IAAI,oBAAoB,iBAAiB;AAAA,IACzD,YAAY,6BAAM;AACjB,YAAM,KAAK,IAAI,aAAa,OAAO;AACnC,SAAG,GAAG,gBAAuB,WAAW;AACxC,aAAO;AAAA,IACR,GAJY;AAAA,IAKZ,cAAc,+BAAM;AACnB,SAAG,IAAI,gBAAuB,WAAW;AACzC,SAAG,QAAQ;AAAA,IACZ,GAHc;AAAA,EAIf,CAAC;AACD,QAAM,eAAe,SAAS;AAE9B,MAAI,CAAC,cAAc;AAElB,UAAM,IAAI,MAAM,iCAAiC;AAAA,EAClD;AAGA,SAAO,QAAQ,MAAM;AACpB,UAAM,iBAAiB,oBAAI,QAAyB;AAEpD,WAAO,IAAI,MAAM,cAAc;AAAA,MAC9B,IAAI,QAAQ,MAAM;AACjB,cAAM,QAAQ,OAAO,IAA0B;AAC/C,YAAI,OAAO,UAAU,YAAY;AAEhC,cAAI,CAAC,eAAe,IAAI,KAAK,GAAG;AAC/B,2BAAe,IAAI,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,UAC7C;AACA,iBAAO,eAAe,IAAI,KAAK;AAAA,QAChC;AACA,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAClB;AA5CgB;;;ACZhB,SAAS,eAAAA,cAAa,WAAW,cAAc;AAIxC,SAAS,qBACf,OACA,UACC;AAGD,QAAM,WAAW,gBAAgB;AACjC,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,iBAAiBC,aAAY,aAAW;AAC7C,gBAAY,QAAQ,OAAO;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACf,QAAI,YAAY,MAAM;AACrB;AAAA,IACD;AAEA,aAAS,GAAG,OAAO,cAAc;AAEjC,WAAO,MAAM;AACZ,UAAI,YAAY,MAAM;AACrB;AAAA,MACD;AACA,eAAS,IAAI,OAAO,cAAc;AAAA,IACnC;AAAA,EACD,GAAG,CAAC,UAAU,OAAO,cAAc,CAAC;AACrC;AA5BgB;",
6
- "names": ["useCallback", "useCallback"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/rn/use-dynamic-focus.ts", "../../src/rn/use-dynamic-focus-events.ts", "../../../packages/common/Mappedin.Logger.ts", "../../src/logger.ts", "../../src/rn/utils/facade-hydration.ts", "../../src/rn/use-dynamic-focus-registration.ts", "../../src/rn/extension-source.ts"],
4
- "sourcesContent": ["import { useState, useCallback, useContext, useRef } from 'react';\nimport type { DynamicFocusState } from '../types';\nimport { MappedinContext } from '@mappedin/react-native-sdk';\nimport type { Facade } from '@mappedin/mappedin-js';\nimport { useDynamicFocusEvent } from './use-dynamic-focus-events';\nimport { useDynamicFocusRegistration } from './use-dynamic-focus-registration';\n\n/**\n * Extension state for Dynamic Focus that includes the current focused facades\n */\nexport interface DynamicFocusExtensionState {\n\t/**\n\t * Whether the extension is currently enabled\n\t */\n\tisEnabled: boolean;\n\t/**\n\t * The currently focused facades\n\t */\n\tfocusedFacades: Facade[];\n}\n\n// Dynamic Focus hook return type\nexport interface UseDynamicFocusResult {\n\t/**\n\t * Whether the extension is ready and initialized\n\t */\n\tisReady: boolean;\n\t/**\n\t * Whether the extension is currently enabled\n\t */\n\tisEnabled: boolean;\n\t/**\n\t * The currently focused facades\n\t */\n\tfocusedFacades: Facade[];\n\t/**\n\t * Updates the state of the Dynamic Focus controller.\n\t * @param state - The state to update\n\t * @returns Promise resolving to the updated complete state\n\t * @see {@link DynamicFocus.updateState}\n\t */\n\tupdateState(state: Partial<DynamicFocusState>): Promise<DynamicFocusState>;\n\n\t/**\n\t * Returns the current state of the Dynamic Focus controller.\n\t * @returns Promise resolving to the current state\n\t * @see {@link DynamicFocus.getState}\n\t */\n\tgetState(): Promise<DynamicFocusState>;\n\n\t/**\n\t * Perform a manual visual update of the focused facades, and optionally set the floor.\n\t * @param setFloor - Whether to set the floor. This will default to the current state of setFloorOnFocus.\n\t * @returns Promise that resolves when the focus operation is complete\n\t * @see {@link DynamicFocus.focus}\n\t */\n\tfocus(setFloor?: boolean): Promise<void>;\n\n\t/**\n\t * Disables the Dynamic Focus instance and unsubscribes all MapView event listeners.\n\t * @returns Promise that resolves when disabling is complete\n\t * @see {@link DynamicFocus.disable}\n\t */\n\tdisable(): Promise<void>;\n\n\t/**\n\t * Enables Dynamic Focus with the given options.\n\t * @param options - The options to enable Dynamic Focus with\n\t * @returns Promise that resolves when enabling is complete\n\t * @see {@link DynamicFocus.enable}\n\t */\n\tenable(options?: Partial<DynamicFocusState>): Promise<void>;\n}\n\n/**\n * React hook for using DynamicFocus extension in React Native WebView\n *\n * This hook provides an API for interacting with the DynamicFocus extension:\n * - Uses the shared state system for automatic extension registration\n * - Provides methods for controlling dynamic focus behavior\n * - Handles bridge communication and error management\n *\n * @returns Hook API object with Dynamic Focus methods\n *\n *\n * @example\n * ```tsx\n * import { MapView } from '@mappedin/react-native-sdk';\n * import { useDynamicFocus } from '@mappedin/dynamic-focus/rn';\n *\n * function MyComponent() {\n * const { updateState, isReady } = useDynamicFocus();\n *\n * // Use the Dynamic Focus API\n * React.useEffect(() => {\n * if (isReady) {\n * updateState({ autoFocus: true });\n * }\n * }, [isReady]);\n * }\n * ```\n */\nexport function useDynamicFocus(): UseDynamicFocusResult {\n\tconst context = useContext(MappedinContext);\n\tconst { bridge, extensions, updateExtensionState } = context;\n\n\t// Use registration hook to handle extension registration (no parameters needed)\n\tuseDynamicFocusRegistration();\n\n\t// Get extension state from context - properly typed now, no casting needed!\n\tconst extensionState = extensions['dynamic-focus'];\n\tconst registrationState = extensionState?.registrationState || 'unregistered';\n\tconst isReady = registrationState === 'registered'; // Backward compatibility\n\tconst isEnabled = extensionState?.isEnabled || false;\n\n\t// State for focused facades\n\tconst [focusedFacades, setFocusedFacades] = useState<Facade[]>(extensionState?.focusedFacades || []);\n\n\t// Use ref to maintain stable reference for extensions for memoization\n\tconst extensionsRef = useRef(extensions);\n\n\t// Update ref on each render\n\textensionsRef.current = extensions;\n\n\t// Extension registration is handled by useDynamicFocusRegistration\n\n\t// Listen for focus events to update focused facades\n\tuseDynamicFocusEvent(\n\t\t'focus',\n\t\tuseCallback(\n\t\t\tevent => {\n\t\t\t\tconst newFocusedFacades = event.facades;\n\t\t\t\tsetFocusedFacades(newFocusedFacades);\n\n\t\t\t\t// Update extension state to persist facades - use callback to merge\n\t\t\t\tupdateExtensionState('dynamic-focus', prev => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tregistrationState,\n\t\t\t\t\tfocusedFacades: newFocusedFacades,\n\t\t\t\t}));\n\t\t\t},\n\t\t\t[registrationState, updateExtensionState],\n\t\t),\n\t);\n\n\t/**\n\t * Helper function to make extension method calls through the bridge\n\t */\n\tconst callExtensionMethod = useCallback(\n\t\tasync <T = any>(method: string, args: any[] = []): Promise<T> => {\n\t\t\tif (!bridge?.isReady) {\n\t\t\t\tthrow new Error('Bridge is not ready. Ensure the WebView is loaded.');\n\t\t\t}\n\n\t\t\treturn (await bridge!.instruct({\n\t\t\t\ttype: 'extension',\n\t\t\t\tpayload: {\n\t\t\t\t\tname: 'dynamic-focus',\n\t\t\t\t\tmethod,\n\t\t\t\t\targs,\n\t\t\t\t},\n\t\t\t})) as T;\n\t\t},\n\t\t[bridge],\n\t);\n\n\t// Memoize the enable method to prevent unnecessary re-renders\n\tconst enable = useCallback(\n\t\tasync (options?: Partial<DynamicFocusState>): Promise<void> => {\n\t\t\t// Get current isEnabled state from context using ref to avoid dependency\n\t\t\tconst currentExtensionState = extensionsRef.current?.['dynamic-focus'];\n\t\t\tconst currentIsEnabled = currentExtensionState?.isEnabled || false;\n\n\t\t\t// Check if already enabled to avoid unnecessary calls\n\t\t\tif (currentIsEnabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait callExtensionMethod<void>('enable', [options]);\n\n\t\t\t// Update extension state to reflect enabled status - use callback to merge\n\t\t\tupdateExtensionState('dynamic-focus', prev => ({ ...prev, isEnabled: true }));\n\t\t},\n\t\t[callExtensionMethod, updateExtensionState],\n\t);\n\n\t// Memoize the updateState method to prevent unnecessary re-renders\n\tconst updateState = useCallback(\n\t\tasync (state: Partial<DynamicFocusState>): Promise<DynamicFocusState> => {\n\t\t\treturn await callExtensionMethod<DynamicFocusState>('updateState', [state]);\n\t\t},\n\t\t[callExtensionMethod],\n\t);\n\n\t// Memoize the getState method to prevent unnecessary re-renders\n\tconst getState = useCallback(async (): Promise<DynamicFocusState> => {\n\t\treturn await callExtensionMethod<DynamicFocusState>('getState');\n\t}, [callExtensionMethod]);\n\n\t// Memoize the focus method to prevent unnecessary re-renders\n\tconst focus = useCallback(\n\t\tasync (setFloor?: boolean): Promise<void> => {\n\t\t\treturn await callExtensionMethod<void>('focus', [setFloor]);\n\t\t},\n\t\t[callExtensionMethod],\n\t);\n\n\t// Memoize the disable method to prevent unnecessary re-renders\n\tconst disable = useCallback(async (): Promise<void> => {\n\t\tawait callExtensionMethod<void>('disable');\n\t\t// Set extension state to idle after disabling and clear facades\n\t\tsetFocusedFacades([]);\n\t\t// Reset all state after disabling - replace entire state in this case\n\t\tupdateExtensionState('dynamic-focus', {\n\t\t\tregistrationState: 'unregistered',\n\t\t\tisEnabled: false,\n\t\t\tfocusedFacades: [],\n\t\t});\n\t}, [callExtensionMethod, setFocusedFacades, updateExtensionState]);\n\n\t// Return hook API with Dynamic Focus methods\n\treturn {\n\t\tisReady,\n\t\tisEnabled,\n\t\tfocusedFacades,\n\t\tupdateState,\n\t\tgetState,\n\t\tfocus,\n\t\tdisable,\n\t\tenable,\n\t};\n}\n", "import { useCallback, useContext } from 'react';\nimport { Logger } from '../logger';\nimport type { DynamicFocusEvents, DynamicFocusEventPayload } from '../types';\nimport {\n\tMappedinContext,\n\tuseEventCallback,\n\tcreateEventSetupScript,\n\tcreateEventCleanupScript,\n} from '@mappedin/react-native-sdk';\nimport { hydrateFacades } from './utils/facade-hydration';\nimport { useDynamicFocusRegistration } from './use-dynamic-focus-registration';\n\n/**\n * React hook for listening to DynamicFocus extension events in React Native WebView\n * This hook also auto registers the dynamic focus extension if it is not already registered\n *\n * @param event - The dynamic focus event type to listen for\n * @param callback - The callback function to call when the event is triggered\n *\n * @example\n * ```tsx\n * import { useDynamicFocusEvent } from '@mappedin/dynamic-focus/rn';\n *\n * function MyComponent() {\n * useDynamicFocusEvent('focus', (event) => {\n * console.log('Focus event:', event);\n * });\n * }\n * ```\n */\nexport function useDynamicFocusEvent<T extends keyof DynamicFocusEvents>(\n\tevent: T,\n\tcallback: (payload: DynamicFocusEventPayload<T>) => void,\n): void {\n\t// Parameter validation\n\tif (typeof event !== 'string' || event.length === 0) {\n\t\tthrow new Error('Event parameter must be a non-empty string');\n\t}\n\n\tif (typeof callback !== 'function') {\n\t\tthrow new Error('Callback parameter must be a function');\n\t}\n\n\tconst context = useContext(MappedinContext);\n\tconst { extensions, mapData } = context;\n\tif (!mapData) {\n\t\tthrow new Error('Map data is not available');\n\t}\n\n\t// Use registration hook to ensure extension is registered\n\tuseDynamicFocusRegistration();\n\n\t// Get extension readiness from context only\n\tconst extensionRegistrationState = extensions?.['dynamic-focus']?.registrationState || 'unregistered';\n\tconst extensionIsReady = extensionRegistrationState === 'registered';\n\n\t// Create a callback wrapper that handles payload processing and facade hydration\n\tconst processedCallback = useCallback(\n\t\t(payload: DynamicFocusEventPayload<T>) => {\n\t\t\ttry {\n\t\t\t\t// Hydrate facades for focus events before calling user callback\n\t\t\t\tlet processedPayload = payload;\n\t\t\t\tif (event === 'focus' && (payload as any).facades) {\n\t\t\t\t\tprocessedPayload = {\n\t\t\t\t\t\t...payload,\n\t\t\t\t\t\tfacades: hydrateFacades(mapData, (payload as any).facades),\n\t\t\t\t\t} as DynamicFocusEventPayload<T>;\n\t\t\t\t}\n\n\t\t\t\tcallback(processedPayload);\n\t\t\t} catch (error) {\n\t\t\t\tLogger.error(`Error in dynamic focus event callback for ${String(event)}:`, error);\n\t\t\t}\n\t\t},\n\t\t[event, mapData, callback],\n\t);\n\n\t// Use the shared event callback hook with dynamic focus specific setup/cleanup\n\tuseEventCallback({\n\t\teventKey: `dynamic-focus:${String(event)}`,\n\t\tcallback: processedCallback,\n\t\tsetupScript: () =>\n\t\t\tcreateEventSetupScript({\n\t\t\t\textensionName: 'dynamic-focus',\n\t\t\t\teventName: String(event),\n\t\t\t}),\n\t\tcleanupScript: () =>\n\t\t\tcreateEventCleanupScript({\n\t\t\t\textensionName: 'dynamic-focus',\n\t\t\t\teventName: String(event),\n\t\t\t}),\n\t\tshouldInject: extensionIsReady,\n\t});\n}\n", "/* eslint-disable no-console*/\nexport const MI_DEBUG_KEY = 'mi-debug';\nexport const MI_ERROR_LABEL = '[MappedinJS]';\n\nexport enum E_SDK_LOG_LEVEL {\n\tLOG,\n\tWARN,\n\tERROR,\n\tSILENT,\n}\n\nexport function createLogger(name = '', { prefix = MI_ERROR_LABEL } = {}) {\n\tconst label = `${prefix}${name ? `-${name}` : ''}`;\n\n\tconst rnDebug = (type: 'log' | 'warn' | 'error', args: any[]) => {\n\t\tif (typeof window !== 'undefined' && (window as any).rnDebug) {\n\t\t\tconst processed = args.map(arg => {\n\t\t\t\tif (arg instanceof Error && arg.stack) {\n\t\t\t\t\treturn `${arg.message}\\n${arg.stack}`;\n\t\t\t\t}\n\n\t\t\t\treturn arg;\n\t\t\t});\n\t\t\t(window as any).rnDebug(`${name} ${type}: ${processed.join(' ')}`);\n\t\t}\n\t};\n\n\treturn {\n\t\tlogState: process.env.NODE_ENV === 'test' ? E_SDK_LOG_LEVEL.SILENT : E_SDK_LOG_LEVEL.LOG,\n\n\t\tlog(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.LOG) {\n\t\t\t\tconsole.log(label, ...args);\n\t\t\t\trnDebug('log', args);\n\t\t\t}\n\t\t},\n\n\t\twarn(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.WARN) {\n\t\t\t\tconsole.warn(label, ...args);\n\t\t\t\trnDebug('warn', args);\n\t\t\t}\n\t\t},\n\n\t\terror(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.ERROR) {\n\t\t\t\tconsole.error(label, ...args);\n\n\t\t\t\trnDebug('error', args);\n\t\t\t}\n\t\t},\n\n\t\t// It's a bit tricky to prepend [MappedinJs] to assert and time because of how the output is structured in the console, so it is left out for simplicity\n\t\tassert(...args: any[]) {\n\t\t\tconsole.assert(...args);\n\t\t},\n\n\t\ttime(label: string) {\n\t\t\tconsole.time(label);\n\t\t},\n\n\t\ttimeEnd(label: string) {\n\t\t\tconsole.timeEnd(label);\n\t\t},\n\t\tsetLevel(level: E_SDK_LOG_LEVEL) {\n\t\t\tif (E_SDK_LOG_LEVEL.LOG <= level && level <= E_SDK_LOG_LEVEL.SILENT) {\n\t\t\t\tthis.logState = level;\n\t\t\t}\n\t\t},\n\t};\n}\n\nconst Logger = createLogger();\nexport function setLoggerLevel(level: E_SDK_LOG_LEVEL) {\n\tif (E_SDK_LOG_LEVEL.LOG <= level && level <= E_SDK_LOG_LEVEL.SILENT) {\n\t\tLogger.logState = level;\n\t}\n}\n\nexport default Logger;\n", "import { createLogger } from '../../packages/common/Mappedin.Logger';\n\nexport const Logger = createLogger('', { prefix: '[DynamicFocus]' });\n", "import type { MapData, Facade } from '@mappedin/mappedin-js';\n\n/**\n * Hydrates facade data from JSON objects to actual Facade instances\n * @param mapData - The MapData instance containing facade data\n * @param facades - Array of facade data (JSON objects or Facade instances)\n * @returns Array of hydrated Facade instances\n */\nexport function hydrateFacades(mapData: MapData, facades: Facade['toJSON'][]): Facade[] {\n\treturn facades.map((facadeData: any) => {\n\t\t// Try to hydrate the facade using mapData\n\t\tif (facadeData && facadeData.id) {\n\t\t\tconst hydratedFacade = mapData.getById('facade', facadeData.id);\n\t\t\treturn hydratedFacade || facadeData; // Fallback to original data if hydration fails\n\t\t}\n\t\treturn facadeData;\n\t});\n}\n", "import { useRegisterExtension } from '@mappedin/react-native-sdk';\nimport { Logger } from '../logger';\nimport { getRegistrationScript } from './extension-source';\n\n/**\n * Registration state for extension registration lifecycle\n */\nexport type RegistrationState = 'unregistered' | 'registering' | 'registered';\n\n/**\n * React hook for registering the DynamicFocus extension with the WebView bridge\n *\n * This hook handles the complete extension registration lifecycle:\n * - Monitors bridge readiness state\n * - Checks if extension is already registered to avoid duplicates\n * - Injects registration script when needed\n * - Updates extension state in shared context\n * - Handles all registration errors gracefully\n *\n * Multiple hooks can use this safely - the registration logic is idempotent\n * and will only register the extension once per bridge lifecycle.\n *\n * @returns void - Hook performs registration as side effect only\n *\n * @example\n * ```tsx\n * function MyExtensionHook() {\n * useDynamicFocusRegistration(); // Handles registration automatically\n *\n * // Read isReady from context extensions\n * const { extensions } = useContext(MappedinContext);\n * const isReady = extensions?.['dynamic-focus']?.isReady || false;\n * }\n * ```\n */\nexport function useDynamicFocusRegistration(): void {\n\tuseRegisterExtension({\n\t\textensionName: 'dynamic-focus',\n\t\tgetRegistrationScript,\n\t\tlogger: Logger,\n\t});\n}\n", "// Extension source placeholder - replaced at build time\nconst EXTENSION_SOURCE_PLACEHOLDER = `INJECT_SCRIPT_HERE`;\n\n/**\n * Returns the extension registration script\n * This function's return value is replaced at build time with the actual IIFE content\n * @returns JavaScript code string for extension registration\n */\nexport function getRegistrationScript(): string {\n\treturn EXTENSION_SOURCE_PLACEHOLDER;\n}\n"],
5
- "mappings": "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",
6
- "names": ["useCallback", "useContext", "MappedinContext", "label", "Logger", "Logger", "Logger", "useContext", "MappedinContext", "useCallback"]
7
- }