@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 9.1 kB
JavaScript
import{applyIntents as k,getConfig as y,parseDeprecatedUrlParams as W,parseFromUrlTolerant as z,parseIntentsFromUrl as I,parseLegacyQuery as w,serializeIntentToUrl as N,serializeSelection as Q}from"@expofp/config";import{Box as j}from"@expofp/geometry";import{UrlConfigSchema as H}from"@expofp/schema";import{safeDecode as p}from"@expofp/utils";import{runInAction as $}from"mobx";import{applyKioskMode as q}from"../components/Kiosk/kiosk-mode";import{recoverKioskFromUrlPrams as J}from"../components/Kiosk/recoverKioskFromUrlPrams";import{LEGACY_PREVIEW_MODE_STORAGE_KEY as X,LEGACY_VIEWER_MODE_STORAGE_KEY as Z,PREVIEW_MODE_STORAGE_KEY as x,VIEWER_MODE_STORAGE_KEY as E}from"../constants";import ee from"../data";import s,{uiState as i}from"../store";import{BoothBase as F}from"../store/BoothStore";import{CurrentPosition as te,extractRoute as oe}from"../store/RouteStore";import{eventScopedValue as re}from"../tools/event-scoped-cache.js";import{setConsentSettings as ie}from"../tools/gtag";import M from"../tools/logger";import{areLayersEnabled as se}from"../utils/areLayersEnabled";import{brand as O}from"../utils/brand";import{cameraToMapSettings as B}from"../utils/camera-map-settings";import{handleCustomCommand as ne}from"../utils/customCommands";import{formatEventTitle as ae,formatPlaceholderTitle as le}from"../utils/event-title";import{getMostFrequent as ce}from"../utils/getMostFrequent";import{heatmapEnabled as ue}from"../utils/heatmap-enabled";import fe from"../utils/is-own-domain";import{isLocalStorageAvailable as L}from"../utils/localStorage";import{planAutorun as P,planWhen as d}from"../utils/plan-reactions.js";import{stripTrackingParams as me}from"../utils/trackingParams";import{rewriteMultiSlugQuery as pe}from"./multi-slug";import{currentSearch as f,disableUrlWrites as de,initUrlSync as he,pushQuery as ye,replaceQuery as m}from"./url-sync";let b=!1,h=!1;export function applyDeclarativeConfig(){v(y()),d(()=>s.layerStore.layersLoaded,()=>{const e=y().camera;Object.keys(e).length&&K(B(e));const t=y().visibility;Object.keys(t).length&&i.setVisibility(t)})}export function initUrlRouting(e){he({offHistory:e,onNavigate:()=>S({backForward:!0})}),T(),g(),d(()=>s.layerStore.layersLoaded,()=>{s.urlFilterManager&&!s.urlFilterManager.isInitialized&&s.urlFilterManager.initialize(),h=!0;try{S()}finally{h=!1}P(G),P(A),i.viewerMode&&(i.menu=!0)})}export function applyParameters(e=""){m("?"+p(e.toString())),s.layerStore.layersLoaded?U(e):(g(),d(()=>s.layerStore.layersLoaded,()=>U(e)))}function U(e){const t="?"+p(e),o=ve(t),n=[...o.intents??[],...I(t).intents],{intents:l=[],...c}=W(t,{visibility:o.visibility,consent:o.consent,intents:n});v(o),v(c);const a=o.consent??c.consent;a&&ie(a),o.camera&&Object.keys(o.camera).length&&K(B(o.camera)),o.visibility&&Object.keys(o.visibility).length&&i.setVisibility(o.visibility),T(),S();const r=[...n,...l];r.length&&k(s.fp,r)}function g(){const e=f(),t=e.length>1?p(e.substring(1)):"";return ne(t)}function S(e={}){b=!0;try{const t=new URLSearchParams(p(window.location.search));J(t);const{primary:o}=w(f()),n=o.type==="select"&&(!o.slug||/^t=[^&]*$/.test(o.slug))&&(i.heatmap||i.heatmapYah);!g()&&!n&&(e.backForward?be(o):R(o))}finally{b=!1}if(e.backForward){const{exhibitor:t,booth:o,eventItem:n}=V(),l=_();l.exhibitor=t,l.booth=o,l.eventItem=n}A(),G()}function be(e){e.type==="list"&&e.list==="sessions"?s.fp.showSessions():R(e);const{intents:t}=I(f());k(s.fp,t.filter(o=>o.name==="showSessions"))}function R(e){const t=s.fp;switch(e.type){case"kiosk":e.enabled!==null&&q(i,e.enabled);return;case"list":t.showList(e.list);return;case"tour":t.selectTour(e.tourId);return;case"planner":h&&s.searchButtonsStore.keepFiltersOnNextNavigation(),t.openPlanner({items:e.items,from:e.from,fromBookmarks:e.fromBookmarks});return;case"route":{s.routeStore.setOnlyAccessible(e.accessible);const o=oe(e.from??"",e.to??"",e.waypoints);h&&!(o.from&&o.from===o.to)&&s.searchButtonsStore.keepFiltersOnNextNavigation(),s.routeStore.selectRoute(o),s.uiState.setIsMultiPointRoute(e.waypoints.length>0),e.title&&s.uiState.setRouteTitle(e.title);return}case"selectExhibitors":setTimeout(()=>t.selectExhibitor(e.values),250);return;case"ownedByFilters":M.log("Skipping filter parameters in dispatchFromUrl (owned by URLFilterManager)");return;case"ownedByConfig":return;case"select":t.select(e.slug);return}}export function applyPathway(e){const{pathwayId:t,boothIds:o,exhibitorIds:n}=e,l=s.boothStore.booths.filter(r=>o.includes(r.externalId)),c=s.exhibitorStore.exhibitors.filter(r=>n.includes(r.externalId)).flatMap(r=>r.booths),a=[...l,...c];if(se()){const r=ce(a.map(u=>u.layer.name));r&&s.fp.activateFloor({name:r})}(o.length>0||n.length>0)&&s.fp.highlightEntities([...o,...n]),s.layerStore.showPathWay(t),a.length>0&&$(()=>{s.uiState.moveToRect=j.fromUnion(...a.map(r=>r.rect).filter(Boolean)),s.uiState.rollReset=!0})}function T(){const{oneShots:e}=w(f());for(const o of e)ge(o);const t=me(f());t!==null&&m("?"+t),i.previewExhibitor&&m("?"+i.previewExhibitor.slug),Se()}function ge(e){switch(e.type){case"heatmap":C(e.yah);return;case"blueDot":{const t=new te(e.x,e.y,s.layerStore.findLayer(e.layer??"")?.name,void 0,e.lat,e.lng);d(()=>s.layerStore.layersLoaded,()=>s.routeStore.selectCurrentPosition(t,!0,1));return}case"viewerMode":L&&(e.enabled?localStorage.setItem(E,"true"):(localStorage.removeItem(E),localStorage.removeItem(Z)));return;case"previewMode":L&&(e.enabled?localStorage.setItem(x,"true"):(localStorage.removeItem(x),localStorage.removeItem(X)));return;case"uiScale":e.scale!==null?s.uiState.setUIScale(e.scale,!0):M.warn(`Invalid ui-scale parameter: ${e.raw}. Must be a number between 0.8 and 1.4.`);return;case"resetUiScale":s.uiState.resetUIScale();return}}function C(e){de(),e?(i.heatmapYah=!0,i.monochrome=!0,i.hideLogoInBooth=!0,i.hideHeaderLogo=!0,i.disableBookmarked=!0):i.heatmap=!0}function Se(){const e=pe(f(),t=>s.exhibitorStore.exhibitors.find(n=>n.slug===t||n.externalId===t)?.name);e!==null&&m(e)}function v(e){e.noOverlay!==void 0&&(i.hideOverlay=e.noOverlay),e.monochrome&&(i.monochrome=!0),e.hideHeaderLogo&&(i.hideHeaderLogo=!0),e.hideLogoInBooth&&(i.hideLogoInBooth=!0),e.disableFeatured&&s.exhibitorStore.exhibitors.forEach(t=>t.featured=!1),e.disableBookmarked&&(i.disableBookmarked=!0),e.disableGps&&s.routeStore.setGpsTrackingEnabled(!1),e.heatmap&&ue(e.heatmap)&&C(e.heatmap.variant==="yah")}function ve(e){return z(H,e).value}const _=re(()=>({exhibitor:null,booth:null,eventItem:null}));function A(){const{selection:e,exhibitor:t,booth:o,eventItem:n}=V(),l=s.urlFilterManager.filterSearch(),c=ke(e);if(b)return;const a=c||Q(e)||l;if(f()===a)return;const r=_();t!==r.exhibitor||o!==r.booth||n!==r.eventItem?ye(a):m(a),r.exhibitor=t,r.booth=o,r.eventItem=n}function ke(e){if(e.type!=="list"||e.list!=="sessions")return"";const{selectedTracks:t,selectedVenues:o,date:n,timeOfDay:l,showBookmarksOnly:c,showLiveOnly:a}=s.sessionsFilterStore.state.filters,r={};return t.value.length&&(r.tracks=D(t.value)),o.value.length&&(r.venues=D(o.value)),n.value!=="all"&&(r.date=n.value),n.value==="today"&&l.value!=="all"&&(r.time=l.value),c.value&&(r.bookmarked=!0),a.value&&(r.live=!0),Object.keys(r).length?"?"+N({name:"showSessions",args:[r]}):""}function D(e){return[...e].sort((t,o)=>t-o).map(String)}function V(){const e=i.selectedExhibitor,t=i.selectedBooth,o=i.selectedEventItem,n=i.selectedRoute,l=i.selectedSpeaker,c=i.setKioskModeEnabled,a=i.list;let r;if(a.type==="route-planner"&&!e&&!t&&!o){const u=s.routePlannerStore;r={type:"planner",fromBookmarks:u.source==="bookmarks",items:u.items.map(Y=>Y.entity.slug).filter(Boolean),from:u.startPoint?.slug||void 0}}else if(n&&!i.isMultiPointRoute)r={type:"route",to:n.to instanceof F?n.to.slug:void 0,from:n.from instanceof F?n.from.slug:void 0,accessible:s.routeStore.onlyAccessible,waypoints:n.waypoints?.map(u=>u.slug)};else if(e)r={type:"slug",slug:e.slug};else if(t)r={type:"slug",slug:t.slug};else if(o)r={type:"slug",slug:o.slug};else if(l)r={type:"slug",slug:l.slug};else if(c)r={type:"none"};else switch(a.type){case"bookmarks":case"visited":case"sessions":case"exhibitors":case"speakers":case"tours":case"language":r={type:"list",list:a.type};break;case"category":r={type:"slug",slug:i.selectedCategory?.slug??""};break;case"search":r={type:"slug",slug:a.text||""};break;case"filter":r={type:"filter",key:a.query.key,value:a.query.value};break;case"multi-point-tour":r={type:"tour",tourId:a.tourId};break;default:throw new Error("Unkown list.type")}return{selection:r,exhibitor:e,booth:t,eventItem:o}}function G(){if(!fe)return;const e=i.selectedExhibitor,t=i.selectedEventItem,o=i.selectedSpeaker;let n="";e?n=e.name:t?n=t.name:o?n=o.name:i.list.type==="search"&&i.list.text?n="`"+(i.list.text||"")+"`":i.list.type==="multi-point-tour"&&i.tourTitle&&(n=i.tourTitle),n.length&&(n+=" \u2013 "),n+=ae(ee,O)??le(window.location.hostname,O),document.title=n}function K(e){try{if(i.setMapSettings(e),e.z){const t=s.layerStore.layers.find(o=>o.name===e.z);t&&s.layerStore.updateVisibility(t,!0)}}catch(t){console.error("Failed to process map settings.",t)}}