OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / chat / init / chat-member-update.reducer.js

46 lines · javascript ref:
import { isSeqInRange as e } from "../chat.model"
const s = (e) => e && !!e?.event?.type
export const isSameMemberAnotherDeviceHead = (e, { memberId: s, deviceId: d }) =>
  e.memberId === s && e.coreId.deviceId !== d && e.isHead
export const chatMessageMemberUpdateReducer = (
  d,
  { payload: { roomId: m, memberId: a, deviceId: r, local: t } },
) => {
  if (!a || !r) return d
  const o = Object.values(d.message.byId).reduce((e, s) => ((e[s.seq] = s), e), {}),
    c = {}
  Object.keys(d.message.byId).forEach((m) => {
    const i = d.message.byId[m],
      { memberId: I, coreId: b, seq: g } = i
    if (!e(d.listView.inView, g)) return
    if (b?.deviceId !== r || I === a) return
    let { isHead: n } = i
    if (n) {
      const e = o[i.seq - 1]
      s(e) || e.memberId !== a || (n = !1)
    }
    const l = o[i.seq + 1],
      y = l && isSameMemberAnotherDeviceHead(l, { memberId: a, deviceId: r })
    ;(!s(l) && y && (c[l.id] = { ...l, isHead: !1 }),
      (c[i.id] = { ...i, memberId: a, local: t, isHead: n }))
  })
  let i = d
  const I = d.lastMessageByRoomId[m]
  if (
    (I &&
      I.message.coreId?.deviceId === r &&
      I.message.memberId !== a &&
      (i = {
        ...i,
        lastMessageByRoomId: {
          ...i.lastMessageByRoomId,
          [m]: { ...I, message: { ...I.message, memberId: a } },
        },
      }),
    0 === Object.keys(c).length)
  )
    return i
  const b = d.message.groupedMessages.map((e) => c[e.id] || e)
  return { ...i, message: { ...i.message, byId: { ...i.message.byId, ...c }, groupedMessages: b } }
}