2018-02-08 16:37:54 +01:00
|
|
|
import {
|
|
|
|
ToasterConfig,
|
|
|
|
ToasterContainerComponent,
|
|
|
|
} from 'angular2-toaster';
|
2018-01-26 16:50:06 +01:00
|
|
|
import { Angulartics2GoogleAnalytics } from 'angulartics2/ga';
|
|
|
|
|
2018-02-08 18:24:17 +01:00
|
|
|
import {
|
|
|
|
Component,
|
2018-02-10 05:41:29 +01:00
|
|
|
ComponentFactoryResolver,
|
2018-02-08 21:58:47 +01:00
|
|
|
NgZone,
|
2018-02-10 21:22:07 +01:00
|
|
|
OnDestroy,
|
2018-02-08 18:24:17 +01:00
|
|
|
OnInit,
|
2018-02-10 05:41:29 +01:00
|
|
|
ViewChild,
|
|
|
|
ViewContainerRef,
|
2018-02-08 18:24:17 +01:00
|
|
|
} from '@angular/core';
|
|
|
|
import { Router } from '@angular/router';
|
|
|
|
|
2018-02-10 05:41:29 +01:00
|
|
|
import { ModalComponent } from './modal.component';
|
2018-02-10 21:30:42 +01:00
|
|
|
|
2018-02-10 05:41:29 +01:00
|
|
|
import { SettingsComponent } from './accounts/settings.component';
|
|
|
|
|
2018-02-08 18:24:17 +01:00
|
|
|
import { ToasterService } from 'angular2-toaster';
|
|
|
|
import { Angulartics2 } from 'angulartics2';
|
|
|
|
|
|
|
|
import { BroadcasterService } from './services/broadcaster.service';
|
|
|
|
|
|
|
|
import { AuthService } from 'jslib/abstractions/auth.service';
|
|
|
|
import { CipherService } from 'jslib/abstractions/cipher.service';
|
|
|
|
import { CryptoService } from 'jslib/abstractions/crypto.service';
|
|
|
|
import { FolderService } from 'jslib/abstractions/folder.service';
|
|
|
|
import { I18nService } from 'jslib/abstractions/i18n.service';
|
2018-02-10 04:47:53 +01:00
|
|
|
import { LockService } from 'jslib/abstractions/lock.service';
|
2018-02-08 18:24:17 +01:00
|
|
|
import { PasswordGenerationService } from 'jslib/abstractions/passwordGeneration.service';
|
2018-02-08 21:58:47 +01:00
|
|
|
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
2018-02-08 18:24:17 +01:00
|
|
|
import { SettingsService } from 'jslib/abstractions/settings.service';
|
2018-02-10 05:25:18 +01:00
|
|
|
import { StorageService } from 'jslib/abstractions/storage.service';
|
2018-02-08 18:24:17 +01:00
|
|
|
import { SyncService } from 'jslib/abstractions/sync.service';
|
|
|
|
import { TokenService } from 'jslib/abstractions/token.service';
|
|
|
|
import { UserService } from 'jslib/abstractions/user.service';
|
2018-01-16 20:48:34 +01:00
|
|
|
|
2018-02-10 05:25:18 +01:00
|
|
|
import { ConstantsService } from 'jslib/services/constants.service';
|
|
|
|
|
2018-02-10 21:22:07 +01:00
|
|
|
const BroadcasterSubscriptionId = 'AppComponent';
|
|
|
|
|
2018-01-16 20:48:34 +01:00
|
|
|
@Component({
|
2018-01-16 21:58:17 +01:00
|
|
|
selector: 'app-root',
|
|
|
|
styles: [],
|
2018-01-26 20:12:41 +01:00
|
|
|
template: `
|
|
|
|
<toaster-container [toasterconfig]="toasterConfig"></toaster-container>
|
2018-02-10 05:41:29 +01:00
|
|
|
<ng-template #settings></ng-template>
|
2018-01-26 20:12:41 +01:00
|
|
|
<router-outlet></router-outlet>`,
|
2018-01-16 20:48:34 +01:00
|
|
|
})
|
2018-02-08 18:24:17 +01:00
|
|
|
export class AppComponent implements OnInit {
|
2018-02-10 05:41:29 +01:00
|
|
|
@ViewChild('settings', { read: ViewContainerRef }) settingsRef: ViewContainerRef;
|
|
|
|
|
2018-01-26 20:12:41 +01:00
|
|
|
toasterConfig: ToasterConfig = new ToasterConfig({
|
|
|
|
showCloseButton: true,
|
|
|
|
mouseoverTimerStop: true,
|
|
|
|
animation: 'flyRight',
|
|
|
|
limit: 5,
|
|
|
|
});
|
|
|
|
|
2018-02-10 05:25:18 +01:00
|
|
|
private lastActivity: number = null;
|
2018-02-10 05:41:29 +01:00
|
|
|
private modal: ModalComponent = null;
|
2018-02-10 05:25:18 +01:00
|
|
|
|
2018-02-08 18:24:17 +01:00
|
|
|
constructor(private angulartics2GoogleAnalytics: Angulartics2GoogleAnalytics,
|
|
|
|
private broadcasterService: BroadcasterService, private userService: UserService,
|
2018-02-10 05:25:18 +01:00
|
|
|
private tokenService: TokenService, private folderService: FolderService,
|
2018-02-08 18:24:17 +01:00
|
|
|
private settingsService: SettingsService, private syncService: SyncService,
|
|
|
|
private passwordGenerationService: PasswordGenerationService, private cipherService: CipherService,
|
|
|
|
private authService: AuthService, private router: Router, private analytics: Angulartics2,
|
2018-02-08 21:58:47 +01:00
|
|
|
private toasterService: ToasterService, private i18nService: I18nService,
|
2018-02-10 04:47:53 +01:00
|
|
|
private platformUtilsService: PlatformUtilsService, private ngZone: NgZone,
|
2018-02-10 05:25:18 +01:00
|
|
|
private lockService: LockService, private storageService: StorageService,
|
2018-02-10 05:41:29 +01:00
|
|
|
private cryptoService: CryptoService, private componentFactoryResolver: ComponentFactoryResolver) { }
|
2018-02-08 18:24:17 +01:00
|
|
|
|
|
|
|
ngOnInit() {
|
2018-02-10 05:25:18 +01:00
|
|
|
window.onmousemove = () => this.recordActivity();
|
|
|
|
window.onmousedown = () => this.recordActivity();
|
|
|
|
window.ontouchstart = () => this.recordActivity();
|
|
|
|
window.onclick = () => this.recordActivity();
|
|
|
|
window.onscroll = () => this.recordActivity();
|
|
|
|
window.onkeypress = () => this.recordActivity();
|
|
|
|
|
2018-02-10 21:22:07 +01:00
|
|
|
this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => {
|
2018-02-08 21:58:47 +01:00
|
|
|
this.ngZone.run(async () => {
|
|
|
|
switch (message.command) {
|
|
|
|
case 'loggedIn':
|
|
|
|
break;
|
|
|
|
case 'logout':
|
2018-02-10 04:47:53 +01:00
|
|
|
this.logOut(!!message.expired);
|
|
|
|
break;
|
|
|
|
case 'lockVault':
|
|
|
|
await this.lockService.lock();
|
2018-02-08 21:58:47 +01:00
|
|
|
break;
|
|
|
|
case 'locked':
|
2018-02-10 04:47:53 +01:00
|
|
|
this.router.navigate(['lock']);
|
2018-02-08 21:58:47 +01:00
|
|
|
break;
|
|
|
|
case 'unlocked':
|
|
|
|
break;
|
|
|
|
case 'syncStarted':
|
|
|
|
break;
|
|
|
|
case 'syncCompleted':
|
|
|
|
break;
|
2018-02-10 05:41:29 +01:00
|
|
|
case 'openSettings':
|
|
|
|
this.openSettings();
|
|
|
|
break;
|
2018-02-08 21:58:47 +01:00
|
|
|
default:
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2018-02-08 18:24:17 +01:00
|
|
|
|
2018-02-10 21:22:07 +01:00
|
|
|
ngOnDestroy() {
|
|
|
|
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
|
|
|
|
}
|
|
|
|
|
2018-02-08 21:58:47 +01:00
|
|
|
private async logOut(expired: boolean) {
|
|
|
|
const userId = await this.userService.getUserId();
|
2018-02-08 18:24:17 +01:00
|
|
|
|
2018-02-08 21:58:47 +01:00
|
|
|
await Promise.all([
|
|
|
|
this.syncService.setLastSync(new Date(0)),
|
|
|
|
this.tokenService.clearToken(),
|
|
|
|
this.cryptoService.clearKeys(),
|
|
|
|
this.userService.clear(),
|
|
|
|
this.settingsService.clear(userId),
|
|
|
|
this.cipherService.clear(userId),
|
|
|
|
this.folderService.clear(userId),
|
|
|
|
this.passwordGenerationService.clear(),
|
|
|
|
]);
|
|
|
|
|
2018-02-08 18:24:17 +01:00
|
|
|
this.authService.logOut(() => {
|
|
|
|
this.analytics.eventTrack.next({ action: 'Logged Out' });
|
|
|
|
if (expired) {
|
|
|
|
this.toasterService.popAsync('warning', this.i18nService.t('loggedOut'),
|
|
|
|
this.i18nService.t('loginExpired'));
|
|
|
|
}
|
|
|
|
this.router.navigate(['login']);
|
|
|
|
});
|
2018-01-26 16:50:06 +01:00
|
|
|
}
|
2018-02-10 05:25:18 +01:00
|
|
|
|
|
|
|
private async recordActivity() {
|
|
|
|
const now = (new Date()).getTime();
|
|
|
|
if (this.lastActivity != null && now - this.lastActivity < 250) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.lastActivity = now;
|
|
|
|
this.storageService.save(ConstantsService.lastActiveKey, now);
|
|
|
|
}
|
2018-02-10 05:41:29 +01:00
|
|
|
|
|
|
|
private openSettings() {
|
|
|
|
if (this.modal != null) {
|
|
|
|
this.modal.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent);
|
|
|
|
this.modal = this.settingsRef.createComponent(factory).instance;
|
|
|
|
const childComponent = this.modal.show<SettingsComponent>(SettingsComponent, this.settingsRef);
|
|
|
|
|
|
|
|
this.modal.onClosed.subscribe(() => {
|
|
|
|
this.modal = null;
|
|
|
|
});
|
|
|
|
}
|
2018-01-16 20:48:34 +01:00
|
|
|
}
|