UNPKG

@towns-protocol/sdk

Version:

For more details, visit the following resources:

79 lines 2.92 kB
import { isEqual } from 'lodash-es'; import { isChannelStreamId, spaceIdFromChannelId } from '../../id'; export function spaceMentionsTransform(value, prev, state) { state = state ?? { mentionsMap: {} }; const unreadMarkers = value.fullyReadMarkers.markers; const threadsStats = value.timelinesView.threadsStats; const timelines = value.timelinesView.timelines; const mentionsMap = {}; for (const [streamId, timeline] of Object.entries(timelines)) { if (!isChannelStreamId(streamId)) { continue; } const channelId = streamId; const spaceId = spaceIdFromChannelId(channelId); if (!timeline?.length) { return state; } let mentions = mentionsMap[spaceId]; if (!mentions) { mentions = []; mentionsMap[spaceId] = mentions; } const channelMentions = timeline .filter((event) => event.isMentioned) .map((event) => { const threadStat = event.threadParentId ? threadsStats[channelId]?.[event.threadParentId] : undefined; const fullyReadMarker = unreadMarkers[event.threadParentId ?? channelId]; return { type: 'mention', unread: fullyReadMarker?.isUnread === true && event.eventNum >= fullyReadMarker.eventNum, channelId, timestamp: event.createdAtEpochMs, event, thread: threadStat?.parentEvent, }; }); mentions.push(...channelMentions); } for (const [spaceId, mentions] of Object.entries(mentionsMap)) { mentions.sort( //firstBy<MentionResult>((m) => (m.unread ? 0 : 1)).thenBy((a) => a.timestamp, -1), (a, b) => { if (a.unread && !b.unread) { return -1; } else if (!a.unread && b.unread) { return 1; } else if (a.timestamp > b.timestamp) { return -1; } else if (a.timestamp < b.timestamp) { return 1; } else { return 0; } }); state = setMentions(spaceId, mentions, state); } return state; } function setMentions(spaceId, mentions, prev) { if (isEqual(prev.mentionsMap[spaceId]?.mentions, mentions)) { return prev; } const unreadThreadCount = mentions.reduce((count, m) => { return m.thread && m.unread ? count + 1 : count; }, 0); const unreadChannelCount = mentions.reduce((count, m) => { return !m.thread && m.unread ? count + 1 : count; }, 0); const next = { mentions, unreadThreadCount, unreadChannelCount }; return { mentionsMap: { ...prev.mentionsMap, [spaceId]: next } }; } //# sourceMappingURL=spaceMentionsTransform.js.map