OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / member-list / member-list.saga.js

120 lines · javascript ref:
import { select as e, call as r, put as i, takeLatest as o, fork as t } from "redux-saga/effects"
import { getCoreBackend as m } from "../../backend"
import { apiCall as s } from "../../api/core"
import { taskErrorSaga as d } from "../error"
import { apiSubscribeSaga as c, apiSubscribeLatest as b } from "../lib/external-src"
import {
  getMemberListSearch as n,
  setModerators as l,
  setPeers as a,
  initializeMemberListSubscriptionCmd as y,
  searchMembers as u,
  onScrollEnd as f,
  getMemberListPeersLimit as p,
  setSearchPeers as I,
  setItemsInView as M,
  getMemberListData as S,
  setMemberById as h,
  memberListInViewIdsChangeEvt as g,
  setAdmins as x,
  resetMemberList as E,
  getMemberListPeers as k,
  getMemberListLastPeer as L,
  setAdminsModeratorsIsLoading as P,
  getMemberListSubscribeToMemberTypes as v,
} from "./member-list.reducer"
import { forkChildren as A } from "../lib"
import { canIndex as j, canModerate as O, parseMemberResponse as T } from "../member"
import { cursorKey as D } from "./member-list.constants"
function* q() {
  const r = {}
  yield o(M, function* ({ payload: o }) {
    const t = yield e(S),
      { top: m, bottom: s } = o
    if (!m && !s && !t) return
    const d = t?.slice(m, s)
    let c = !1
    ;(Object.keys(r).forEach((e) => {
      d.includes(e) || (delete r[e], (c = !0))
    }),
      d
        .filter((e) => !r[e])
        .forEach((e) => {
          ;((r[e] = !0), (c = !0))
        }),
      c && (yield i(g(Object.keys(r)))))
  })
}
function* w(e) {
  const r = e?.reduce((e, r) => {
    const i = r?.memberId
    return { ...e, [i]: T(r) }
  }, {})
  yield i(h({ data: r }))
}
function* z(e) {
  const o = [],
    t = []
  for (const r of e) j(r.capabilities) ? o.push(r) : O(r.capabilities) && t.push(r)
  ;(yield i(x(o?.map((e) => e?.memberId))),
    yield i(l(t?.map((e) => e?.memberId))),
    yield r(w, [...o, ...t]))
}
export function* memberSubscribeModerators({ roomId: r }, o) {
  if (E.match(o)) return
  const { subscribeToAdminsAndModerators: t } = yield e(v)
  if (!t) return
  const b = m()
  yield i(P(!0))
  const n = yield s(b.getModerators, r)
  ;(yield z(n),
    yield c([b.subscribeModerators, r], z, { onError: (e) => d("memberSubscribeModerators", e) }))
}
export function* memberSubscribePeers({ roomId: r }, o) {
  if (E.match(o)) return
  const { subscribeToPeers: t } = yield e(v)
  if (!t) return
  const c = yield e(n),
    l = { limit: yield e(p) || 25 },
    y = m()
  if (c) {
    const e = yield s(y.getSearchMembers, r, c, l)
    return (yield i(I(e?.map((e) => e?.memberId))), void (yield w(e)))
  }
  const u = yield e(L),
    f = u ? yield e(k) : [],
    M = u || null
  ;((l[D] = M),
    yield b(
      [y.subscribeActiveMembers, r, l],
      function* (e) {
        const r = e.filter((e) => !O(e.capabilities) && !e.inactive),
          o = r.map((e) => e?.memberId) || [],
          t = [...f, ...o]
        ;(yield i(a(t)), yield w(r))
      },
      { onError: (e) => d("memberSubscribePeers", e) },
    ))
}
export function* memberListSaga({ roomId: e }) {
  try {
    ;(yield o([y, E], memberSubscribeModerators, { roomId: e }),
      yield o([y, u, f, E], memberSubscribePeers, { roomId: e }),
      yield t(q),
      yield A(
        g,
        ({ payload: e }) => e,
        function* ({ taskId: r }) {
          yield c([m().subscribeMember, e, r], (e) => i(h({ memberId: r, memberData: T(e) })), {
            onError: (e) => d("memberList: subscribeMember", e),
          })
        },
        (e) => d("memberListItem", e),
      ))
  } catch (e) {
    yield d("memberListSaga", e)
  } finally {
    yield i(E())
  }
}