events.ts raw

   1  import { DomainEvent } from '../shared/events'
   2  import { Pubkey } from '../shared/value-objects/Pubkey'
   3  import { EventId } from '../shared/value-objects/EventId'
   4  import { Timestamp } from '../shared/value-objects/Timestamp'
   5  import { FeedType } from './FeedType'
   6  import { ContentFilter } from './ContentFilter'
   7  
   8  // ============================================================================
   9  // Feed Configuration Events
  10  // ============================================================================
  11  
  12  /**
  13   * Raised when the active feed is switched
  14   */
  15  export class FeedSwitched extends DomainEvent {
  16    get eventType(): string {
  17      return 'feed.switched'
  18    }
  19  
  20    constructor(
  21      readonly owner: Pubkey | null,
  22      readonly fromType: FeedType | null,
  23      readonly toType: FeedType,
  24      readonly relaySetId?: string
  25    ) {
  26      super()
  27    }
  28  }
  29  
  30  /**
  31   * Raised when the content filter settings are updated
  32   */
  33  export class ContentFilterUpdated extends DomainEvent {
  34    get eventType(): string {
  35      return 'feed.content_filter_updated'
  36    }
  37  
  38    constructor(
  39      readonly owner: Pubkey,
  40      readonly previousFilter: ContentFilter,
  41      readonly newFilter: ContentFilter
  42    ) {
  43      super()
  44    }
  45  }
  46  
  47  /**
  48   * Raised when a feed is manually refreshed
  49   */
  50  export class FeedRefreshed extends DomainEvent {
  51    get eventType(): string {
  52      return 'feed.refreshed'
  53    }
  54  
  55    constructor(
  56      readonly owner: Pubkey | null,
  57      readonly feedType: FeedType
  58    ) {
  59      super()
  60    }
  61  }
  62  
  63  // ============================================================================
  64  // Note Lifecycle Events
  65  // ============================================================================
  66  
  67  /**
  68   * Raised when a new note is created/published by the current user
  69   */
  70  export class NoteCreated extends DomainEvent {
  71    get eventType(): string {
  72      return 'feed.note_created'
  73    }
  74  
  75    constructor(
  76      readonly author: Pubkey,
  77      readonly noteId: EventId,
  78      readonly replyTo: EventId | null,
  79      readonly quotedNote: EventId | null,
  80      readonly mentions: readonly Pubkey[],
  81      readonly hashtags: readonly string[]
  82    ) {
  83      super()
  84    }
  85  
  86    get isReply(): boolean {
  87      return this.replyTo !== null
  88    }
  89  
  90    get isQuote(): boolean {
  91      return this.quotedNote !== null
  92    }
  93  
  94    get hasMentions(): boolean {
  95      return this.mentions.length > 0
  96    }
  97  }
  98  
  99  /**
 100   * Raised when a note is deleted (deletion event received)
 101   */
 102  export class NoteDeleted extends DomainEvent {
 103    get eventType(): string {
 104      return 'feed.note_deleted'
 105    }
 106  
 107    constructor(
 108      readonly author: Pubkey,
 109      readonly noteId: EventId
 110    ) {
 111      super()
 112    }
 113  }
 114  
 115  /**
 116   * Raised when a reply is received for a note the user cares about
 117   */
 118  export class NoteReplied extends DomainEvent {
 119    get eventType(): string {
 120      return 'feed.note_replied'
 121    }
 122  
 123    constructor(
 124      readonly originalNoteId: EventId,
 125      readonly originalAuthor: Pubkey,
 126      readonly replyNoteId: EventId,
 127      readonly replier: Pubkey
 128    ) {
 129      super()
 130    }
 131  }
 132  
 133  /**
 134   * Raised when users are mentioned in a note
 135   */
 136  export class UsersMentioned extends DomainEvent {
 137    get eventType(): string {
 138      return 'feed.users_mentioned'
 139    }
 140  
 141    constructor(
 142      readonly noteId: EventId,
 143      readonly author: Pubkey,
 144      readonly mentionedPubkeys: readonly Pubkey[]
 145    ) {
 146      super()
 147    }
 148  }
 149  
 150  // ============================================================================
 151  // Timeline Events
 152  // ============================================================================
 153  
 154  /**
 155   * Raised when new events arrive in the active timeline
 156   */
 157  export class TimelineEventsReceived extends DomainEvent {
 158    get eventType(): string {
 159      return 'feed.timeline_events_received'
 160    }
 161  
 162    constructor(
 163      readonly feedType: FeedType,
 164      readonly eventCount: number,
 165      readonly newestTimestamp: Timestamp,
 166      readonly isHistorical: boolean
 167    ) {
 168      super()
 169    }
 170  }
 171  
 172  /**
 173   * Raised when end-of-stored-events is received from all relays
 174   */
 175  export class TimelineEOSED extends DomainEvent {
 176    get eventType(): string {
 177      return 'feed.timeline_eosed'
 178    }
 179  
 180    constructor(
 181      readonly feedType: FeedType,
 182      readonly totalEvents: number
 183    ) {
 184      super()
 185    }
 186  }
 187  
 188  /**
 189   * Raised when more events are loaded (pagination)
 190   */
 191  export class TimelineLoadedMore extends DomainEvent {
 192    get eventType(): string {
 193      return 'feed.timeline_loaded_more'
 194    }
 195  
 196    constructor(
 197      readonly feedType: FeedType,
 198      readonly loadedCount: number,
 199      readonly oldestTimestamp: Timestamp
 200    ) {
 201      super()
 202    }
 203  }
 204