UNPKG

@towns-protocol/sdk

Version:

For more details, visit the following resources:

63 lines 2.8 kB
import { Membership } from '../models/timelineTypes'; import { isDefined } from '../../check'; import { isEqual } from 'lodash-es'; export function dmsAndGdmsTransform(value, prev, prevResult) { // note to self, it makes more sense to loop over memberships, and to hydrate the dm/gdms from // local storage, then from remote data source, but for now we are copying existing behavior which is to // loop over streams and filter out the ones that are not relevant to the user const userId = value.userId; const gdmStreams = Object.entries(value.gdmStreams) .map(([streamId, gdmStream]) => { if (!gdmStream) { return undefined; } const membership = value.memberships[streamId]; const streamMemberIds = value.streamMemberIds[streamId] ?.filter((memberUserId) => memberUserId !== userId) .sort((a, b) => a.localeCompare(b)); return { id: streamId, joined: membership === Membership.Join, left: membership === Membership.Leave, userIds: streamMemberIds ?? [], properties: gdmStream.metadata, isDecryptingProperties: gdmStream.latestMetadataEventId !== gdmStream.metadataEventId, lastEventCreatedAtEpochMs: gdmStream.lastEventCreatedAtEpochMs, isGdm: true, }; }) .filter(isDefined); const dmStreams = Object.entries(value.dmStreams) .map(([streamId, dmStream]) => { if (!dmStream) { return undefined; } const membership = value.memberships[streamId]; const streamMemberIds = value.streamMemberIds[streamId] ?.filter((memberUserId, _index, numParticipants) => memberUserId !== userId || numParticipants.length === 1) .sort((a, b) => a.localeCompare(b)); return { id: streamId, joined: membership === Membership.Join, left: membership === Membership.Leave, userIds: streamMemberIds ?? [], properties: undefined, lastEventCreatedAtEpochMs: dmStream.lastEventCreatedAtEpochMs, isGdm: false, }; }) .filter(isDefined); const channels = [...dmStreams, ...gdmStreams].sort((a, b) => { if (a.lastEventCreatedAtEpochMs === b.lastEventCreatedAtEpochMs) { // If lastEventCreatedAtEpochMs is equal, sort by id return a.id < b.id ? -1 : a.id > b.id ? 1 : 0; } // Otherwise, sort by lastEventCreatedAtEpochMs return a.lastEventCreatedAtEpochMs > b.lastEventCreatedAtEpochMs ? -1 : 1; }); if (prevResult && isEqual(prevResult, channels)) { return prevResult; } return channels; } //# sourceMappingURL=dmsAndGdmsTransform.js.map