@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 1.7 kB
JavaScript
export class ShortcutRegistry{providers=new Map;activationOrder=new Map;register(t){if(!t?.id)throw new Error("Provider must have a valid id");this.providers.set(t.id,t)}unregister(t){this.providers.delete(t),this.activationOrder.delete(t)}getShortcuts(t){const e=this.providers.get(t);if(!e)return[];const i=e.createShortcuts(),r=this.activationOrder.get(t);return r?this.sortShortcuts(i,r):i}sortShortcuts(t,e){const i=new Map(e.map((r,s)=>[r,s]));return t.sort((r,s)=>{if(r.active!==s.active)return r.active?-1:1;if(r.active&&s.active){const o=i.get(r.id),n=i.get(s.id);return o!==void 0&&n!==void 0?o-n:(o!==void 0?-1:0)-(n!==void 0?-1:0)}return 0})}handleShortcutClick(t,e){const i=this.providers.get(t);if(!i)return;const r=this.isShortcutActive(i,e);i.handleShortcutClick(e);const s=this.isShortcutActive(i,e);r!==s&&this.updateActivationOrder(t,e,r,s)}isShortcutActive(t,e){return t.createShortcuts().find(r=>r.id===e)?.active??!1}handleShortcutReset(t,e){const i=this.providers.get(t);if(!i?.handleShortcutReset)return;i.handleShortcutReset(e),this.activationOrder.get(t)?.includes(e)&&this.updateActivationOrder(t,e,!0,!1)}updateActivationOrder(t,e,i,r){const s=this.activationOrder.get(t)||[];let o;if(!i&&r)o=s.includes(e)?s:[...s,e];else if(i&&!r)o=s.filter(n=>n!==e);else return;o.length>0?this.activationOrder.set(t,o):this.activationOrder.delete(t)}updateActivationOrderFromState(t,e,i,r){this.updateActivationOrder(t,e,i,r)}shouldShowShortcuts(t){return this.providers.get(t)?.shouldShowShortcuts?.()??!0}getRegisteredProviders(){return Array.from(this.providers.keys())}isProviderRegistered(t){return this.providers.has(t)}clear(){this.providers.clear(),this.activationOrder.clear()}}