From 6d83b4db7ffa8e37261bf1fb16c6196e36ae554e Mon Sep 17 00:00:00 2001 From: Milad Raeisi Date: Mon, 18 Nov 2024 11:08:31 +0400 Subject: [PATCH] Added share functionality to post-event component, updated event service to handle sharing, and made minor changes to post component and state service. --- .../post-event/post-event.component.html | 2 +- .../post-event/post-event.component.ts | 41 ++++++++++++++++++- .../layout/common/post/post.component.spec.ts | 23 ----------- src/app/layout/common/post/post.component.ts | 5 +++ src/app/services/event.service.ts | 37 +++++++++++++++++ src/app/services/state.service.ts | 6 +-- 6 files changed, 86 insertions(+), 28 deletions(-) delete mode 100644 src/app/layout/common/post/post.component.spec.ts diff --git a/src/app/components/post-event/post-event.component.html b/src/app/components/post-event/post-event.component.html index 6036d93..9f3f066 100644 --- a/src/app/components/post-event/post-event.component.html +++ b/src/app/components/post-event/post-event.component.html @@ -32,7 +32,7 @@ "> Comment - diff --git a/src/app/components/post-event/post-event.component.ts b/src/app/components/post-event/post-event.component.ts index 9da1a0a..ff5c5b7 100644 --- a/src/app/components/post-event/post-event.component.ts +++ b/src/app/components/post-event/post-event.component.ts @@ -28,6 +28,7 @@ import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { PostComponent } from 'app/layout/common/post/post.component'; import { NewEvent } from 'app/types/NewEvent'; import { EventService } from 'app/services/event.service'; +import { AngorConfirmationService } from '@angor/services/confirmation'; export interface PostReaction { @@ -88,7 +89,9 @@ export class PostEventComponent implements OnInit, OnDestroy { private _changeDetectorRef: ChangeDetectorRef, public parseContent: ParseContentService, private _sanitizer: DomSanitizer, - private _eventService: EventService + private _eventService: EventService, + private _angorConfirmationService: AngorConfirmationService, + ) { } ngOnInit(): void { @@ -217,6 +220,42 @@ export class PostEventComponent implements OnInit, OnDestroy { this.sendLike(event); } + onShare(event: NewEvent): void { + const dialogRef = this._angorConfirmationService.open({ + title: 'Share', + message: + 'Are you sure you want to share this post on your profile? This action is permanent and cannot be undone.', + icon: { + show: true, + name: 'heroicons_solid:share', + color: 'primary', + }, + actions: { + confirm: { + show: true, + label: 'Yes, Share', + color: 'primary', + }, + cancel: { + show: true, + label: 'Cancel', + }, + }, + dismissible: true, + }); + + dialogRef.afterClosed().subscribe((result) => { + console.log(result); + if (result === "confirmed") { + this._eventService.shareEvent(event).then(() => { + this._changeDetectorRef.detectChanges(); + }).catch(error => console.error('Failed to share post', error)); + + } + }); + } + + ngOnDestroy(): void { if (this.subscriptionId) { diff --git a/src/app/layout/common/post/post.component.spec.ts b/src/app/layout/common/post/post.component.spec.ts deleted file mode 100644 index 75523cb..0000000 --- a/src/app/layout/common/post/post.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PostComponent } from './post.component'; - -describe('PostComponent', () => { - let component: PostComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [PostComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(PostComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/layout/common/post/post.component.ts b/src/app/layout/common/post/post.component.ts index aaa16ef..52ed087 100644 --- a/src/app/layout/common/post/post.component.ts +++ b/src/app/layout/common/post/post.component.ts @@ -171,6 +171,11 @@ export class PostComponent implements OnDestroy { dialogRef.afterClosed().subscribe((result) => { console.log(result); + if (result === "confirmed") { + this.eventService.shareEvent(event); + + + } }); } diff --git a/src/app/services/event.service.ts b/src/app/services/event.service.ts index 4028ad6..54c8d63 100644 --- a/src/app/services/event.service.ts +++ b/src/app/services/event.service.ts @@ -169,4 +169,41 @@ export class EventService { console.error('Failed to send reply event:', error); } } + + + async shareEvent(event: NewEvent): Promise { + if (!event) return; + + try { + const tags = [ + ['e', event.id], + ['p', event.pubkey], + ]; + + const content = ''; + + const unsignedEvent = this.signerService.getUnsignedEvent( + 6, + tags, + content + ); + let signedEvent: NostrEvent; + + if (this.signerService.isUsingSecretKey()) { + const privateKey = await this.signerService.getDecryptedSecretKey(); + const privateKeyBytes = hexToBytes(privateKey); + signedEvent = finalizeEvent(unsignedEvent, privateKeyBytes); + } else { + signedEvent = await this.signerService.signEventWithExtension( + unsignedEvent + ); + } + + await this.relayService.publishEventToWriteRelays(signedEvent); + console.log('Event shared successfully:', signedEvent); + } catch (error) { + console.error('Failed to share event:', error); + } + } + } diff --git a/src/app/services/state.service.ts b/src/app/services/state.service.ts index fd75fa5..7acaa7d 100644 --- a/src/app/services/state.service.ts +++ b/src/app/services/state.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { SubscriptionService } from './subscription.service'; import { NostrEvent, Filter } from 'nostr-tools'; import { ContactEvent, StorageService } from './storage.service'; -import { Contacts, EncryptedDirectMessage } from 'nostr-tools/kinds'; +import { Contacts, EncryptedDirectMessage, Reaction, ShortTextNote } from 'nostr-tools/kinds'; @Injectable({ providedIn: 'root', @@ -121,7 +121,7 @@ export class StateService { const postsLastUpdate = await this.storageService.getLastUpdateDate('posts'); const postFilter: Filter = { - kinds: [1], + kinds: [ShortTextNote], authors: [pubkey], }; @@ -151,7 +151,7 @@ export class StateService { const likesLastUpdate = await this.storageService.getLastUpdateDate('myLikes'); const likeFilter: Filter = { - kinds: [7], + kinds: [Reaction], authors: [pubkey], };