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