@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 3.94 kB
JavaScript
import{jsx as V}from"react/jsx-runtime";import J from"color";import{runInAction as W}from"mobx";import{observer as X}from"mobx-react-lite";import{useCallback as P,useEffect as E,useMemo as d,useRef as p,useState as _}from"react";import{getLayerSvg as H,svgArea as k}from"../../data/svg";import{createSceneDef as K}from"../../renderer";import a,{uiState as g}from"../../store";import M from"../../tools/settings";import{toRadians as x}from"../../utils/math";import Z from"../Map/drawing/config/config-all";import{loadLayersImages as Q}from"../Map/drawing/config/loadBoothsImages";import{Rect as Y}from"../Map/drawing/config/Rect";import{useBuildRoute as q}from"../Map/traffic/useBuildRoute";import{useManageTraffic as ee}from"../Map/traffic/useManageTraffic";import re from"./MaplibreWrapper";import{useCameraReactions as oe}from"./useCameraReactions";import{useDimming as te}from"./useDimming";import{useLayerVisibilitySync as ne}from"./useLayerVisibilitySync";import{useRendererEvents as ae}from"./useRendererEvents";import{useWayfindingAndMarkers as ie}from"./useWayfindingAndMarkers";import{deriveGeoConfig as se,deriveVenueMapBounds as le,getLocalRectGeoBounds as ce,getVisibleRectFitPadding as fe,INITIAL_FIT_ZOOM_ADJUSTMENT as ue}from"./utils/geo-config";import{applyMapOptions as I,DEFAULT_MAP_OPTIONS as me,getTileSource as de,MAP_2D_OPTIONS as pe}from"./utils/map-helpers";import{calculateTransformMatrix as ge}from"./utils/solver";const $="routes-api.expofp.com";function B(){W(()=>{a.layerStore.layers.forEach(i=>{i.configured=!1,i.children=[],i.loaded=!1}),a.layerStore.layersLoaded=!1})}function F(i,y){const s=[];for(const c of i.rollRegistry.invoke(y))Array.isArray(c)?s.push(...c):s.push(c);s.length&&i.update(...s)}const ye=X(function({viewMode:y}){const[s,c]=_(null),[T,h]=_(null),e=a.rendererService,C=p(null),l=p(null),R=p(null),L=p(null),r=d(()=>se(),[]),f=d(()=>r?{center:r.center,bearing:r.bearing,zoom:r.zoom,bounds:ce(k,r.gpsConfig),fitPadding:fe(0),zoomAdjustment:ue}:null,[r]),v=d(()=>r?ge(r.gpsConfig,H()?.getAttribute("units")):null,[r]),u=d(()=>({...y==="map2d"?pe:me,maxBounds:r?le(r.gpsConfig):void 0}),[r,y]),O=p(u),j=d(()=>de(),[]),{mapDimAnimatorRef:b,venueDimAnimatorRef:S,handleMapDimLayerReady:z}=te(l,e);E(()=>{if(!r)return;let n=!1;B();const o=Z(e).then(t=>{if(n)return;const A=J(M.backgroundColor==="none"?"#ebebeb":M.backgroundColor).string(),G=K(t,Y.fromCoreRect(k),A);c(G)}).catch(t=>{n||console.warn("Maplibre scene configuration failed.",t)}),D=b.current,m=S.current;return()=>{n=!0,B();const t=C.current;o.finally(()=>e.disposeIfCurrent(t)),R.current?.(),R.current=null,C.current=null,l.current=null,L.current=null,h(null),D?.stop(),m?.stop(),g.sceneDefReady=!1}},[r,b,e,S]);const N=P((n,o,D,m)=>{C.current=n,l.current=o,L.current=m,h(n),e.attach(n,D,m),I(o,O.current),b.current?.setTarget(g.dimmed,{immediate:!0}),S.current?.setTarget(g.dimmed,{immediate:!0}),R.current?.();const t=()=>F(e,x(o.getBearing()));o.on("rotate",t),o.on("rotateend",t),R.current=()=>{o.off("rotate",t),o.off("rotateend",t)},Q(e);const A=e.ptScaleRegistry.invoke(e.scale||1);A.length&&e.update(...A),F(e,x(o.getBearing())),a.layerStore.layersLoaded=!0,a.fp.onFpConfigured&&a.fp.onFpConfigured(),g.sceneDefReady=!0,m()},[e,b,S]);E(()=>{O.current=u,I(l.current,u,!0)},[u]),ae(T,e),ie(T,e),ne(e,l,r),oe(l,r),q({enabled:a.layerStore.layersLoaded&&g.buildRoute,rendererService:e}),ee({permission:a.layerStore.layersLoaded,rendererService:e,dataJsonUrl:`https://${$}/v1/routes?expo=${M.EXPO}`,websocketUrl:`wss://${$}/locations?expo=${M.EXPO}`});const U=P(n=>{console.warn("Maplibre map failed to load; falling back to floorplan mode.",n),a.maplibreStore.deactivateMaplibre()},[]);if(!r||!f||!v||!s)return null;const w=`${f.center.join(",")}:${f.bearing}:${f.zoom}`;return V(re,{sceneDef:s,geoConfig:f,staticTransform:v,tileSource:j,mapOptions:u,onRendererReady:N,onMapDimLayerReady:z,onMapLoadError:U},w)});export default ye;