import { remote } from '../utils/db.js' import { currentProfile } from '../services/login.service.js' /** * Base notifier class * @param {number} profileId needed to listen for events for this profile */ class Toaster { constructor(profileId) { this.url = `${remote}/notification/${profileId}/subscribe` this.source = null this.source = new EventSource(this.url) this.listenFor('end', message => this.source.close) } listenFor(event, callback) { this.source.addEventListener(event, callback) } stop() { this.source.close() } } /** * Example extension that listens for 'stonk' events */ class StonkAlert extends Toaster { constructor(profileId, waveCb) { super(profileId) this.event = 'stonk' this.stonks = {} this.listenFor(`${profileId}.${this.event}`, message => { const parsed = JSON.parse(message.data) if (parsed.name === 'REVEALED_INFO') { this._appendTagsToGrouping(parsed) } this.stonks[parsed.name] = parsed waveCb(this._formatToast(parsed), parsed.type) }) } _formatToast(parsed) { if (parsed.revealed_info) { return `${parsed.name}: ${parsed.revealed_info} at ${parsed.type}: ${parsed.url}` } else if (parsed.url) { return `${parsed.name}: ${parsed.profile_id}: visit: ${parsed.url}` } else { return `${parsed.name}: ${parsed.profile_id} ${parsed.order} at ${parsed.price}` } } _appendTagsToGrouping(parsed) { const foundGrouping = currentProfile.groupings.find( grouping => grouping.grouping_id === parsed.grouping_id, ) if (foundGrouping) { const tagFromNotification = { is_active: 1, tag_category: 'reveal', profile_id: parsed.profile_id, tag_description: parsed.description, tag_id: parsed.tag, } const target_desc = parsed.description tagFromNotification[target_desc] = parsed.revealed_info foundGrouping.profile.reveal.push(tagFromNotification) foundGrouping.revealedFromNotification.value.push( tagFromNotification, ) } } } export { Toaster, StonkAlert }