-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscroll-store.ts
94 lines (81 loc) · 2.32 KB
/
scroll-store.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import {
Optional,
Injectable,
NgModule
} from '@angular/core';
import {
NavigationStart,
NavigationEnd,
Router
} from '@angular/router';
@Injectable()
export class SessionStorageService {
write ( key : string, value : any ) {
if ( value ) {
value = JSON.stringify( value );
}
sessionStorage.setItem( key, value );
}
read<T> ( key : string ) : T {
let value : string = sessionStorage.getItem( key );
if ( value && value != "undefined" && value != "null" ) {
return <T>JSON.parse( value );
}
}
}
@Injectable()
export class ScrollStore {
constructor ( @Optional() private router : Router, private storageService : SessionStorageService ) {
if ( router ) {
this.subscribeToRouter();
}
}
subscribeToRouter () {
this.router.events.subscribe( event => {
if ( event instanceof NavigationStart ) {
this.saveScrollPos( this.currentUrl );
}
if ( event instanceof NavigationEnd ) {
this.retrieveScrollPos( event );
}
} );
}
private scrollToZero () {
this.scrollTop = 0;
}
private get currentUrl () {
return this.router.url;
}
private get scrollTop () {
return document.body.scrollTop
}
private set scrollTop ( number : number ) {
document.body.scrollTop = number;
}
private saveScrollPos ( url ) {
this.storageService.write( url, this.scrollTop );
}
private retrieveScrollPos ( event : NavigationStart ) {
let retrievedScrollPos = this.storageService.read( event.url );
if ( retrievedScrollPos === undefined ) {
console.log( 'No saved position for ' + event.url + ' scroll to zero instead' );
this.scrollToZero();
} else {
console.log( 'Postion found for ' + event.url + ' scroll to' + retrievedScrollPos );
this.scrollTo( retrievedScrollPos as number );
}
}
private scrollTo ( retrievedScrollPos : number ) {
this.scrollTop = retrievedScrollPos;
}
}
@NgModule( {
providers : [
SessionStorageService,
ScrollStore
]
} )
export class ScrollStoreModule {
constructor ( private scrollStore : ScrollStore ) {
}
}