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