new-identity.component.ts raw

   1  /* eslint-disable @typescript-eslint/no-explicit-any */
   2  import { AfterViewInit, Component, inject } from '@angular/core';
   3  import { FormsModule } from '@angular/forms';
   4  import { Router } from '@angular/router';
   5  import { NavComponent, NostrHelper, StorageService } from '@common';
   6  import { generateSecretKey } from 'nostr-tools';
   7  import { bytesToHex } from '@noble/hashes/utils';
   8  
   9  @Component({
  10    selector: 'app-new-identity',
  11    templateUrl: './new-identity.component.html',
  12    styleUrl: './new-identity.component.scss',
  13    imports: [FormsModule],
  14  })
  15  export class NewIdentityComponent
  16    extends NavComponent
  17    implements AfterViewInit
  18  {
  19    readonly identity = {
  20      nick: '',
  21      privkeyInput: '',
  22    };
  23    canSave = false;
  24    alertMessage: any | undefined;
  25  
  26    readonly #storage = inject(StorageService);
  27    readonly #router = inject(Router);
  28  
  29    ngAfterViewInit(): void {
  30      document.getElementById('nickElement')?.focus();
  31    }
  32  
  33    toggleType(element: HTMLInputElement) {
  34      if (element.type === 'password') {
  35        element.type = 'text';
  36      } else {
  37        element.type = 'password';
  38      }
  39    }
  40  
  41    onClickGeneratePrivkey() {
  42      const sk = generateSecretKey();
  43      const privkey = bytesToHex(sk);
  44  
  45      this.identity.privkeyInput = NostrHelper.privkey2nsec(privkey);
  46      this.validateCanSave();
  47    }
  48  
  49    validateCanSave() {
  50      if (!this.identity.nick || !this.identity.privkeyInput) {
  51        this.canSave = false;
  52        return;
  53      }
  54  
  55      try {
  56        NostrHelper.getNostrPrivkeyObject(
  57          this.identity.privkeyInput.toLocaleLowerCase()
  58        );
  59        this.canSave = true;
  60      } catch (error) {
  61        console.log(error);
  62        this.canSave = false;
  63      }
  64    }
  65  
  66    async onClickSave() {
  67      if (!this.canSave) {
  68        return;
  69      }
  70  
  71      if (!this.identity.nick || !this.identity.privkeyInput) {
  72        return;
  73      }
  74  
  75      try {
  76        await this.#storage.addIdentity({
  77          nick: this.identity.nick,
  78          privkeyString: this.identity.privkeyInput,
  79        });
  80        this.#router.navigateByUrl('/home/identities');
  81      } catch (error: any) {
  82        this.alertMessage = error?.message;
  83        setTimeout(() => {
  84          this.alertMessage = undefined;
  85        }, 4500);
  86      }
  87    }
  88  }
  89