@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 3.38 kB
JavaScript
import{__decorate as e}from"tslib";import{action as i,computed as u,observable as n}from"mobx";import a from"../data/tours.json";import y from"../tools/settings";const h=1;export default class o{constructor(t){this.tours=[],this.currentExpo="",this.hasTours=!1,this.toursLoadError=null,this.rootStore=t,this.loadTours()}loadTours(){try{if(this.currentExpo=y.EXPO||"default",this.toursLoadError=null,!this.isValidToursData(a)){this.toursLoadError="Invalid tours data format",this.resetTours();return}const t=a[this.currentExpo]||[];if(!this.validateToursStructure(t)){this.toursLoadError="Invalid tour items structure",this.resetTours();return}this.tours=t,this.hasTours=t.length>0}catch(t){console.error("Error loading tours:",t),this.toursLoadError=t instanceof Error?t.message:"Failed to load tours",this.resetTours()}}resetTours(){this.tours=[],this.hasTours=!1}isValidToursData(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}validateToursStructure(t){return Array.isArray(t)?t.every(r=>r&&typeof r=="object"&&typeof r.id=="string"&&Array.isArray(r.layers)&&r.layers.length>=h&&(r.points===void 0||Array.isArray(r.points))):!1}get tourItems(){return this.tours}getTourById(t){return this.tours.find(r=>r.id===t)}getToursByPoint(t){return this.tours.filter(r=>r.points?.includes(t))}getToursForExpo(t){return this.isValidToursData(a)?a[t]||[]:[]}get currentTour(){const{list:t}=this.rootStore.uiState;return t.type!=="multi-point-tour"||!this.isMultiPointTourList(t)?null:this.getTourById(t.tourId)||null}isMultiPointTourList(t){return t.type==="multi-point-tour"&&typeof t.tourId=="string"}get isActive(){return this.rootStore.uiState.list.type==="multi-point-tour"}get tourLayers(){const t=this.currentTour;return t?t.layers.map(r=>this.rootStore.layerStore.findLayer(r.floor)).filter(r=>r!=null):[]}getTourLayerInfo(t){const r=this.currentTour;if(r)return r.layers.find(l=>{const s=this.rootStore.layerStore.findLayer(l.floor);return s&&(s.name===t||s.description===t)})}launchTour(t,r,l){const s=this.validateTourForLaunch(t);if(s)return console.warn(`Cannot launch tour: ${s}`),!1;const p=t.layers[0].id,d=t.layers[0].floor;return t.points&&t.points.length>0?this.rootStore.fp.showPathway(p,t.points):this.rootStore.fp.showPathwayOnly(p,d),this.rootStore.uiState.setTourTitle(r),this.rootStore.uiState.setTourDescription(l),this.rootStore.uiState.setIsMultiPointTour(!0),this.rootStore.uiState.setMultiPointTourList(t.id),window.setTimeout(()=>{this.rootStore.showMap()},navigator.userAgent.toLowerCase().indexOf("android")>-1?400:50),!0}validateTourForLaunch(t){return t.layers.length<h?`Tour must have at least ${h} layer`:null}stopTour(){this.rootStore.uiState.setIsMultiPointTour(!1),this.rootStore.uiState.setPathwayOnlyMode(!1);const t=this.rootStore.uiState.list.type;(t==="tours"||t==="multi-point-tour")&&(this.rootStore.uiState.list={type:"search",text:"",focused:!1}),this.rootStore.fp.hidePathways()}}e([n],o.prototype,"tours",void 0),e([n],o.prototype,"currentExpo",void 0),e([n],o.prototype,"hasTours",void 0),e([n],o.prototype,"toursLoadError",void 0),e([i],o.prototype,"loadTours",null),e([i],o.prototype,"resetTours",null),e([u],o.prototype,"tourItems",null),e([u],o.prototype,"currentTour",null),e([u],o.prototype,"isActive",null),e([u],o.prototype,"tourLayers",null),e([i],o.prototype,"launchTour",null),e([i],o.prototype,"stopTour",null);