diff --git a/projects/chrome/src/app/app.routes.ts b/projects/chrome/src/app/app.routes.ts index a3af182..7256970 100644 --- a/projects/chrome/src/app/app.routes.ts +++ b/projects/chrome/src/app/app.routes.ts @@ -15,6 +15,7 @@ import { HomeComponent as EditIdentityHomeComponent } from './components/edit-id import { KeysComponent as EditIdentityKeysComponent } from './components/edit-identity/keys/keys.component'; import { PermissionsComponent as EditIdentityPermissionsComponent } from './components/edit-identity/permissions/permissions.component'; import { RelaysComponent as EditIdentityRelaysComponent } from './components/edit-identity/relays/relays.component'; +import { VaultImportComponent } from './components/vault-import/vault-import.component'; export const routes: Routes = [ { @@ -39,6 +40,10 @@ export const routes: Routes = [ }, ], }, + { + path: 'vault-import', + component: VaultImportComponent, + }, { path: 'home', component: HomeComponent, diff --git a/projects/chrome/src/app/common/data/chrome-meta-handler.ts b/projects/chrome/src/app/common/data/chrome-meta-handler.ts index 8cec314..a1d5bb7 100644 --- a/projects/chrome/src/app/common/data/chrome-meta-handler.ts +++ b/projects/chrome/src/app/common/data/chrome-meta-handler.ts @@ -23,7 +23,15 @@ export class ChromeMetaHandler extends GootiMetaHandler { await chrome.storage.local.set(data); } - async clearData(): Promise { - await chrome.storage.local.remove(this.metaProperties); + async clearData(keep: string[]): Promise { + const toBeRemovedProperties: string[] = []; + + for (const property of this.metaProperties) { + if (!keep.includes(property)) { + toBeRemovedProperties.push(property); + } + } + + await chrome.storage.local.remove(toBeRemovedProperties); } } diff --git a/projects/chrome/src/app/components/home/settings/settings.component.html b/projects/chrome/src/app/components/home/settings/settings.component.html index fa9806b..f45078b 100644 --- a/projects/chrome/src/app/components/home/settings/settings.component.html +++ b/projects/chrome/src/app/components/home/settings/settings.component.html @@ -8,15 +8,7 @@ Export Vault - @@ -26,12 +18,12 @@ class="btn btn-danger" (click)=" confirm.show( - 'Do you really want to delete your vault with all identities?', - onDeleteVault.bind(this) + 'Do you really want to reset your extension? Every data will be lost.', + onResetExtension.bind(this) ) " > - Delete Vault + Reset Extension diff --git a/projects/chrome/src/app/components/home/settings/settings.component.ts b/projects/chrome/src/app/components/home/settings/settings.component.ts index c492cbe..ec9c2e7 100644 --- a/projects/chrome/src/app/components/home/settings/settings.component.ts +++ b/projects/chrome/src/app/components/home/settings/settings.component.ts @@ -4,6 +4,7 @@ import { BrowserSyncFlow, ConfirmComponent, DateHelper, + NavComponent, StartupService, StorageService, } from '@common'; @@ -15,7 +16,7 @@ import { getNewStorageServiceConfig } from '../../../common/data/get-new-storage templateUrl: './settings.component.html', styleUrl: './settings.component.scss', }) -export class SettingsComponent implements OnInit { +export class SettingsComponent extends NavComponent implements OnInit { syncFlow: string | undefined; readonly #storage = inject(StorageService); @@ -41,9 +42,9 @@ export class SettingsComponent implements OnInit { } } - async onDeleteVault() { + async onResetExtension() { try { - await this.#storage.deleteVault(); + await this.#storage.resetExtension(); this.#startup.startOver(getNewStorageServiceConfig()); } catch (error) { console.log(error); diff --git a/projects/chrome/src/app/components/vault-create/home/home.component.html b/projects/chrome/src/app/components/vault-create/home/home.component.html index 5580f14..d7be47b 100644 --- a/projects/chrome/src/app/components/vault-create/home/home.component.html +++ b/projects/chrome/src/app/components/vault-create/home/home.component.html @@ -6,7 +6,7 @@
- +
- - diff --git a/projects/chrome/src/app/components/vault-create/home/home.component.ts b/projects/chrome/src/app/components/vault-create/home/home.component.ts index 1372b30..b41f328 100644 --- a/projects/chrome/src/app/components/vault-create/home/home.component.ts +++ b/projects/chrome/src/app/components/vault-create/home/home.component.ts @@ -1,7 +1,6 @@ import { Component, inject } from '@angular/core'; import { Router } from '@angular/router'; -import { BrowserSyncData, StartupService, StorageService } from '@common'; -import { getNewStorageServiceConfig } from '../../../common/data/get-new-storage-service-config'; +import { NavComponent } from '@common'; @Component({ selector: 'app-home', @@ -9,28 +8,6 @@ import { getNewStorageServiceConfig } from '../../../common/data/get-new-storage templateUrl: './home.component.html', styleUrl: './home.component.scss', }) -export class HomeComponent { +export class HomeComponent extends NavComponent { readonly router = inject(Router); - readonly #storage = inject(StorageService); - readonly #startup = inject(StartupService); - - async onImportFileChange(event: Event) { - try { - const element = event.currentTarget as HTMLInputElement; - const file = element.files !== null ? element.files[0] : undefined; - if (!file) { - return; - } - - const text = await file.text(); - const vault = JSON.parse(text) as BrowserSyncData; - console.log(vault); - - await this.#storage.importVault(vault); - this.#startup.startOver(getNewStorageServiceConfig()); - } catch (error) { - console.log(error); - // TODO - } - } } diff --git a/projects/chrome/src/app/components/vault-import/vault-import.component.html b/projects/chrome/src/app/components/vault-import/vault-import.component.html new file mode 100644 index 0000000..d56f06d --- /dev/null +++ b/projects/chrome/src/app/components/vault-import/vault-import.component.html @@ -0,0 +1,39 @@ +
+ + + Import Vault +
+ +
+ + You can select any snapshot that you have previously uploaded on the + options page. + + + + + + Please note that your data will be imported regarding your current SYNC + setting: {{ syncText }} + +
+ +
+ + diff --git a/projects/chrome/src/app/components/vault-import/vault-import.component.scss b/projects/chrome/src/app/components/vault-import/vault-import.component.scss new file mode 100644 index 0000000..d176ea6 --- /dev/null +++ b/projects/chrome/src/app/components/vault-import/vault-import.component.scss @@ -0,0 +1,46 @@ +:host { + height: 100%; + display: flex; + flex-direction: column; + overflow-y: auto; + overflow-x: hidden; + + .custom-header { + padding-top: var(--size); + padding-bottom: var(--size); + display: grid; + grid-template-columns: 1fr; + grid-template-rows: auto; + align-items: center; + background: var(--background); + + .button { + grid-column-start: 1; + grid-column-end: 2; + grid-row-start: 1; + grid-row-end: 2; + justify-self: start; + margin-left: 16px; + z-index: 1; + } + + .text { + grid-column-start: 1; + grid-column-end: 2; + grid-row-start: 1; + grid-row-end: 2; + font-size: 20px; + font-weight: 500; + justify-self: center; + height: 32px; + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 70%; + } + } + + .import-button { + margin: var(--size); + } +} diff --git a/projects/chrome/src/app/components/vault-import/vault-import.component.spec.ts b/projects/chrome/src/app/components/vault-import/vault-import.component.spec.ts new file mode 100644 index 0000000..f5c2197 --- /dev/null +++ b/projects/chrome/src/app/components/vault-import/vault-import.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VaultImportComponent } from './vault-import.component'; + +describe('VaultImportComponent', () => { + let component: VaultImportComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VaultImportComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VaultImportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/chrome/src/app/components/vault-import/vault-import.component.ts b/projects/chrome/src/app/components/vault-import/vault-import.component.ts new file mode 100644 index 0000000..2290dc3 --- /dev/null +++ b/projects/chrome/src/app/components/vault-import/vault-import.component.ts @@ -0,0 +1,71 @@ +import { Component, inject, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { + BrowserSyncFlow, + GootiMetaData_VaultSnapshot, + IconButtonComponent, + NavComponent, + StartupService, + StorageService, +} from '@common'; +import browser from 'webextension-polyfill'; +import { getNewStorageServiceConfig } from '../../common/data/get-new-storage-service-config'; + +@Component({ + selector: 'app-vault-import', + imports: [IconButtonComponent, FormsModule], + templateUrl: './vault-import.component.html', + styleUrl: './vault-import.component.scss', +}) +export class VaultImportComponent extends NavComponent implements OnInit { + snapshots: GootiMetaData_VaultSnapshot[] = []; + selectedSnapshot: GootiMetaData_VaultSnapshot | undefined; + syncText: string | undefined; + + readonly #storage = inject(StorageService); + readonly #startup = inject(StartupService); + + async openOptionsPage() { + await browser.runtime.openOptionsPage(); + } + + ngOnInit(): void { + this.#loadData(); + } + + async onClickImport() { + if (!this.selectedSnapshot) { + return; + } + + try { + await this.#storage.deleteVault(true); + await this.#storage.importVault(this.selectedSnapshot.data); + this.#storage.isInitialized = false; + this.#startup.startOver(getNewStorageServiceConfig()); + } catch (error) { + console.log(error); + // TODO + } + } + + async #loadData() { + this.snapshots = ( + this.#storage.getGootiMetaHandler().gootiMetaData?.vaultSnapshots ?? [] + ).sortBy((x) => x.fileName, 'desc'); + + const syncFlow = + this.#storage.getGootiMetaHandler().gootiMetaData?.syncFlow; + + switch (syncFlow) { + case BrowserSyncFlow.BROWSER_SYNC: + this.syncText = 'GOOGLE CHROME'; + break; + + default: + case BrowserSyncFlow.NO_SYNC: + this.syncText = 'OFF'; + break; + } + } +} diff --git a/projects/chrome/src/app/components/vault-login/vault-login.component.html b/projects/chrome/src/app/components/vault-login/vault-login.component.html index 99c5cc8..b01b7b8 100644 --- a/projects/chrome/src/app/components/vault-login/vault-login.component.html +++ b/projects/chrome/src/app/components/vault-login/vault-login.component.html @@ -5,7 +5,7 @@