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