import {
put as e,
takeLeading as r,
fork as o,
call as m,
delay as d,
select as i,
take as t,
takeLatest as l,
takeEvery as b,
} from "redux-saga/effects"
import { apiSubscribeSaga as n, forkChildren as c } from "../lib"
import { getCoreBackend as y } from "../../backend"
import { apiCall as I } from "../../api/core"
import { taskErrorSaga as a } from "../error"
import { getMyMemberId as s } from "../identity"
import {
setMemberProfile as u,
setMemberProfileNotFound as f,
memberDeviceOwnerChangeEvt as M,
isAddMemberUnknownSwarmId as p,
setMemberBySwarmId as g,
getMembersUnknownSwarmIds as E,
memberChangeRoleSubmit as S,
getCanMyMemberManageRoles as v,
getMemberItemById as P,
memberMuteToggleCmd as R,
memberMuteToggleSuccess as x,
memberChangeOtherMemberRoleSuccess as h,
isMemberProfileChanged as w,
memberSubscribeToManagedMember as D,
memberCancelSubscribeToManagedMember as _,
setMemberMutedStatus as B,
setMemberProfileRemoved as C,
setMemberDisabledCapabilities as O,
memberRemoveCmd as T,
memberRemoveSuccess as U,
isSetMemberProfile as k,
getMemberConfig as A,
myMemberMuted as L,
myMemberRemoved as W,
} from "./member.reducer"
import { NOTIFICATION_CODE as F, userCustomNotification as G } from "../notification"
import {
parseMemberResponse as N,
getMemberRole as Y,
isMemberDataChanged as j,
} from "./member.model"
export function* unknownSwarmIdsResolveSaga({ roomId: r }) {
yield c(
[p({ roomId: r })],
() => i(E(r)),
function* ({ taskId: o }) {
yield n(
[y().subscribeMember, r, o, { swarmId: !0 }],
(m) => {
const d = N(m)
return e(g({ roomId: r, swarmId: o, member: d }))
},
{ onError: (e) => a("subscribeMemberBySwarmId", e) },
)
},
(e) => a("subscribeMemberBySwarmId", e),
)
}
export function* memberMuteToggleSaga({ payload: { roomId: r, memberId: o, mute: m } }) {
try {
const d = y()
;(m ? yield I(d.muteMember, r, o) : yield I(d.unmuteMember, r, o),
yield e(B({ roomId: r, memberId: o, muted: m })),
yield e(x({ roomId: r, memberId: o, mute: m })))
} catch (e) {
yield a("Could not mute member", e)
}
}
export function* removeMemberSaga({ payload: { roomId: r, memberId: o } }) {
try {
const m = y()
;(yield I(m.removeMember, r, o), yield e(U()))
} catch (e) {
yield a("Could not remove member", e)
}
}
export function* fetchMemberProfile({ roomId: r, memberId: o }) {
const d = yield m(y().getMember, r, o)
let i
return (
d
? ((i = N(d)), yield e(u({ roomId: r, profile: i })))
: yield e(f({ roomId: r, memberId: o })),
i
)
}
export function* subscribeMyMemberProfileSaga({ roomId: r, myMemberId: o }) {
yield n(
[y().subscribeMember, r, o],
function* (m) {
const d = yield i(P(r, o)),
t = N(m)
;(t.isRemoved && (yield e(W({ roomId: r }))),
j(d, t) &&
(t.isMuted && !d?.isMuted && (yield e(L({ roomId: r }))),
yield e(u({ roomId: r, profile: t, prevProfile: d }))))
},
{ onError: (e) => a("subscribeMyMemberProfile", e) },
)
}
export function* subscribeMemberProfileSaga({ roomId: r, memberId: o }) {
let t = yield m(fetchMemberProfile, { roomId: r, memberId: o })
const { MEMBER_SUBSCRIBE_TIMEOUT: l } = yield i(A)
;(yield d(l),
yield n(
[y().subscribeMember, r, o],
function* (o) {
const m = N(o)
j(t, m) && (yield e(u({ roomId: r, profile: m, prevProfile: t })), (t = m))
},
{ onError: (e) => a("subscribeMemberProfile", e) },
))
}
export function* subscribeMemberDevice({ roomId: r, deviceId: o, delayMs: m }) {
const i = y()
;(Number.isInteger(m) && m > 0 && (yield d(m)),
yield n(
[i.subscribeMemberForDevice, r, o],
(m) => e(M({ roomId: r, deviceId: o, memberId: m?.memberId, local: m?.local })),
{ onError: (e) => a("subscribeMemberDevice", e) },
))
}
function* q(r, { payload: o }) {
if (!(yield i(v(r)))) return
const { memberId: m, role: d } = o
try {
const o = y()
;(yield I(o.changeMemberRole, r, { memberId: m, role: d }),
yield e(h({ roomId: r, memberId: m, role: d })))
} catch (e) {
yield a("Could not change member role", e)
}
}
function* z({ payload: r }) {
const { roomId: o, memberId: m, role: d } = r
yield e(G({ code: F.ROOM_MEMBER_ROLE_UPDATE, roomId: o, memberId: m, newRole: d }))
}
function* H({ payload: r }) {
const { roomId: o, prevProfile: m, profile: d } = r,
t = yield i(s)
if (!d || !m || t !== d.memberId) return
const l = Y(m),
b = Y(d)
l <= b || (yield e(G({ code: F.MY_ROLE_UPGRADE, roomId: o, newRole: b })))
}
function* J() {
;(yield b(w, H), yield b(h, z))
}
function* K(r) {
yield l([D, _], function* (o) {
const { payload: m } = o
if (_.match(o)) return
const d = y(),
{ memberId: i } = m
yield n(
[d.subscribeMembers, r, { lte: i, gte: i, limit: 1 }],
function* (o) {
o.length
? yield e(u({ roomId: r, profile: N(o[0]) }))
: yield e(C({ roomId: r, memberId: i }))
},
{ onError: (e) => a("subscribeManageMember", e) },
)
})
}
export function* memberWaitProfileData({ roomId: e, memberId: r }) {
let o = yield i(P(e, r))
for (; !o; ) (yield t(k(r)), (o = yield i(P(e, r))))
return o
}
export function* memberSaga({
roomId: m,
myMemberId: d,
disabledCapabilities: i,
muteMemberSupported: t,
}) {
;(i && (yield e(O({ roomId: m }))),
yield o(subscribeMyMemberProfileSaga, { roomId: m, myMemberId: d }),
yield memberWaitProfileData({ roomId: m, memberId: d }),
yield r(T, removeMemberSaga),
t && (yield r(R, memberMuteToggleSaga)),
yield l(S, q, m),
yield o(K, m),
yield o(J))
}