{"version":3,"file":"SimulatorManager.cjs","names":["State","sliceSimulatorAccessedDirectly","SimulatorAPI","ClientRequestType","getSliceZoneDOM","StateEventType","ResponseError","throttle","getSimulatorRootDOM","getSimulatorDOM"],"sources":["../../src/kit/SimulatorManager.ts"],"sourcesContent":["import type { SliceZone } from \"@prismicio/client\"\n\nimport { ResponseError } from \"../channel\"\nimport { throttle } from \"../lib/throttle\"\nimport { SimulatorAPI } from \"../SimulatorAPI\"\nimport { ClientRequestType } from \"../types\"\nimport { getSimulatorDOM, getSimulatorRootDOM, getSliceZoneDOM } from \"./domHelpers\"\nimport { sliceSimulatorAccessedDirectly } from \"./messages\"\nimport { State } from \"./State\"\nimport { StateEventType } from \"./types\"\n\ntype ManagerConstructorArgs = {\n\tslices?: SliceZone\n}\n\nexport class SimulatorManager {\n\tpublic state: State\n\tprivate _api: SimulatorAPI | null\n\tprivate _initialized: boolean\n\n\tconstructor(args?: ManagerConstructorArgs) {\n\t\tthis.state = new State(args)\n\t\tthis._api = null\n\t\tthis._initialized = false\n\t}\n\n\tasync init(): Promise<void> {\n\t\tif (this._initialized) {\n\t\t\treturn\n\t\t} else {\n\t\t\tthis._initialized = true\n\t\t}\n\n\t\t// Init state manager\n\t\tawait this.state.init()\n\n\t\t// Do not init the API is the simulator is accessed directly\n\t\tif (window.parent === window) {\n\t\t\tthis.state.message = sliceSimulatorAccessedDirectly\n\t\t\treturn\n\t\t}\n\n\t\t// Init API\n\t\ttry {\n\t\t\tawait this._initAPI()\n\t\t} catch (error) {\n\t\t\tconsole.error(error)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Init listeners\n\t\tthis._initListeners()\n\t}\n\n\tprivate async _initAPI(): Promise<void> {\n\t\t// Register SimulatorAPI request handlers\n\t\tthis._api = new SimulatorAPI({\n\t\t\t[ClientRequestType.SetSliceZone]: (req, res) => {\n\t\t\t\tthis.state.setSliceZone(req.data)\n\n\t\t\t\treturn res.success()\n\t\t\t},\n\t\t\t[ClientRequestType.ScrollToSlice]: (req, res) => {\n\t\t\t\t// Error if `sliceIndex` is invalid\n\t\t\t\tif (req.data.sliceIndex < 0) {\n\t\t\t\t\treturn res.error(\"`sliceIndex` must be > 0\", 400)\n\t\t\t\t} else if (req.data.sliceIndex >= this.state.slices.length) {\n\t\t\t\t\treturn res.error(\n\t\t\t\t\t\t`\\`sliceIndex\\` must be < ${this.state.slices.length} (\\`<SliceZone />\\` current length)`,\n\t\t\t\t\t\t400,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst $sliceZone = getSliceZoneDOM(this.state.slices.length)\n\t\t\t\tif (!$sliceZone) {\n\t\t\t\t\treturn res.error(\"Failed to find `<SliceZone />`\", 500)\n\t\t\t\t}\n\n\t\t\t\t// Destroy existing active slice as we're about to scroll\n\t\t\t\tthis.state.activeSlice = null\n\n\t\t\t\tconst $slice = $sliceZone.children[req.data.sliceIndex]\n\t\t\t\tif (!$slice) {\n\t\t\t\t\treturn res.error(\n\t\t\t\t\t\t`Failed fo find slice at index $\\`{req.data.sliceIndex}\\` in \\`<SliceZone />\\``,\n\t\t\t\t\t\t500,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Scroll to Slice\n\t\t\t\t$slice.scrollIntoView({\n\t\t\t\t\tbehavior: req.data.behavior,\n\t\t\t\t\tblock: req.data.block,\n\t\t\t\t\tinline: req.data.inline,\n\t\t\t\t})\n\n\t\t\t\t// Update active slice after scrolling\n\t\t\t\tif (this._api?.options.activeSliceAPI) {\n\t\t\t\t\tsetTimeout(this.state.setActiveSlice, 750)\n\t\t\t\t}\n\n\t\t\t\treturn res.success()\n\t\t\t},\n\t\t})\n\n\t\t// Mark API as ready\n\t\tawait this._api.ready()\n\t}\n\n\tprivate _initListeners(): void {\n\t\tif (this._api?.options.activeSliceAPI) {\n\t\t\t// Update active slice on mouse move\n\t\t\twindow.addEventListener(\"mousemove\", () => {\n\t\t\t\tthis.state.setActiveSlice()\n\t\t\t})\n\t\t\t// Update active slice on events impacting slices rendering\n\t\t\twindow.addEventListener(\"resize\", () => {\n\t\t\t\tthis.state.setActiveSlice()\n\t\t\t})\n\t\t\twindow.addEventListener(\"mousewheel\", () => {\n\t\t\t\tsetTimeout(this.state.setActiveSlice, 200)\n\t\t\t})\n\n\t\t\t// Update active slice when slices are set\n\t\t\tthis.state.on(StateEventType.Slices, () => {\n\t\t\t\tthis.state.setActiveSlice()\n\t\t\t})\n\t\t\t// Send active slices to renderer\n\t\t\tthis.state.on(StateEventType.ActiveSlice, async (activeSlice) => {\n\t\t\t\tif (this._api) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._api.setActiveSlice(activeSlice)\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Just log bad requests, throw everything else\n\t\t\t\t\t\tif (error instanceof ResponseError && error.response.status === 400) {\n\t\t\t\t\t\t\tconsole.error(error.response)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow error\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tif (this._api?.options.sliceZoneSizeAPI) {\n\t\t\t// Monitor Simulator root node size\n\t\t\tconst resizeObserver = new ResizeObserver(\n\t\t\t\tthrottle(async (entries) => {\n\t\t\t\t\tconst [entry] = entries\n\n\t\t\t\t\tif (this._api && entry) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this._api.setSliceZoneSize({ rect: entry.contentRect })\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t// Just log bad requests, throw everything else\n\t\t\t\t\t\t\tif (error instanceof ResponseError && error.response.status === 400) {\n\t\t\t\t\t\t\t\tconsole.error(error.response)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow error\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, 16),\n\t\t\t)\n\t\t\tconst observeSimulatorRoot = () => {\n\t\t\t\tconst simulatorRootDOM = getSimulatorRootDOM()\n\t\t\t\tresizeObserver.disconnect()\n\t\t\t\tif (simulatorRootDOM) {\n\t\t\t\t\tresizeObserver.observe(simulatorRootDOM)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Monitor Simulator root node in DOM\n\t\t\tconst mutationObserver = new MutationObserver(observeSimulatorRoot)\n\t\t\t// We want it to fail if not found\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tmutationObserver.observe(getSimulatorDOM()!, {\n\t\t\t\tsubtree: false,\n\t\t\t\tchildList: true,\n\t\t\t})\n\t\t\tobserveSimulatorRoot()\n\t\t}\n\t}\n}\n"],"mappings":"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"}