@river-build/sdk
Version:
For more details, visit the following resources:
99 lines • 3.59 kB
JavaScript
import { Observable } from '../../../observable/observable';
import { RiverTimelineEvent } from './timeline-types';
import { getMessageSenderId, getChannelMessageContent } from './timelineEvent';
// TODO: better name
export class ThreadStats extends Observable {
constructor(initialValue = {}) {
super(initialValue);
}
update(fn) {
this.setValue(fn(this.value));
}
reset() {
this.setValue({});
}
get(eventId) {
return this.value?.[eventId];
}
add(userId, event, currentTimeline) {
const parentId = event.threadParentId;
// if we have a parent...
if (parentId) {
this.update((current) => ({
...current,
[parentId]: this.formatThreadStat(userId, event, makeNewThreadStats(event, parentId, currentTimeline)),
}));
}
// if we are a parent...
if (this.value?.[event.eventId]) {
this.update((current) => ({
...current,
// TODO: try using somehow the formatThreadStat function
[event.eventId]: {
...current[event.eventId],
parentEvent: event,
parentMessageContent: getChannelMessageContent(event),
isParticipating: this.value?.[event.eventId]?.isParticipating ||
(event.content?.kind !== RiverTimelineEvent.RedactedEvent &&
this.value?.[event.eventId]?.replyEventIds.size > 0 &&
(event.sender.id === userId || event.isMentioned)),
},
}));
}
}
remove(timelineEvent) {
const parentId = timelineEvent.threadParentId;
if (!parentId) {
return;
}
if (!this.value?.[parentId]) {
return;
}
const updated = { ...this.value };
const entry = updated[parentId];
if (entry) {
entry.replyEventIds.delete(timelineEvent.eventId);
if (entry.replyEventIds.size === 0) {
delete updated[parentId];
}
else {
const senderId = getMessageSenderId(timelineEvent);
if (senderId) {
entry.userIds.delete(senderId);
}
}
}
this.setValue(updated);
}
formatThreadStat(userId, event, threadStat) {
if (event.content?.kind === RiverTimelineEvent.RedactedEvent) {
return threadStat;
}
threadStat.replyEventIds.add(event.eventId);
threadStat.latestTs = Math.max(threadStat.latestTs, event.createdAtEpochMs);
const senderId = getMessageSenderId(event);
if (senderId) {
threadStat.userIds.add(senderId);
}
threadStat.isParticipating =
threadStat.isParticipating ||
threadStat.userIds.has(userId) ||
threadStat.parentEvent?.sender.id === userId ||
event.isMentioned;
return threadStat;
}
}
function makeNewThreadStats(event, parentId, timeline) {
// one time lookup of the parent message for the first reply
const parent = timeline?.find((t) => t.eventId === parentId);
return {
replyEventIds: new Set(),
userIds: new Set(),
latestTs: event.createdAtEpochMs,
parentId,
parentEvent: parent,
parentMessageContent: getChannelMessageContent(parent),
isParticipating: false,
};
}
//# sourceMappingURL=threadStats.js.map