Who need this?
- Want to find a solution to sync data in sessionStorage between multiple tabs
Solution
- Create session storage service
ng g s session-storage
// session-storage.service.ts
import { Injectable, OnDestroy } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class SessionStorageService implements OnDestroy {
constructor() {
window.addEventListener('storage', this.handleStorageEvent, false);
this.requestSyncSessionStorage();
}
handleStorageEvent = (event: StorageEvent): void => {
if (event.key === 'requestSyncSessionStorage') {
console.log('handleStorageEvent - requestSyncSessionStorage', event);
localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
localStorage.removeItem('sessionStorage');
} else if (event.key === 'sessionStorage') {
console.log('handleStorageEvent - sessionStorage', event);
const sessionStorage = JSON.parse(event.newValue || '{}');
for (const key in sessionStorage) {
window.sessionStorage.setItem(key, sessionStorage[key]);
}
}
};
requestSyncSessionStorage(): void {
console.log('requestSyncSessionStorage - sessionStorage', sessionStorage);
if (!sessionStorage.length) {
const current = new Date().toLocaleTimeString();
console.log('requestSyncSessionStorage - request', current);
localStorage.setItem(
'requestSyncSessionStorage',
'request session storage' + current
);
}
}
getToken(): string {
const tokenStr = window.sessionStorage.getItem('token') || 'null';
const token = JSON.parse(tokenStr);
console.log('getToken', token);
return token;
}
setToken(): void {
const token = {
username: 'Hey It me',
token: '123456789',
timestamp: new Date().toLocaleTimeString(),
};
console.log('setToken', token);
window.sessionStorage.setItem('token', JSON.stringify(token));
}
removeToken(): void {
window.sessionStorage.removeItem('token');
}
ngOnDestroy(): void {
window.removeEventListener('storage', this.handleStorageEvent, false);
}
}
// app.component.html
<h1>Demo Share data between token storage service</h1>
<button (click)="sessionStorageService.setToken()">Set Token</button>
<button (click)="sessionStorageService.getToken()">Get Token</button>
<button (click)="sessionStorageService.removeToken()">Remove Token</button>
// app.component.ts
import { Component } from '@angular/core';
import { SessionStorageService } from './session-storage.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor(public sessionStorageService: SessionStorageService) {}
}
What are we gonna do?
- Step 1: Check session storage, if it null or empty => do step 2
- Step 2: Ask another tab: hey, have you got session storage? > send it to me (using localStorage event)
Top comments (0)