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
}
}