UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) • 2.48 kB
import{Box as g}from"@expofp/geometry";import{useCameraAPI as h,useCameraGesture as T,useCameraMoveEnd as R,useCameraState as y}from"@expofp/renderer";import{useEffect as B,useLayoutEffect as C,useRef as P,useState as S}from"react";import{getFpGeo as x}from"../../data/fpGeo.js";import{getSvgArea as F}from"../../data/svg.js";import M,{uiState as o}from"../../store";import c from"../../tools/logger";import w from"../../tools/settings";import{parseNumberPair as d}from"../../utils/camera-map-settings";import{convertGpsToLocal as z}from"../../utils/gps";import{useOneShotReaction as f}from"../../utils/mobx";import{createMapCamera as E,setMapCamera as l}from"./camera";import{notifyCameraMoved as N}from"./camera-events";import{framingRect as G}from"./framing-rect.js";import{resetExternalOverlay as b}from"./pointer";import{withKiosk as A}from"./with-kiosk.js";export function MapCamera(){const t=h(),i=y(),r=P({api:t,state:i}),[m]=S(()=>E(r));return C(()=>{r.current={api:t,state:i}}),B(()=>(l(m),()=>l(void 0)),[m]),T(()=>b()),R(()=>N()),f(()=>o.zoomBy,e=>{e&&(r.current.api.zoomBy(e),o.zoomBy=null)},[]),f(()=>o.rollReset,e=>{e&&(r.current.api.reset({roll:!0}),o.rollReset=!1)},[]),f(()=>o.centerMap,e=>{e&&(r.current.api.reset({zoom:!!(o.list.type==="search"&&o.list.text)}),o.centerMap=!1)},[]),f(()=>o.moveToRect,e=>{if(!e)return;const{width:a,height:n}=e.size;a>0&&n>0&&Number.isFinite(a)&&Number.isFinite(n)&&v(r.current.api,e,o.moveToRectPaddingPercent??void 0),o.moveToRect=null,o.moveToRectPaddingPercent=null},[]),f(()=>o.moveToBooths,e=>{if(!e)return;c.log("watched moveToBooths",e);const a=e.filter(n=>n.rect).map(n=>n.rect);a.length&&v(r.current.api,g.fromUnion(...a)),o.moveToBooths=null},[]),f(()=>o.mapSettings,({center:e,centerxy:a,bearing:n,pitchdegrees:s,z:p})=>{try{p&&M.fp.activateFloor({name:p});const u=O(e,a);u&&r.current.api.panTo(u),n!==void 0&&Number.isFinite(n)&&r.current.api.rollTo(n),s!=null&&Number.isFinite(s)&&r.current.api.pitchTo(s,{immediate:!o.animatePitch})}catch(u){c.error("Error in mapSettings reaction",u)}},[]),null}function v(t,i,r){t.zoomTo(A(i),{padding:r??L(i,F()),maxZoom:Number.isFinite(w.maxZoom)?void 0:10,within:G()})}function L(t,i){return!t||!i?0:(t.area/i.area>.1?15:25)/100}function O(t,i){if(t){const m=d(t);if(!m)return;const e=x()?.properties?.config;if(!e)throw new Error("Map center given in GPS, but the plan has no GPS config");return z({lat:m[0],lng:m[1]},e)??void 0}const r=d(i);if(r)return{x:r[0],y:r[1]}}