From 983a82c0bab8a66e20a37d0e132babae27385ae0 Mon Sep 17 00:00:00 2001 From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> Date: Tue, 21 May 2024 22:13:40 +0200 Subject: [PATCH] [PM-7611] Create a new vault settings component [UI changes] (#9220) * Create vault-settings-v2 component - Copy existing vault-settings component - Make new component standalone - Replace app-header with popup-header - Replace nav-buttons with bit-item - Register route to show new component when extension refresh flag is enabled * Move sync functionality to vault-settings-v2 * Use anchors instead of buttons when navigating to a sub-page * Removed unneeded component within routing * Use new ToastService instead of PlatformUtils * Remove unused MessagingService --------- Co-authored-by: Daniel James Smith --- apps/browser/src/popup/app-routing.module.ts | 6 +- .../settings/vault-settings-v2.component.html | 35 +++++++++ .../settings/vault-settings-v2.component.ts | 76 +++++++++++++++++++ 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 apps/browser/src/vault/popup/settings/vault-settings-v2.component.html create mode 100644 apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 1db2f92d3e5..a65abef0845 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -54,6 +54,7 @@ import { AppearanceComponent } from "../vault/popup/settings/appearance.componen import { FolderAddEditComponent } from "../vault/popup/settings/folder-add-edit.component"; import { FoldersComponent } from "../vault/popup/settings/folders.component"; import { SyncComponent } from "../vault/popup/settings/sync.component"; +import { VaultSettingsV2Component } from "../vault/popup/settings/vault-settings-v2.component"; import { VaultSettingsComponent } from "../vault/popup/settings/vault-settings.component"; import { extensionRefreshRedirect, extensionRefreshSwap } from "./extension-refresh-route-utils"; @@ -263,12 +264,11 @@ const routes: Routes = [ canActivate: [AuthGuard], data: { state: "notifications" }, }, - { + ...extensionRefreshSwap(VaultSettingsComponent, VaultSettingsV2Component, { path: "vault-settings", - component: VaultSettingsComponent, canActivate: [AuthGuard], data: { state: "vault-settings" }, - }, + }), { path: "folders", component: FoldersComponent, diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html new file mode 100644 index 00000000000..10243bdaa9f --- /dev/null +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html @@ -0,0 +1,35 @@ + + + + + + + + + + + {{ "folders" | i18n }} + + + + + + + + + {{ "exportVault" | i18n }} + + + + + + + + diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts new file mode 100644 index 00000000000..c969f0436df --- /dev/null +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.ts @@ -0,0 +1,76 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; +import { Router, RouterModule } from "@angular/router"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { ItemModule, ToastOptions, ToastService } from "@bitwarden/components"; + +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + templateUrl: "vault-settings-v2.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupFooterComponent, + PopupHeaderComponent, + PopOutComponent, + ItemModule, + ], +}) +export class VaultSettingsV2Component implements OnInit { + lastSync = "--"; + + constructor( + private router: Router, + private syncService: SyncService, + private toastService: ToastService, + private i18nService: I18nService, + ) {} + + async ngOnInit() { + await this.setLastSync(); + } + + async import() { + await this.router.navigate(["/import"]); + if (await BrowserApi.isPopupOpen()) { + await BrowserPopupUtils.openCurrentPagePopout(window); + } + } + + async sync() { + let toastConfig: ToastOptions; + const success = await this.syncService.fullSync(true); + if (success) { + await this.setLastSync(); + toastConfig = { + variant: "success", + title: "", + message: this.i18nService.t("syncingComplete"), + }; + } else { + toastConfig = { variant: "error", title: "", message: this.i18nService.t("syncingFailed") }; + } + this.toastService.showToast(toastConfig); + } + + private async setLastSync() { + const last = await this.syncService.getLastSync(); + if (last != null) { + this.lastSync = last.toLocaleDateString() + " " + last.toLocaleTimeString(); + } else { + this.lastSync = this.i18nService.t("never"); + } + } +}