import { createStandaloneCatalog } from './catalog.js'; import { createStandalonePlaceSearch } from './placeSearch.js'; import { createApplication } from '../app/application.js'; import { createStandaloneScene } from './scene.js'; import { createStandaloneControls } from './controls.js'; import { createStandaloneData } from './data.js'; import { createStandaloneTools } from './tools.js'; // The existing controls and layer catalog contain page-scoped state. let constructed = false; /** Compose the standalone application once per page. Reload to start again. */ export function createStandaloneApplication({ googleApiKey, cesiumToken, geospatial = {}, voice = {}, allowQaRegistration = false, }) { if (constructed) throw new Error('The standalone application already owns this page'); constructed = true; const loadingScreen = document.getElementById('loading-screen'); const loaderStatus = loadingScreen.querySelector('.loader-status'); let placeSearch; let catalog; return createApplication({ createScene: async (context) => { placeSearch = createStandalonePlaceSearch({ ...geospatial, resolveApiKey: () => googleApiKey, signal: context.signal, }); const scene = await createStandaloneScene({ ...context, googleApiKey, cesiumToken, loaderStatus, }); catalog = createStandaloneCatalog({ signal: context.signal, surface: scene.operations.surface, }); return scene; }, createControls: (context) => createStandaloneControls({ ...context, loaderStatus, placeSearch, catalog, }), createData: (context) => createStandaloneData({ ...context, allowQaRegistration, catalog }), createTools: (context) => createStandaloneTools({ ...context, loadingScreen, placeSearch, voice }), }); }