import {
put as e,
select as o,
fork as t,
all as r,
takeEvery as i,
takeLeading as n,
} from "redux-saga/effects"
import { apiTakeEvery as d, apiTakeMatch as m } from "../../lib"
import { taskErrorSaga as a, GENERIC_PAIRING_ERROR as c } from "../../error"
import { setRoomPairError as s } from "../joint"
import { getCoreBackend as l } from "../../../backend"
import { apiCall as y } from "../../../api/core"
import {
setDmRequests as u,
setDmActiveId as f,
getDmRequestById as p,
getDmActiveId as g,
dmRequestSubmit as I,
setDmContact as D,
setDmRequestSending as C,
setDmRequestSuccess as R,
setDmRequestError as b,
setDmReplySending as h,
setDmReplySuccess as q,
setDmReplyError as S,
resetAfterReply as E,
fetchDmContactInfoCmd as x,
} from "./room-dm.reducer"
import { parseRoomInfoResponse as w } from "../room.model"
import { getRoomItemById as A } from "../room.selector"
import { ROOM_DM_REPLY as M, ROOM_DM_STATUS_LIST as v } from "./room-dm.constant"
import {
formatDmRequest as H,
parseDmRoomConfigIds as T,
parseDmContactInfo as F,
} from "./room-dm.model"
import { setRoomInfo as P, switchRoomSubmit as j } from "../room.action"
import { userSuccessNotification as O } from "../../notification"
import { hasObjChanges as J } from "../../lib/object"
export function* getContactInfo(o) {
const t = l(),
r = yield y(t.getContactInfo, o),
i = F(r)
return (yield e(D(i)), i)
}
export function* getContactInfoForRoomId(o) {
const t = l(),
r = yield m([t.subscribeContactInfo, o], {
matchFn: (e) => !!e?.activeRoom?.id,
onError: (e) => a("subscribeContactInfo ", e),
}),
i = F(r)
return (yield e(D(i)), i)
}
function* V(o) {
const t = l()
try {
const { requestId: r } = o
;(yield e(h(M.ACCEPT)), yield y(t.acceptDmRequest, r))
const i = yield getContactInfoForRoomId(r.memberId)
;(i.roomId && (yield e(j({ roomId: i.roomId }))), yield e(q()))
} catch (o) {
;(yield a("dmAcceptHandler", o, { logWarn: !0 }),
yield e(S(o.message)),
yield e(s(o.code && o.message ? o.message : c)))
} finally {
yield e(E())
}
return !0
}
function* k(o) {
const t = l()
try {
const { requestId: r } = o
;(yield e(h(M.REJECT)), yield y(t.rejectDmRequest, r), yield e(q({ ...r, type: M.REJECT })))
} catch (o) {
;(yield e(S(o.message)), yield a("Error rejecting DM", o, { logOnly: !0 }))
} finally {
yield e(E())
}
return !0
}
function* B(o) {
const t = l()
try {
const { requestId: r } = o
;(yield e(h(M.DISCARD)), yield y(t.discardDmRequest, r), yield e(q()))
} catch (o) {
;(yield e(S(o.message)), yield a("Error discarding DM", o, { logOnly: !0 }))
}
return !0
}
function K(e) {
throw new Error("Dm blocking not supported")
}
export function* roomDmRequestHandler({
payload: { roomId: o, memberId: t, message: r, notificationMessage: i, encodedContactInfo: n },
}) {
try {
yield e(C())
const d = l()
;(n
? yield y(d.sendDMFromContact, n, { message: r })
: yield y(d.sendDMRequest, o, t, { message: r, receivers: [t] }),
i && (yield e(O({ message: i }))),
yield e(R()))
const m = yield* getContactInfoForRoomId(t)
m.roomId && (yield e(j({ roomId: m.roomId })))
} catch (o) {
;(yield e(b(o.message)), yield a("Could not dm member", o))
}
}
export function* roomDmSwitchHandler() {
try {
;(yield o(g)) && (yield e(f(null)))
} catch (e) {
yield a("Dm switch room error", e)
}
}
export function* roomDmReplyHandler({ replyType: t, requestId: r }) {
try {
const e = yield o(p(r))
switch (t) {
case M.ACCEPT:
return yield V(e)
case M.REJECT:
return yield k(e)
case M.DISCARD:
return yield B(e)
case M.BLOCK:
return yield K(e)
default:
throw new Error("Invalid dm reply type")
}
} catch (o) {
;(yield e(S(o.message)), yield a("Unable to respond to member dm", o, { logOnly: !0 }))
}
return !1
}
export function* roomDmActiveRequestSaga({ payload: e }) {
try {
const t = yield o(p(e))
if (t) {
const e = l()
yield y(e.updatePrivateMailboxRecord, t.requestId, { seen: 1 })
}
} catch (e) {
yield a("Could not update dm request", e)
}
}
export function* subscribeRoomDmRequestsSaga() {
yield r(
v.map((o) =>
d(
[l().subscribeDmRequestsByStatus, o],
(t) => {
const r = t.map(H)
return e(u({ requests: r, status: o }))
},
{ onError: (e) => a("subscribeRoomDmRequestsSaga", e) },
),
),
)
}
export function* roomDmContactSaga({ payload: o }) {
try {
o.dmMemberId && (yield e(D(T(o))))
} catch (e) {
yield a("roomDmContactSaga", e)
}
}
export function* fetchContactInfoSaga({ appVersion: t }, { payload: { memberId: r } }) {
try {
const { roomId: i } = yield getContactInfo(r)
if (i) {
const r = l(),
n = yield o(A(i)),
d = yield y(r.getRoomInfo, i),
m = w(d, t)
J(n, m) && (yield e(P(m)))
}
} catch (e) {
yield a("fetchContactInfoSaga", e)
}
}
export function* roomDmPairingSaga({ appVersion: e }) {
try {
;(yield i(f, roomDmActiveRequestSaga),
yield i(j, roomDmSwitchHandler),
yield i(P, roomDmContactSaga),
yield i(x, fetchContactInfoSaga, { appVersion: e }),
yield t(subscribeRoomDmRequestsSaga),
yield n(I, roomDmRequestHandler))
} catch (e) {
yield a("roomDmPairingSaga", e)
}
}