@arnellebalane/master-tab
Version:
Controls which tab should be the master tab when opening a page in multiple browser tabs
1 lines • 4.14 kB
Source Map (JSON)
{"version":3,"file":"master-tab.mjs","sources":["../master-tab.js","../node_modules/@arnellebalane/event-emitter/dist/event-emitter.js"],"sourcesContent":["import EventEmitter from '@arnellebalane/event-emitter';\n\nconst MasterTab = new EventEmitter();\n\nconst STORAGE_KEY = MasterTab.STORAGE_KEY || 'mastertab';\nconst INSTANCE_ID = MasterTab.INSTANCE_ID\n || Math.floor(Math.random() * 0x10000).toString(16);\n\nconst state = {\n ACTIVE: 0,\n PASSIVE: 1,\n HIDDEN: 2\n};\n\nconst getTabState = () => {\n if (document.visibilityState === 'hidden') return state.HIDDEN;\n if (document.hasFocus()) return state.ACTIVE;\n return state.PASSIVE;\n};\n\nconst getTabStack = () => {\n const tabStack = localStorage.getItem(STORAGE_KEY);\n return tabStack ? tabStack.split(';') : [];\n};\n\nconst setTabStack = tabStack => {\n localStorage.setItem(STORAGE_KEY, tabStack.join(';'));\n};\n\nconst handleTabStackChange = tabStack => {\n MasterTab.emit('change', tabStack[0] === INSTANCE_ID);\n};\n\n['pageshow', 'focus', 'visibilitychange'].forEach(event => {\n window.addEventListener(event, e => {\n if (getTabState() === state.HIDDEN) {\n return;\n }\n\n const tabStack = getTabStack();\n\n let index = tabStack.indexOf(INSTANCE_ID);\n if (index < 0) {\n index = tabStack.length;\n }\n\n tabStack.splice(index, 1);\n tabStack.unshift(INSTANCE_ID);\n\n setTabStack(tabStack);\n handleTabStackChange(tabStack);\n });\n});\n\nwindow.addEventListener('unload', () => {\n const tabStack = getTabStack();\n const index = tabStack.indexOf(INSTANCE_ID);\n\n tabStack.splice(index, 1);\n\n setTabStack(tabStack);\n handleTabStackChange(tabStack);\n});\n\nwindow.addEventListener('storage', e => {\n if (e.key === STORAGE_KEY) {\n handleTabStackChange(getTabStack());\n }\n});\n\nexport default MasterTab;\n","var t=function(){this.$listeners={}};t.prototype.on=function(t,s){this.$listeners[t]||(this.$listeners[t]=[]),this.$listeners[t].push(s)},t.prototype.off=function(t,s){if(this.$listeners[t]){if(s instanceof Function){var e=this.$listeners[t].indexOf(s);this.$listeners[t].splice(e,1)}this.$listeners[t].length&&s||delete this.$listeners[t]}},t.prototype.emit=function(t,s){this.$listeners[t]&&this.$listeners[t].forEach(function(t){return t(s)})},module.exports=t;\n//# sourceMappingURL=event-emitter.js.map\n"],"names":["MasterTab","t","this","$listeners","prototype","on","s","push","off","Function","e","indexOf","splice","length","emit","forEach","module","STORAGE_KEY","INSTANCE_ID","Math","floor","random","toString","state","getTabStack","const","tabStack","localStorage","getItem","split","setTabStack","setItem","join","handleTabStackChange","event","window","addEventListener","document","visibilityState","hasFocus","index","unshift","key"],"mappings":"MAEMA,EAAY,gBCFlB,IAAIC,EAAE,WAAWC,KAAKC,eAAeF,EAAEG,UAAUC,GAAG,SAASJ,EAAEK,GAAGJ,KAAKC,WAAWF,KAAKC,KAAKC,WAAWF,OAAOC,KAAKC,WAAWF,GAAGM,KAAKD,IAAIL,EAAEG,UAAUI,IAAI,SAASP,EAAEK,GAAG,GAAGJ,KAAKC,WAAWF,GAAG,CAAC,GAAGK,aAAaG,SAAS,CAAC,IAAIC,EAAER,KAAKC,WAAWF,GAAGU,QAAQL,GAAGJ,KAAKC,WAAWF,GAAGW,OAAOF,EAAE,GAAGR,KAAKC,WAAWF,GAAGY,QAAQP,UAAUJ,KAAKC,WAAWF,KAAKA,EAAEG,UAAUU,KAAK,SAASb,EAAEK,GAAGJ,KAAKC,WAAWF,IAAIC,KAAKC,WAAWF,GAAGc,QAAQ,SAASd,GAAG,OAAOA,EAAEK,MAAMU,UAAef,wCDIxcgB,EAAcjB,EAAUiB,aAAe,YACvCC,EAAclB,EAAUkB,aACvBC,KAAKC,MAAsB,MAAhBD,KAAKE,UAAoBC,SAAS,IAE9CC,EACM,EADNA,EAEO,EAFPA,EAGM,EASNC,aACFC,IAAMC,EAAWC,aAAaC,QAAQX,GACtC,OAAOS,EAAWA,EAASG,MAAM,SAG/BC,WAAcJ,GAChBC,aAAaI,QAAQd,EAAaS,EAASM,KAAK,OAG9CC,WAAuBP,GACzB1B,EAAUc,KAAK,SAAUY,EAAS,KAAOR,KAG5C,WAAY,QAAS,oBAAoBH,iBAAQmB,GAC9CC,OAAOC,iBAAiBF,WAAOxB,GAC3B,IApB6B,WAA7B2B,SAASC,gBAAqCf,EAC9Cc,SAASE,WAAmBhB,EACzBA,KAkBmBA,EAAtB,CAIAE,IAAMC,EAAWF,IAEbgB,EAAQd,EAASf,QAAQO,GACzBsB,EAAQ,IACRA,EAAQd,EAASb,QAGrBa,EAASd,OAAO4B,EAAO,GACvBd,EAASe,QAAQvB,GAEjBY,EAAYJ,GACZO,EAAqBP,QAI7BS,OAAOC,iBAAiB,oBACpBX,IAAMC,EAAWF,IACXgB,EAAQd,EAASf,QAAQO,GAE/BQ,EAASd,OAAO4B,EAAO,GAEvBV,EAAYJ,GACZO,EAAqBP,KAGzBS,OAAOC,iBAAiB,mBAAW1B,GAC3BA,EAAEgC,MAAQzB,GACVgB,EAAqBT"}