import {
select as e,
put as r,
take as o,
takeEvery as t,
delay as i,
takeLatest as s,
spawn as a,
} from "redux-saga/effects"
import { getCoreBackend as c } from "../../../backend"
import { taskErrorSaga as n } from "../../error"
import { apiSubscribeSaga as l, forkChildren as d, block as m } from "../../lib"
import {
subscribeMemberProfileSaga as f,
setMemberProfile as y,
subscribeMemberDevice as b,
} from "../../member"
import { chatMessagesTransform as g, createSubscribeQuery as u } from "../message"
import {
SUBSCRIBE_MESSAGES_TIMEOUT as p,
SUBSCRIBE_MESSAGES_DEVICE_TIMEOUT as M,
CHAT_WORKER as h,
} from "../chat.constant"
import { setChatMessagesInView as k, setChatListViewPeerSeenSeq as v } from "./list-view.action"
import {
updateChatMessageMentions as w,
reloadMessagesCmd as I,
subChatMessagesEvt as S,
} from "./list-view-data.action"
import { getChatListViewPeerSeenSeq as x, getChatListViewState as T } from "./list-view.selector"
import {
getChatMessageState as C,
getChatMentionsInView as B,
getChatPeerDeviceIdsInView as E,
getChatGroupChatMessages as O,
} from "./list-view-data.selector"
import { canConcatMessages as D } from "./list-view-data.reducer"
import { sharedCoreMessagesUpdate as W } from "../../api/data.action"
export function* chatMessageTransformSyncWorker({
roomId: t,
ignoreBlocked: i,
coreEventChannel: s,
}) {
for (;;) {
const a = yield o(s),
{ events: c, worker: l } = a,
d = yield g({ roomId: t, ignoreBlocked: i, coreEvents: c }),
[m, f, y] = d
if (l === h.BOTTOM || l === h.TOP) {
const r = yield e(O)
if (!D({ worker: l, newMessages: m, groupedMessages: r })) {
yield n("chatMessageTransformSyncWorker", `worker=${l}. Can't concat messages`)
continue
}
}
const b = yield e(x)
;(y > -1 && b < y && (yield r(v(y))),
yield r(W({ worker: l, coreEvents: c, chatMessages: m, files: f })))
}
}
export function* subscribeMessagesSaga(o) {
try {
const t = c(),
{ count: i } = yield e(C),
{ inView: s } = yield e(T),
a = u({ gte: s.top, lte: s.bottom }, i),
{ gte: d, lte: m } = a
yield l([t.subscribeChatMessages, o, { reverse: !0, gte: d, lte: m }], (e) => r(S(e)), {
onError: (e) => n("subscribeMessagesSaga", e),
})
} catch (e) {
yield n("subscribeMessagesSaga", e)
}
}
export function* chatSubscribeMessages(e, r = p) {
let o = null
try {
;(yield s([k, I], function* () {
try {
;(o?.cancel(), yield i(r), (o = yield a(subscribeMessagesSaga, e)))
} catch (e) {
yield n("chatSubscrbeMessagesCtrl", e)
}
}),
yield m())
} catch (e) {
yield n("chatSubscribeMessages", e)
} finally {
o?.cancel()
}
}
export function* chatMembersBlockedHandler() {
yield r(I())
}
export function* chatSubscribeMentions({ roomId: o }) {
;(yield t(y, function* ({ payload: { profile: o } }) {
;(yield e(B)).includes(o.memberId) && (yield r(w({ member: o })))
}),
yield d(
[W, k],
() => e(B),
function* ({ taskId: e }) {
yield f({ roomId: o, memberId: e })
},
(e) => n("mentionedMemberTask", e),
))
}
export function* chatMessageSubscribeDevice({ roomId: r }) {
yield d(
[W],
() => e(E),
function* ({ taskId: e }) {
yield b({ roomId: r, deviceId: e, delayMs: M })
},
(e) => n("chatDeviceChange", e),
)
}