import { createAction as e } from "@reduxjs/toolkit"
import { put as r } from "redux-saga/effects"
import { forkChildren as m, block as t } from "../lib"
import { taskErrorSaga as o } from "../error"
import { subscribeMemberProfileSaga as s } from "./member.saga"
export const memberSubscribeCmd = e("member/subscribe-cmd")
export const memberUnsubscribeCmd = e("member/unsubscribe-cmd")
export const memberStartSubsCmd = e("member/start-subs-cmd")
export const memberSubscribeIdsCmd = e("member/subscribe-ids-cmd")
const d = 50
export const createMemberSubscriptionMiddleware =
(e = 50) =>
({ dispatch: r }) => {
const m = new Map(),
t = (e) => {
let r = m.get(e)
return (
r || ((r = { timer: 0, updateAt: 0, roomId: e, counter: new Map() }), m.set(e, r)),
r
)
},
o = (m) => {
if (((m.updateAt = Date.now() + e), m.timer)) return
const t = () => {
const e = m.updateAt - Date.now()
if (e > 0) return void (m.timer = setTimeout(t, e))
m.timer = null
const { counter: o, roomId: s } = m,
d = Array.from(o.keys())
r(memberSubscribeIdsCmd({ roomId: s, memberIds: d }))
}
t()
},
s = (e, r) => {
const { counter: m } = e,
t = m.get(r)
t ? m.set(r, t + 1) : (m.set(r, 1), o(e))
},
d = (e, r) => {
const { counter: m } = e,
t = m.get(r)
t && (t > 1 ? m.set(r, t - 1) : (m.delete(r), o(e)))
}
return (e) => (m) => {
if (memberSubscribeCmd.match(m))
return (
(({ roomId: e, memberIds: r, memberId: m }) => {
if (!e) return
const o = t(e)
m && s(o, m)
const d = r?.length
for (let e = 0; e < d; e += 1) {
const m = r[e]
m && s(o, m)
}
})(m.payload),
m
)
if (memberUnsubscribeCmd.match(m))
return (
(({ roomId: e, memberIds: r, memberId: m }) => {
if (!e) return
const o = t(e)
m && d(o, m)
const s = r?.length
for (let e = 0; e < s; e += 1) {
const m = r[e]
m && d(o, m)
}
})(m.payload),
m
)
if (memberStartSubsCmd.match(m)) {
const { roomId: e } = m.payload
if (e) {
const { counter: m } = t(e),
o = Array.from(m.keys())
o.length > 0 && r(memberSubscribeIdsCmd({ roomId: e, memberIds: o }))
}
return m
}
return e(m)
}
}
export function* memberAllSubscriptionSaga({ roomId: e }) {
;(yield* m(
(r) => memberSubscribeIdsCmd.match(r) && r.payload.roomId === e,
(e) => e.payload.memberIds,
({ taskId: r }) => s({ roomId: e, memberId: r }),
(e) => o("memberSubscriptionSaga", e),
),
yield r(memberStartSubsCmd({ roomId: e })),
yield t())
}