1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-11-11 10:10:25 +01:00
bitwarden-browser/src/app/app.component.ts

201 lines
8.0 KiB
TypeScript
Raw Normal View History

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-18 04:37:43 +01:00
Type,
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-16 21:03:29 +01:00
import { PremiumComponent } from './accounts/premium.component';
2018-02-10 05:41:29 +01:00
import { SettingsComponent } from './accounts/settings.component';
2018-02-18 04:37:43 +01:00
import { PasswordGeneratorHistoryComponent } from './vault/password-generator-history.component';
2018-02-10 05:41:29 +01:00
2018-02-08 18:24:17 +01:00
import { ToasterService } from 'angular2-toaster';
import { Angulartics2 } from 'angulartics2';
2018-04-25 05:23:10 +02:00
import { ModalComponent } from 'jslib/angular/components/modal.component';
2018-04-06 21:33:53 +02:00
import { BroadcasterService } from 'jslib/angular/services/broadcaster.service';
2018-02-08 18:24:17 +01:00
import { AuthService } from 'jslib/abstractions/auth.service';
import { CipherService } from 'jslib/abstractions/cipher.service';
2018-05-16 05:26:53 +02:00
import { CollectionService } from 'jslib/abstractions/collection.service';
2018-02-08 18:24:17 +01:00
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-14 06:26:32 +01:00
import { MessagingService } from 'jslib/abstractions/messaging.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-02-16 21:03:29 +01:00
<ng-template #premium></ng-template>
2018-02-18 04:37:43 +01:00
<ng-template #passwordHistory></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-02-16 21:03:29 +01:00
@ViewChild('premium', { read: ViewContainerRef }) premiumRef: ViewContainerRef;
2018-02-18 04:37:43 +01:00
@ViewChild('passwordHistory', { read: ViewContainerRef }) passwordHistoryRef: ViewContainerRef;
2018-02-10 05:41:29 +01:00
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-14 06:26:32 +01:00
private cryptoService: CryptoService, private componentFactoryResolver: ComponentFactoryResolver,
2018-05-31 20:40:34 +02:00
private messagingService: MessagingService, private collectionService: CollectionService) {
(window as any).BitwardenToasterService = toasterService;
}
2018-02-08 18:24:17 +01:00
ngOnInit() {
2018-04-12 20:38:41 +02:00
this.ngZone.runOutsideAngular(() => {
setTimeout(async () => {
await this.updateAppMenu();
}, 1000);
2018-02-14 06:26:32 +01:00
2018-04-12 20:38:41 +02: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 05:25:18 +01:00
2018-02-14 06:26:32 +01:00
this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => {
2018-02-08 21:58:47 +01:00
this.ngZone.run(async () => {
switch (message.command) {
case 'loggedIn':
2018-02-14 14:54:27 +01:00
case 'unlocked':
case 'loggedOut':
this.updateAppMenu();
2018-02-08 21:58:47 +01:00
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-14 14:54:27 +01:00
this.updateAppMenu();
2018-02-08 21:58:47 +01:00
break;
case 'syncStarted':
break;
case 'syncCompleted':
break;
2018-02-10 05:41:29 +01:00
case 'openSettings':
2018-02-18 04:37:43 +01:00
this.openModal<SettingsComponent>(SettingsComponent, this.settingsRef);
2018-02-10 05:41:29 +01:00
break;
2018-02-16 21:03:29 +01:00
case 'openPremium':
2018-02-18 04:37:43 +01:00
this.openModal<PremiumComponent>(PremiumComponent, this.premiumRef);
break;
case 'openPasswordHistory':
this.openModal<PasswordGeneratorHistoryComponent>(
PasswordGeneratorHistoryComponent, this.passwordHistoryRef);
2018-02-16 21:03:29 +01:00
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-14 06:26:32 +01:00
private async updateAppMenu() {
this.messagingService.send('updateAppMenu', {
isAuthenticated: await this.userService.isAuthenticated(),
isLocked: (await this.cryptoService.getKey()) == null,
});
}
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),
2018-05-16 05:26:53 +02:00
this.collectionService.clear(userId),
2018-02-08 21:58:47 +01:00
this.passwordGenerationService.clear(),
]);
2018-02-14 06:26:32 +01:00
this.authService.logOut(async () => {
2018-02-08 18:24:17 +01:00
this.analytics.eventTrack.next({ action: 'Logged Out' });
if (expired) {
this.toasterService.popAsync('warning', this.i18nService.t('loggedOut'),
this.i18nService.t('loginExpired'));
}
2018-02-14 14:54:27 +01:00
this.router.navigate(['login']);
2018-02-08 18:24:17 +01:00
});
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
2018-02-18 04:37:43 +01:00
private openModal<T>(type: Type<T>, ref: ViewContainerRef) {
2018-02-16 21:03:29 +01:00
if (this.modal != null) {
this.modal.close();
}
const factory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent);
2018-02-18 04:37:43 +01:00
this.modal = ref.createComponent(factory).instance;
const childComponent = this.modal.show<T>(type, ref);
2018-02-16 21:03:29 +01:00
this.modal.onClosed.subscribe(() => {
this.modal = null;
});
}
2018-01-16 20:48:34 +01:00
}