We can achieve this through the below approach.
Before Login call this function.
Here we check whether Is there any active tab present. If not cleat the localStorage and if required redirect to login(I have not done redirecting here).
checkActiveTabs() {
let localStorageTabs: TabModel[] = [];
const sessionTabId: number = Number(sessionStorage.getItem(AppUtils.TAB_ID));
localStorageTabs = JSON.parse(localStorage.getItem(AppUtils.TABS));
if(sessionTabId == 0 && localStorageTabs != null){
let activeTabs = localStorageTabs.find(item => item.status == 1);
if(activeTabs == undefined){
localStorage.clear();
}
}
}
To keep track of the tabs, once logged in invoke the below method.
setBrowserTabId() {
let localStorageTabs: TabModel[] = [];
const sessionTabId: number = Number(sessionStorage.getItem(AppUtils.TAB_ID));
localStorageTabs = JSON.parse(localStorage.getItem(AppUtils.TABS));
if (sessionTabId != 0) { // existing active tabs ?
if (localStorageTabs != null || localStorageTabs != undefined) {
localStorageTabs.find(item => item.tabId == sessionTabId).status = 1; //tab is refreshed, setting back to active.
}
} else { //new tab
const tabId = new Date().getTime(); //tab Id
sessionStorage.setItem(AppUtils.TAB_ID, JSON.stringify(tabId));
let tabmodel: TabModel = new TabModel();
tabmodel.tabId = tabId;
tabmodel.status = 1; //tab is active
if (localStorageTabs == null) {
localStorageTabs = [];
}
localStorageTabs.push(tabmodel);
}
localStorage.setItem(AppUtils.TABS, JSON.stringify(localStorageTabs));
}
To set inactive tab, invoke this on @HostListener
@HostListener('window:beforeunload ', ['$event'])
unloadHandler(event) {
const sessionTabId = sessionStorage.getItem(AppUtils.TAB_ID);
const localTabId : TabModel[] = JSON.parse(localStorage.getItem(AppUtils.TABS));
localTabId.find(item => item.tabId == +sessionTabId).status = 0;
localStorage.setItem(AppUtils.TABS, JSON.stringify(localTabId));
}
Note:
This logic will not work if browser crashed or if browser closed through windows task manager.