e63c221f2600cdc2c501c3f7d4b18e6691a0e94be2604b74340a8d5b57c3b9ac.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 { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { BrowserSyncFlow, ConfirmComponent, DateHelper, LoggerService, NavComponent, NavItemComponent, StartupService, StorageService } from '@common';\nimport { getNewStorageServiceConfig } from '../../../common/data/get-new-storage-service-config';\nimport { Buffer } from 'buffer';\nimport browser from 'webextension-polyfill';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/forms\";\nfunction SettingsComponent_Conditional_5_Template(rf, ctx) {\n if (rf & 1) {\n const _r2 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"button\", 21);\n i0.ɵɵlistener(\"click\", function SettingsComponent_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\", 5);\n i0.ɵɵtext(2, \"\\u2728\");\n i0.ɵɵelementEnd()();\n }\n}\nexport let SettingsComponent = /*#__PURE__*/(() => {\n class SettingsComponent extends NavComponent {\n #router = inject(Router);\n syncFlow;\n devMode = false;\n newPassword = '';\n changingPassword = false;\n passwordChanged = false;\n #storage = inject(StorageService);\n #startup = inject(StartupService);\n #logger = inject(LoggerService);\n ngOnInit() {\n const vault = JSON.stringify(this.#storage.getBrowserSyncHandler().browserSyncData);\n console.log(vault.length / 1024 + ' KB');\n switch (this.#storage.getSignerMetaHandler().signerMetaData?.syncFlow) {\n case BrowserSyncFlow.NO_SYNC:\n this.syncFlow = 'Off';\n break;\n case BrowserSyncFlow.BROWSER_SYNC:\n this.syncFlow = 'Mozilla Firefox';\n break;\n default:\n break;\n }\n // Load dev mode setting\n this.devMode = this.#storage.getSignerMetaHandler().signerMetaData?.devMode ?? false;\n }\n onToggleDevMode(event) {\n var _this = this;\n return _asyncToGenerator(function* () {\n const checked = event.target.checked;\n _this.devMode = checked;\n yield _this.#storage.getSignerMetaHandler().setDevMode(checked);\n })();\n }\n onTestPrompt() {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n // Open a test permission prompt window\n const testEvent = {\n kind: 1,\n content: 'This is a test note for permission prompt preview.',\n tags: [],\n created_at: Math.floor(Date.now() / 1000)\n };\n const base64Event = Buffer.from(JSON.stringify(testEvent, null, 2)).toString('base64');\n const currentIdentity = _this2.#storage.getBrowserSessionHandler().browserSessionData?.identities.find(i => i.id === _this2.#storage.getBrowserSessionHandler().browserSessionData?.selectedIdentityId);\n const nick = currentIdentity?.nick ?? 'Test Identity';\n const width = 375;\n const height = 600;\n const left = Math.round((screen.width - width) / 2);\n const top = Math.round((screen.height - height) / 2);\n browser.windows.create({\n type: 'popup',\n url: `prompt.html?method=signEvent&host=example.com&id=test-${Date.now()}&nick=${encodeURIComponent(nick)}&event=${base64Event}`,\n width,\n height,\n left,\n top\n });\n })();\n }\n onResetExtension() {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n try {\n _this3.#logger.logVaultReset();\n yield _this3.#storage.resetExtension();\n _this3.#startup.startOver(getNewStorageServiceConfig());\n } catch (error) {\n console.log(error);\n // TODO\n }\n })();\n }\n onChangePassword() {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n if (!_this4.newPassword || _this4.changingPassword) return;\n _this4.changingPassword = true;\n _this4.passwordChanged = false;\n try {\n yield _this4.#storage.changePassword(_this4.newPassword);\n _this4.passwordChanged = true;\n _this4.newPassword = '';\n } catch (e) {\n console.error('Change password failed:', e);\n } finally {\n _this4.changingPassword = false;\n }\n })();\n }\n onClickExportVault() {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n const jsonVault = _this5.#storage.exportVault();\n const dateTimeString = DateHelper.dateToISOLikeButLocal(new Date());\n const fileName = `Smesh Signer Firefox - Vault Export - ${dateTimeString}.json`;\n _this5.#downloadJson(jsonVault, fileName);\n _this5.#logger.logVaultExport(fileName);\n })();\n }\n #downloadJson(jsonString, fileName) {\n const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(jsonString);\n const downloadAnchorNode = document.createElement('a');\n downloadAnchorNode.setAttribute('href', dataStr);\n downloadAnchorNode.setAttribute('download', fileName);\n document.body.appendChild(downloadAnchorNode);\n downloadAnchorNode.click();\n downloadAnchorNode.remove();\n }\n onClickLock() {\n var _this6 = this;\n return _asyncToGenerator(function* () {\n _this6.#logger.logVaultLock();\n yield _this6.#storage.lockVault();\n _this6.#router.navigateByUrl('/vault-login');\n })();\n }\n static ɵfac = /*@__PURE__*/(() => {\n let ɵSettingsComponent_BaseFactory;\n return function SettingsComponent_Factory(__ngFactoryType__) {\n return (ɵSettingsComponent_BaseFactory || (ɵSettingsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(SettingsComponent)))(__ngFactoryType__ || SettingsComponent);\n };\n })();\n static ɵcmp = /*@__PURE__*/i0.ɵɵdefineComponent({\n type: SettingsComponent,\n selectors: [[\"app-settings\"]],\n features: [i0.ɵɵInheritDefinitionFeature],\n decls: 32,\n vars: 9,\n consts: [[\"newPasswordInput\", \"\"], [\"confirm\", \"\"], [1, \"sam-text-header\"], [1, \"header-buttons\"], [\"title\", \"Lock\", 1, \"header-btn\", 3, \"click\"], [1, \"emoji\"], [\"title\", \"Test Permission Prompt\", 1, \"header-btn\"], [1, \"password-row\"], [1, \"input-group\"], [\"type\", \"password\", \"placeholder\", \"new password\", 1, \"form-control\", 3, \"ngModelChange\", \"ngModel\"], [1, \"btn\", 3, \"click\", \"disabled\"], [1, \"vault-buttons\"], [1, \"btn\", \"btn-primary\", 3, \"click\"], [\"text\", \"\\uD83D\\uDCBE Backups\", 3, \"click\"], [\"text\", \"\\uD83E\\uDEB5 Logs\", 3, \"click\"], [\"text\", \"\\uD83D\\uDCA1 Info\", 3, \"click\"], [1, \"dev-mode-row\"], [1, \"toggle-label\"], [\"type\", \"checkbox\", 3, \"change\", \"checked\"], [1, \"sam-flex-grow\"], [1, \"btn\", \"btn-danger\", 3, \"click\"], [\"title\", \"Test Permission Prompt\", 1, \"header-btn\", 3, \"click\"]],\n template: function SettingsComponent_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"div\", 2)(1, \"div\", 3)(2, \"button\", 4);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_button_click_2_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.onClickLock());\n });\n i0.ɵɵelementStart(3, \"span\", 5);\n i0.ɵɵtext(4, \"\\uD83D\\uDD12\");\n i0.ɵɵelementEnd()();\n i0.ɵɵtemplate(5, SettingsComponent_Conditional_5_Template, 3, 0, \"button\", 6);\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(6, \"span\");\n i0.ɵɵtext(7, \" Settings \");\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(8, \"div\", 7)(9, \"div\", 8)(10, \"input\", 9, 0);\n i0.ɵɵtwoWayListener(\"ngModelChange\", function SettingsComponent_Template_input_ngModelChange_10_listener($event) {\n i0.ɵɵrestoreView(_r1);\n i0.ɵɵtwoWayBindingSet(ctx.newPassword, $event) || (ctx.newPassword = $event);\n return i0.ɵɵresetView($event);\n });\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(12, \"button\", 10);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_button_click_12_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.onChangePassword());\n });\n i0.ɵɵtext(13);\n i0.ɵɵelementEnd()()();\n i0.ɵɵelementStart(14, \"div\", 11)(15, \"button\", 12);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_button_click_15_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.onClickExportVault());\n });\n i0.ɵɵtext(16, \" Export Vault \");\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(17, \"button\", 12);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_button_click_17_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.navigate(\"/vault-import\"));\n });\n i0.ɵɵtext(18, \" Import Vault \");\n i0.ɵɵelementEnd()();\n i0.ɵɵelementStart(19, \"lib-nav-item\", 13);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_lib_nav_item_click_19_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.navigate(\"/home/backups\"));\n });\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(20, \"lib-nav-item\", 14);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_lib_nav_item_click_20_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.navigate(\"/home/logs\"));\n });\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(21, \"lib-nav-item\", 15);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_lib_nav_item_click_21_listener() {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.navigate(\"/home/info\"));\n });\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(22, \"div\", 16)(23, \"label\", 17)(24, \"input\", 18);\n i0.ɵɵlistener(\"change\", function SettingsComponent_Template_input_change_24_listener($event) {\n i0.ɵɵrestoreView(_r1);\n return i0.ɵɵresetView(ctx.onToggleDevMode($event));\n });\n i0.ɵɵelementEnd();\n i0.ɵɵelementStart(25, \"span\");\n i0.ɵɵtext(26, \"Dev Mode\");\n i0.ɵɵelementEnd()()();\n i0.ɵɵelement(27, \"div\", 19);\n i0.ɵɵelementStart(28, \"button\", 20);\n i0.ɵɵlistener(\"click\", function SettingsComponent_Template_button_click_28_listener() {\n i0.ɵɵrestoreView(_r1);\n const confirm_r4 = i0.ɵɵreference(31);\n return i0.ɵɵresetView(confirm_r4.show(\"Do you really want to reset your extension? Every data will be lost.\", ctx.onResetExtension.bind(ctx)));\n });\n i0.ɵɵtext(29, \" Reset Extension\\n\");\n i0.ɵɵelementEnd();\n i0.ɵɵelement(30, \"lib-confirm\", null, 1);\n }\n if (rf & 2) {\n i0.ɵɵadvance(5);\n i0.ɵɵconditional(ctx.devMode ? 5 : -1);\n i0.ɵɵadvance(5);\n i0.ɵɵtwoWayProperty(\"ngModel\", ctx.newPassword);\n i0.ɵɵadvance(2);\n i0.ɵɵclassProp(\"btn-primary\", !ctx.passwordChanged)(\"btn-success\", ctx.passwordChanged);\n i0.ɵɵproperty(\"disabled\", !ctx.newPassword || ctx.changingPassword);\n i0.ɵɵadvance();\n i0.ɵɵtextInterpolate1(\" \", ctx.changingPassword ? \"...\" : ctx.passwordChanged ? \"Changed\" : \"Change\", \" \");\n i0.ɵɵadvance(11);\n i0.ɵɵproperty(\"checked\", ctx.devMode);\n }\n },\n dependencies: [ConfirmComponent, NavItemComponent, FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel],\n styles: [\"[_nghost-%COMP%] {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n row-gap: var(--size);\\n overflow-y: auto;\\n}\\n[_nghost-%COMP%] > *[_ngcontent-%COMP%]:not(.sam-text-header) {\\n margin-left: var(--size);\\n margin-right: var(--size);\\n}\\n[_nghost-%COMP%] .file-input[_ngcontent-%COMP%] {\\n position: absolute;\\n visibility: hidden;\\n}\\n\\n.password-row[_ngcontent-%COMP%] .input-group[_ngcontent-%COMP%] {\\n display: flex;\\n}\\n.password-row[_ngcontent-%COMP%] .input-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\\n flex: 1;\\n min-width: 0;\\n}\\n.password-row[_ngcontent-%COMP%] .input-group[_ngcontent-%COMP%] .btn-success[_ngcontent-%COMP%] {\\n background: var(--success, #22c55e);\\n border-color: var(--success, #22c55e);\\n color: #fff;\\n}\\n\\n.vault-buttons[_ngcontent-%COMP%] {\\n display: flex;\\n gap: var(--size);\\n}\\n.vault-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\\n flex: 1;\\n}\\n\\n.dev-mode-row[_ngcontent-%COMP%] {\\n display: flex;\\n align-items: center;\\n gap: var(--size);\\n}\\n.dev-mode-row[_ngcontent-%COMP%] .toggle-label[_ngcontent-%COMP%] {\\n display: flex;\\n align-items: center;\\n gap: var(--size-h);\\n cursor: pointer;\\n font-size: 0.9rem;\\n}\\n.dev-mode-row[_ngcontent-%COMP%] .toggle-label[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%] {\\n width: 16px;\\n height: 16px;\\n cursor: pointer;\\n}\\n\\n.sync-info[_ngcontent-%COMP%] .sync-label[_ngcontent-%COMP%] {\\n display: block;\\n font-weight: 500;\\n}\\n.sync-info[_ngcontent-%COMP%] .sync-note[_ngcontent-%COMP%] {\\n margin: var(--size-h) 0 0 0;\\n font-size: 0.85rem;\\n color: var(--muted-foreground);\\n line-height: 1.4;\\n}\"]\n });\n }\n return SettingsComponent;\n})();","map":null,"metadata":{},"sourceType":"module","externalDependencies":[]}