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":[]}