UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) 3.07 kB
import{CURRENT_POSITION_POINT_ID as C}from"./positionView";import{getRouteLength as G,snapToRoute as H}from"../core";import{getRouteLines as J}from"./getRouteLines";import{createEndpointView as K}from"./endpointView";import{createPositionTrailView as Q}from"./positionTrailView";import{createRouteLinesView as X}from"./routeLinesView";import{computeRouteRenderData as Y}from"./routeRenderData";import{computeRouteUpdate as Z}from"./routeUpdate";import{createTrailView as $}from"./trailView";import{createTransitionView as D}from"./transitionView";const x=A=>A.flatMap(e=>[e.p0,e.p1]);export function createWayfindingRuntime({engine:A,renderer:e,iconProvider:P,floorContext:c,layers:f,snapThreshold:E,onTransitionClick:M,onRouteUpdate:N,onRouteDistance:R}){const d=K({renderer:e,iconProvider:P,floorContext:c,layer:f.points}),I=D({renderer:e,iconProvider:P,floorContext:c,onTransitionClick:M,layer:f.points}),W=$({renderer:e,iconProvider:P,floorContext:c,layer:f.trail}),l=Q({renderer:e,iconProvider:P,floorContext:c,trails:W,iconLayer:f.currentPosition,snapThreshold:E}),O=X({renderer:e,linesLayer:f.lines,animatedLinesLayer:f.linesAnimated});let r=[],o=null,u=null,s=null,p=0,y=!1,T=!1;function S(){return c.showAllFloors()?null:c.getActiveFloor()}function _(){const t=S();return t===null?r.filter(n=>!n.virtual):r.filter(n=>n.p0.layer===t&&!n.virtual)}function V(){if(!o||!u)return null;const t=_();return t.length?{from:o,to:u,routePoints:x(t),visibleLines:t}:null}function m(t=null,n=!1){if(!o||!u)return;const i=Y({routeLines:r,currentRouteLayer:S(),from:o,to:u,snap:t});O.draw(i,n),p=i.distance}function g(t){const n=V();if(!n){l.setTrail(null,null);return}const i=s&&t&&!t.snapped?s:null,h=a=>a.bounds?.length?null:a.id===C?i:a,L=y?null:h(n.from);if(L){l.setTrail(n.routePoints[n.routePoints.length-1],L);return}const b=h(n.to);l.setTrail(b?n.routePoints[0]:null,b)}function U(){if(!o||!u)return;const t=V();if(!t){d.hide(),I.clear(),l.clearTrail(),m();return}d.place(o,u,t.routePoints,T),I.place(r),m(),g(null)}function w(){if(!o||!u)return;const t=V();t&&d.place(o,u,t.routePoints,T)}function F(){if(T=!1,!s||!o||!u)return null;const t=r.filter(h=>!h.virtual);if(!t.length)return null;const n=V(),i=n?l.applyToRoute(s,n,t):H(s,t,{snapThreshold:E,from:o,to:u});return i.snapped&&(y=!0),T=i.snapped,i}function k(){const t=Z(r,_());return N(t.lines,t.bounds),t}function j({from:t,to:n,waypoints:i,accessible:h}){const L=J({engine:A,from:t,to:n,waypoints:i,accessible:h});if(!L.length)return v(),!1;y=!1,o=t,u=n,r=L,U();const{lines:b}=k(),a=F();return w(),g(a),a&&m(a,!0),R(a?p:G(b)),e.flush(),!0}function q(t){const n=s!==null;if(s=t,!t){T=!1,l.hideIcon(),g(null),n&&w(),m(),R(p),e.flush();return}l.placeIcon(t);const i=F();w(),g(i),i&&m(i,!0),R(p),e.flush()}function z(){U();const t=F();w(),g(t),t&&m(t,!0),r.length&&k(),R(p),e.flush()}function v(){y=!1,r=[],o=null,u=null,p=0,d.hide(),I.clear(),l.clearTrail(),O.clear(),N([],null),R(0),e.flush()}function B(){v(),s=null,e.destroy()}return{setRoute:j,onPositionChanged:q,onFloorChanged:z,clearRoute:v,destroy:B}}