OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / chat / unread / chat-unread.reducer.js

94 lines · javascript ref:
import { chatInit as e } from "../init"
import { LAST_MESSAGE_ALL_SEEN_SEQ as t, CHAT_MESSAGE_TYPE as s } from "../chat.constant"
import { chatUnreadSyncData as a, setChatMessageLastSeen as n } from "./chat-unread.action"
import { setChatMessageCount as r, updateChatLastMessage as o } from "../message"
import { sharedCoreMessagesUpdate as c } from "../../api/data.action"
export const setChatLastSeenSeq = (e, t) =>
  e.listView.lastSeenSeq === t ? e : { ...e, listView: { ...e.listView, lastSeenSeq: t } }
export const setChatLastMessageUnread = (e, { roomId: t, lastSeenSeq: s }) => {
  const { lastMessageByRoomId: a } = e,
    n = a[t]
  return n && n.prevSeen !== s
    ? {
        ...e,
        lastMessageByRoomId: {
          ...a,
          [t]: { ...n, unread: Math.max(n.message.seq - s, 0), prevSeen: s },
        },
      }
    : e
}
export const chatLastSeenSeqReducer = (e, s, a) => {
  if (!Number.isFinite(s) || s === t) return e
  const n = a ? s : Math.max(e.listView.lastSeenSeq, s),
    r = setChatLastSeenSeq(e, n),
    { currentRoomId: o } = r
  return setChatLastMessageUnread(r, { roomId: o, lastSeenSeq: n })
}
export const chatLastSeenSyncReducer = (e, t) => {
  const { seq: s, roomId: a } = t.payload
  if (!Number.isFinite(s)) return e
  const {
    currentRoomId: n,
    listView: { lastSeenSeq: r },
  } = e
  let o = e
  const c = Math.max(r, s)
  return (
    n === a && (o = setChatLastSeenSeq(e, c)),
    setChatLastMessageUnread(o, { roomId: a, lastSeenSeq: c })
  )
}
export const chatMessagesSeenReducer = (e) => {
  const {
    message: { ids: t, byId: s },
    listView: { lastSeenSeq: a },
  } = e
  let n = e
  for (let e = 0; e < t.length; e += 1) {
    const r = t[e],
      { seq: o, local: c, event: S } = s[r] || {}
    if (o <= a) return n
    if (c && !S) return ((n = chatLastSeenSeqReducer(n, o)), n)
  }
  return n
}
export const chatUnreadReducer = (S, i) => {
  switch (i.type) {
    case e.type: {
      const { lastSeenSeq: e } = i.payload
      return chatLastSeenSeqReducer(S, e)
    }
    case r.type: {
      const {
        message: { count: e },
        listView: { lastSeenSeq: s },
      } = S
      return s !== t && s > e - 1 ? chatLastSeenSeqReducer(S, e - 1, !0) : S
    }
    case c.type: {
      const { lastSeenSeq: e } = S.listView
      let s = S
      return (
        e === t && (s = chatLastSeenSeqReducer(s, S.message.seqLoaded.bottom)),
        chatMessagesSeenReducer(s)
      )
    }
    case n.type:
      return chatLastSeenSeqReducer(S, i.payload)
    case a.type:
      return chatLastSeenSyncReducer(S, i)
    case o.type: {
      const { roomId: e, message: t, unread: a } = i.payload
      return e !== S.currentRoomId || a || t.event?.type !== s.CALL_STARTED
        ? S
        : {
            ...S,
            listView: { ...S.listView, lastSeenSeq: Math.max(S.listView.lastSeenSeq, t.seq) },
          }
    }
    default:
      return S
  }
}