3f295389d969d5988abdf9fddbcd2f6a4e9bccfbfa5db2b01071acc4b0dce147.json raw
1 {"ast":null,"code":"import _asyncToGenerator from \"/home/mleku/src/orly.dev/next/signer/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ConfirmComponent, LoggerService, NavComponent, StartupService } from '@common';\nimport { getNewStorageServiceConfig } from '../../../common/data/get-new-storage-service-config';\nimport * as i0 from \"@angular/core\";\nconst _forTrack0 = ($index, $item) => $item.id;\nfunction BackupsComponent_Conditional_5_Template(rf, ctx) {\n if (rf & 1) {\n const _r2 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"button\", 16);\n i0.ɵɵlistener(\"click\", function BackupsComponent_Conditional_5_Template_button_click_0_listener() {\n i0.ɵɵrestoreView(_r2);\n const ctx_r2 = i0.ɵɵnextContext();\n return i0.ɵɵresetView(ctx_r2.onTestPrompt());\n });\n i0.ɵɵelementStart(1, \"span\", 4);\n i0.ɵɵtext(2, \"\\u2728\");\n i0.ɵɵelementEnd()();\n }\n}\nfunction BackupsComponent_Conditional_21_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 14)(1, \"span\");\n i0.ɵɵtext(2, \"No backups yet\");\n i0.ɵɵelementEnd()();\n }\n}\nfunction BackupsComponent_For_23_Template(rf, ctx) {\n if (rf & 1) {\n const _r4 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 15)(1, \"div\", 17)(2, \"span\", 18);\n i0.ɵɵtext(3);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(4, \"div\", 19)(5, \"span\", 20);\n i0.ɵɵtext(6);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(7, \"span\", 21);\n i0.ɵɵtext(8);\n i0.ɵɵelementEnd()()();\n i0.ɵɵelementStart(9, \"div\", 22)(10, \"button\", 23);\n i0.ɵɵlistener(\"click\", function BackupsComponent_For_23_Template_button_click_10_listener() {\n const backup_r5 = i0.ɵɵrestoreView(_r4).$implicit;\n const ctx_r2 = i0.ɵɵnextContext();\n const confirm_r6 = i0.ɵɵreference(25);\n return i0.ɵɵresetView(confirm_r6.show(\"Restore this backup? A backup of your current state will be created first.\", ctx_r2.restoreBackup.bind(ctx_r2, backup_r5.id)));\n });\n i0.ɵɵtext(11);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(12, \"button\", 24);\n i0.ɵɵlistener(\"click\", function BackupsComponent_For_23_Template_button_click_12_listener() {\n const backup_r5 = i0.ɵɵrestoreView(_r4).$implicit;\n const ctx_r2 = i0.ɵɵnextContext();\n const confirm_r6 = i0.ɵɵreference(25);\n return i0.ɵɵresetView(confirm_r6.show(\"Delete this backup? This cannot be undone.\", ctx_r2.deleteBackup.bind(ctx_r2, backup_r5.id)));\n });\n i0.ɵɵtext(13, \" Delete \");\n i0.ɵɵelementEnd()()();\n }\n if (rf & 2) {\n const backup_r5 = ctx.$implicit;\n const ctx_r2 = i0.ɵɵnextContext();\n i0.ɵɵadvance(3);\n i0.ɵɵtextInterpolate(ctx_r2.formatDate(backup_r5.createdAt));\n i0.ɵɵadvance(2);\n i0.ɵɵclassMap(ctx_r2.getReasonClass(backup_r5.reason));\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r2.getReasonLabel(backup_r5.reason), \" \");\n i0.ɵɵadvance(2);\n i0.ɵɵtextInterpolate1(\"\", backup_r5.identityCount, \" identity(ies)\");\n i0.ɵɵadvance(2);\n i0.ɵɵproperty(\"disabled\", ctx_r2.restoringBackupId !== null);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx_r2.restoringBackupId === backup_r5.id ? \"Restoring...\" : \"Restore\", \" \");\n }\n}\nexport let BackupsComponent = /*#__PURE__*/(() => {\n class BackupsComponent extends NavComponent {\n #router = inject(Router);\n #startup = inject(StartupService);\n #logger = inject(LoggerService);\n backups = [];\n maxBackups = 5;\n restoringBackupId = null;\n ngOnInit() {\n this.loadBackups();\n this.maxBackups = this.storage.getSignerMetaHandler().getMaxBackups();\n }\n loadBackups() {\n this.backups = this.storage.getSignerMetaHandler().getBackups();\n }\n onMaxBackupsChange(event) {\n var _this = this;\n return _asyncToGenerator(function* () {\n const input = event.target;\n const value = parseInt(input.value, 10);\n if (!isNaN(value) && value >= 1 && value <= 20) {\n _this.maxBackups = value;\n yield _this.storage.getSignerMetaHandler().setMaxBackups(value);\n }\n })();\n }\n createManualBackup() {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n const browserSyncData = _this2.storage.getBrowserSyncHandler().browserSyncData;\n if (browserSyncData) {\n yield _this2.storage.getSignerMetaHandler().createBackup(browserSyncData, 'manual');\n _this2.loadBackups();\n }\n })();\n }\n restoreBackup(backupId) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n _this3.restoringBackupId = backupId;\n try {\n // First, create a pre-restore backup of current state\n const currentData = _this3.storage.getBrowserSyncHandler().browserSyncData;\n if (currentData) {\n yield _this3.storage.getSignerMetaHandler().createBackup(currentData, 'pre-restore');\n }\n // Get the backup data\n const backupData = _this3.storage.getSignerMetaHandler().getBackupData(backupId);\n if (!backupData) {\n throw new Error('Backup not found');\n }\n // Import the backup\n yield _this3.storage.deleteVault(true);\n yield _this3.storage.importVault(backupData);\n _this3.#logger.logVaultImport('Backup Restore');\n _this3.storage.isInitialized = false;\n _this3.#startup.startOver(getNewStorageServiceConfig());\n } catch (error) {\n console.error('Failed to restore backup:', error);\n _this3.restoringBackupId = null;\n }\n })();\n }\n deleteBackup(backupId) {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n yield _this4.storage.getSignerMetaHandler().deleteBackup(backupId);\n _this4.loadBackups();\n })();\n }\n formatDate(isoDate) {\n const date = new Date(isoDate);\n return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();\n }\n getReasonLabel(reason) {\n switch (reason) {\n case 'auto':\n return 'Auto';\n case 'manual':\n return 'Manual';\n case 'pre-restore':\n return 'Pre-Restore';\n default:\n return 'Unknown';\n }\n }\n getReasonClass(reason) {\n switch (reason) {\n case 'auto':\n return 'reason-auto';\n case 'manual':\n return 'reason-manual';\n case 'pre-restore':\n return 'reason-prerestore';\n default:\n return '';\n }\n }\n goBack() {\n this.#router.navigateByUrl('/home/settings');\n }\n onClickLock() {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n _this5.#logger.logVaultLock();\n yield _this5.storage.lockVault();\n _this5.#router.navigateByUrl('/vault-login');\n })();\n }\n static ɵfac = /*@__PURE__*/(() => {\n let ɵBackupsComponent_BaseFactory;\n return function BackupsComponent_Factory(__ngFactoryType__) {\n return (ɵBackupsComponent_BaseFactory || (ɵBackupsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(BackupsComponent)))(__ngFactoryType__ || BackupsComponent);\n };\n })();\n static ɵcmp = /*@__PURE__*/i0.ɵɵdefineComponent({\n type: BackupsComponent,\n selectors: [[\"app-backups\"]],\n features: [i0.ɵɵInheritDefinitionFeature],\n decls: 26,\n vars: 3,\n consts: [[\"confirm\", \"\"], [1, \"sam-text-header\"], [1, \"header-buttons\"], [\"title\", \"Lock\", 1, \"header-btn\", 3, \"click\"], [1, \"emoji\"], [\"title\", \"Test Permission Prompt\", 1, \"header-btn\"], [\"title\", \"Go Back\", 1, \"back-btn\", 3, \"click\"], [1, \"backup-settings\"], [1, \"setting-row\"], [\"for\", \"maxBackups\"], [\"id\", \"maxBackups\", \"type\", \"number\", \"min\", \"1\", \"max\", \"20\", 3, \"change\", \"value\"], [1, \"setting-note\"], [1, \"btn\", \"btn-primary\", \"create-btn\", 3, \"click\"], [1, \"backups-list\"], [1, \"empty-state\"], [1, \"backup-item\"], [\"title\", \"Test Permission Prompt\", 1, \"header-btn\", 3, \"click\"], [1, \"backup-info\"], [1, \"backup-date\"], [1, \"backup-meta\"], [1, \"backup-reason\"], [1, \"backup-identities\"], [1, \"backup-actions\"], [1, \"btn\", \"btn-sm\", \"btn-secondary\", 3, \"click\", \"disabled\"], [1, \"btn\", \"btn-sm\", \"btn-danger\", 3, \"click\"]],\n template: function BackupsComponent_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 1)(1, \"div\", 2)(2, \"button\", 3);\n i0.ɵɵlistener(\"click\", function BackupsComponent_Template_button_click_2_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.onClickLock());\n });\n i0.ɵɵelementStart(3, \"span\", 4);\n i0.ɵɵtext(4, \"\\uD83D\\uDD12\");\n i0.ɵɵelementEnd()();\n i0.ɵɵtemplate(5, BackupsComponent_Conditional_5_Template, 3, 0, \"button\", 5);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(6, \"button\", 6);\n i0.ɵɵlistener(\"click\", function BackupsComponent_Template_button_click_6_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.goBack());\n });\n i0.ɵɵelementStart(7, \"span\", 4);\n i0.ɵɵtext(8, \"\\u2190\");\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(9, \"span\");\n i0.ɵɵtext(10, \"Backups\");\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(11, \"div\", 7)(12, \"div\", 8)(13, \"label\", 9);\n i0.ɵɵtext(14, \"Max Auto Backups:\");\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(15, \"input\", 10);\n i0.ɵɵlistener(\"change\", function BackupsComponent_Template_input_change_15_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.onMaxBackupsChange($event));\n });\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(16, \"p\", 11);\n i0.ɵɵtext(17, \" Automatic backups are created when significant changes are made. Manual and pre-restore backups are not counted toward this limit. \");\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(18, \"button\", 12);\n i0.ɵɵlistener(\"click\", function BackupsComponent_Template_button_click_18_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.createManualBackup());\n });\n i0.ɵɵtext(19, \" Create Backup Now\\n\");\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(20, \"div\", 13);\n i0.ɵɵtemplate(21, BackupsComponent_Conditional_21_Template, 3, 0, \"div\", 14);\n i0.ɵɵrepeaterCreate(22, BackupsComponent_For_23_Template, 14, 7, \"div\", 15, _forTrack0);\n i0.ɵɵelementEnd();\n i0.ɵɵelement(24, \"lib-confirm\", null, 0);\n }\n if (rf & 2) {\n i0.ɵɵadvance(5);\n i0.ɵɵconditional(ctx.devMode ? 5 : -1);\n i0.ɵɵadvance(10);\n i0.ɵɵproperty(\"value\", ctx.maxBackups);\n i0.ɵɵadvance(6);\n i0.ɵɵconditional(ctx.backups.length === 0 ? 21 : -1);\n i0.ɵɵadvance();\n i0.ɵɵrepeater(ctx.backups);\n }\n },\n dependencies: [ConfirmComponent],\n styles: [\"[_nghost-%COMP%] {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n padding: 8px;\\n gap: 12px;\\n}\\n\\n.sam-text-header[_ngcontent-%COMP%] {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n font-size: 18px;\\n font-weight: bold;\\n padding-bottom: 8px;\\n border-bottom: 1px solid var(--border);\\n}\\n\\n.lock-btn[_ngcontent-%COMP%], \\n.back-btn[_ngcontent-%COMP%] {\\n background: none;\\n border: none;\\n cursor: pointer;\\n padding: 4px;\\n border-radius: 4px;\\n}\\n.lock-btn[_ngcontent-%COMP%]:hover, \\n.back-btn[_ngcontent-%COMP%]:hover {\\n background: var(--muted);\\n}\\n.lock-btn[_ngcontent-%COMP%] .emoji[_ngcontent-%COMP%], \\n.back-btn[_ngcontent-%COMP%] .emoji[_ngcontent-%COMP%] {\\n font-size: 16px;\\n}\\n\\n.backup-settings[_ngcontent-%COMP%] {\\n background: var(--muted);\\n padding: 12px;\\n border-radius: 8px;\\n}\\n\\n.setting-row[_ngcontent-%COMP%] {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n}\\n.setting-row[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\\n font-weight: 500;\\n}\\n.setting-row[_ngcontent-%COMP%] input[type=number][_ngcontent-%COMP%] {\\n width: 60px;\\n padding: 4px 8px;\\n border: 1px solid var(--border);\\n border-radius: 4px;\\n background: var(--background);\\n color: var(--foreground);\\n}\\n\\n.setting-note[_ngcontent-%COMP%] {\\n margin-top: 8px;\\n font-size: 12px;\\n color: var(--muted-foreground);\\n}\\n\\n.create-btn[_ngcontent-%COMP%] {\\n align-self: flex-start;\\n}\\n\\n.backups-list[_ngcontent-%COMP%] {\\n flex: 1;\\n overflow-y: auto;\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n\\n.empty-state[_ngcontent-%COMP%] {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n height: 100px;\\n color: var(--muted-foreground);\\n}\\n\\n.backup-item[_ngcontent-%COMP%] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 12px;\\n background: var(--card);\\n border: 1px solid var(--border);\\n border-radius: 8px;\\n gap: 12px;\\n}\\n\\n.backup-info[_ngcontent-%COMP%] {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.backup-date[_ngcontent-%COMP%] {\\n font-weight: 500;\\n font-size: 13px;\\n}\\n\\n.backup-meta[_ngcontent-%COMP%] {\\n display: flex;\\n gap: 8px;\\n font-size: 11px;\\n}\\n\\n.backup-reason[_ngcontent-%COMP%] {\\n padding: 2px 6px;\\n border-radius: 4px;\\n font-weight: 500;\\n}\\n.backup-reason.reason-auto[_ngcontent-%COMP%] {\\n background: var(--muted);\\n color: var(--muted-foreground);\\n}\\n.backup-reason.reason-manual[_ngcontent-%COMP%] {\\n background: rgba(34, 197, 94, 0.2);\\n color: rgb(34, 197, 94);\\n}\\n.backup-reason.reason-prerestore[_ngcontent-%COMP%] {\\n background: rgba(234, 179, 8, 0.2);\\n color: rgb(234, 179, 8);\\n}\\n\\n.backup-identities[_ngcontent-%COMP%] {\\n color: var(--muted-foreground);\\n}\\n\\n.backup-actions[_ngcontent-%COMP%] {\\n display: flex;\\n gap: 8px;\\n flex-shrink: 0;\\n}\\n\\n.btn[_ngcontent-%COMP%] {\\n padding: 8px 16px;\\n border: none;\\n border-radius: 6px;\\n cursor: pointer;\\n font-weight: 500;\\n transition: background-color 0.2s;\\n}\\n.btn[_ngcontent-%COMP%]:disabled {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n.btn-primary[_ngcontent-%COMP%] {\\n background: var(--primary);\\n color: var(--primary-foreground);\\n}\\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\\n opacity: 0.9;\\n}\\n\\n.btn-secondary[_ngcontent-%COMP%] {\\n background: var(--secondary);\\n color: var(--secondary-foreground);\\n}\\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\\n background: var(--muted);\\n}\\n\\n.btn-danger[_ngcontent-%COMP%] {\\n background: rgba(239, 68, 68, 0.2);\\n color: rgb(239, 68, 68);\\n}\\n.btn-danger[_ngcontent-%COMP%]:hover:not(:disabled) {\\n background: rgba(239, 68, 68, 0.3);\\n}\\n\\n.btn-sm[_ngcontent-%COMP%] {\\n padding: 4px 10px;\\n font-size: 12px;\\n}\"]\n });\n }\n return BackupsComponent;\n})();","map":null,"metadata":{},"sourceType":"module","externalDependencies":[]}