OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / chat / list-view / list-view-data.saga.js

118 lines · javascript ref:
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),
  )
}