import * as Cesium from 'cesium'; import { LAYER_ID } from './policy.js'; export function createLifecycle({ state: layerState, services, parts, source, }) { const { registerPickOwner, unregisterPickOwner } = services.picking; const { clearSelectedEntityContextForLayer } = services.context; const methods = { init(viewer) { layerState.viewer = viewer; layerState.dataSource = new Cesium.CustomDataSource( 'military-installations', ); viewer.dataSources.add(layerState.dataSource); layerState.moveEndRemove = viewer.camera.moveEnd.addEventListener( parts.viewport.scheduleLoad, ); parts.selection.installInteraction(viewer); }, enable() { layerState.enabled = true; registerPickOwner(LAYER_ID, (id) => layerState.recordById.has(id)); layerState.dataSource.show = true; // DataLayerManager invokes update() immediately after enable(), which owns // the first fetch. Avoid racing it with a second aborting request here. }, disable() { layerState.enabled = false; unregisterPickOwner(LAYER_ID); parts.viewport.clearUnavailableRetry(); clearTimeout(layerState.timer); layerState.abort?.abort(); layerState.abort = null; layerState.loading = false; if (layerState.dataSource) layerState.dataSource.show = false; clearSelectedEntityContextForLayer(LAYER_ID); layerState.selectedId = null; layerState.failureReason = null; parts.ingestion.setInstallationStatus('idle'); }, destroy(viewer) { this.disable(); layerState.moveEndRemove?.(); layerState.clickHandler?.destroy(); layerState.clickHandler = null; parts.rendering.clearRendered(); if (layerState.dataSource && viewer) viewer.dataSources.remove(layerState.dataSource, true); layerState.dataSource = null; }, }; return { methods }; }