OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / member / member.reducer.js

195 lines · javascript ref:
import { createAction as e, createSelector as r } from "@reduxjs/toolkit"
import { getObjChange as o } from "../lib/object"
import { resetModuleStateCmd as m } from "../lib/rootAction"
import { getMyMemberId as t } from "../identity"
import {
  canIndex as b,
  canModerate as d,
  createByRoomIdInitialData as s,
  hasMemberCapabilityChanged as n,
  isMemberChanged as a,
} from "./member.model"
import { MEMBER_STATE_KEY as I } from "./member.constant"
import { MEMBER_REPORTED_STATE_KEY as c } from "./reported/members-reported.constant"
import {
  MEMBER_REPORTED_INITIAL_STATE as M,
  membersReportedReducer as i,
} from "./reported/members-reported.reducer"
export const addMemberUnknownSwarmId = e("member/addMemberUnknownSwarmId")
export const setMemberBySwarmId = e("member/setMemberBySwarmId")
export const setMemberProfile = e("member/setMemberProfile")
export const setMemberProfileNotFound = e("member/setMemberProfileNotFound")
export const setMemberProfileRemoved = e("member/setMemberProfileRemoved")
export const setMemberDisabledCapabilities = e("member/setMemberDisabledCapabilities")
export const setMemberMutedStatus = e("member/setMemberMutedStatus")
export const EMPTY_MEMBER_DATA = Object.freeze(s())
export const MEMBER_CONFIG = { MEMBER_SUBSCRIBE_TIMEOUT: 5e3 }
export const INITIAL_STATE = { byRoomId: {}, config: MEMBER_CONFIG, [c]: M }
export const memberReducer = (e = INITIAL_STATE, r) => {
  switch (r.type) {
    case addMemberUnknownSwarmId.type: {
      const {
        payload: { roomId: o, swarmId: m },
      } = r
      if (!o || !m) return e
      const t = e.byRoomId[o]
      if (t?.unknownSwarmIds.includes(m)) return e
      const b = t ? { ...t } : s()
      return (
        (b.unknownSwarmIds = [...b.unknownSwarmIds, m]),
        { ...e, byRoomId: { ...e.byRoomId, [o]: b } }
      )
    }
    case setMemberBySwarmId.type: {
      const {
        payload: { roomId: o, swarmId: m, member: t },
      } = r
      if (!o || !m || !t?.memberId) return e
      const b = e.byRoomId[o] || s()
      let d = t
      return (
        b.disabledCapabilities && (d = { ...t, capabilities: null }),
        {
          ...e,
          byRoomId: {
            ...e.byRoomId,
            [o]: {
              ...b,
              bySwarmId: { ...b.bySwarmId, [m]: d },
              byMemberId: { ...b.byMemberId, [d.memberId]: d },
              unknownSwarmIds: b.unknownSwarmIds.includes(m)
                ? b.unknownSwarmIds.filter((e) => e !== m)
                : b.unknownSwarmIds,
            },
          },
        }
      )
    }
    case setMemberProfile.type: {
      const {
        payload: { roomId: o, profile: m },
      } = r
      if (!m) return e
      const { memberId: t } = m,
        b = e.byRoomId[o]
      let d = b || s()
      ;(d.notFoundMemberIds.includes(t) &&
        (d = { ...d, notFoundMemberIds: d.notFoundMemberIds.filter((e) => e !== t) }),
        d.removedMemberIds.includes(t) &&
          (d = { ...d, removedMemberIds: d.removedMemberIds.filter((e) => e !== t) }))
      const n = d.byMemberId[t],
        I = { ...m, capabilities: d.disabledCapabilities ? null : m.capabilities }
      return (
        (n && !a(n, I)) || (d = { ...d, byMemberId: { ...d.byMemberId, [t]: I } }),
        b === d ? e : { ...e, byRoomId: { ...e.byRoomId, [o]: d } }
      )
    }
    case setMemberProfileNotFound.type: {
      const {
          payload: { roomId: o, memberId: m },
        } = r,
        t = e.byRoomId[o]
      let b = t || s()
      return (
        b.notFoundMemberIds.includes(m) ||
          (b = { ...b, notFoundMemberIds: [...EMPTY_MEMBER_DATA.notFoundMemberIds, m] }),
        t === b ? e : { ...e, byRoomId: { ...e.byRoomId, [o]: b } }
      )
    }
    case setMemberProfileRemoved.type: {
      const {
          payload: { roomId: o, memberId: m },
        } = r,
        t = e.byRoomId[o]
      return t.removedMemberIds.includes(m)
        ? e
        : {
            ...e,
            byRoomId: {
              ...e.byRoomId,
              [o]: { ...t, removedMemberIds: [...t.removedMemberIds, m] },
            },
          }
    }
    case setMemberDisabledCapabilities.type: {
      const {
          payload: { roomId: o },
        } = r,
        m = e.byRoomId[o] || s(),
        t = { ...m.byMemberId }
      return (
        Object.keys(t).forEach((e) => {
          t[e] = { ...t[e], capabilities: null }
        }),
        {
          ...e,
          byRoomId: { ...e.byRoomId, [o]: { ...m, disabledCapabilities: !0, byMemberId: t } },
        }
      )
    }
    case m.type:
      return INITIAL_STATE
    default: {
      const m = { [c]: i(e[c], r) }
      return o(e, m) ? { ...e, ...m } : e
    }
  }
}
export const getMembersState = (e) => e[I]
export const getMembersByRoomIdState = (e) => (r) =>
  getMembersState(r).byRoomId[e] || EMPTY_MEMBER_DATA
export const getMemberIdByRoomAndSwarmIds =
  ({ roomId: e, swarmId: r }) =>
  (o) =>
    getMembersByRoomIdState(e)(o).bySwarmId[r]?.memberId
export const getMemberById = (e) => (r) => getMembersByRoomIdState(e)(r).byMemberId
export const getMemberItemById = (e, r) => (o) => getMembersState(o).byRoomId[e]?.byMemberId[r]
export const makeGetMemberItemsByIds = (e, o) =>
  r(getMemberById(e), (e) =>
    o.reduce((r, o) => {
      const m = e[o]
      return (m && r.push(m), r)
    }, []),
  )
export const getMyMember = (e) => (r) => {
  const o = t(r)
  return getMembersState(r).byRoomId[e]?.byMemberId[o]
}
export const getMyMemberCapabilities = (e) => (r) => {
  const o = t(r)
  return getMembersState(r).byRoomId[e]?.byMemberId[o]?.capabilities || 0
}
export const getMembersUnknownSwarmIds = (e) => (r) => getMembersByRoomIdState(e)(r).unknownSwarmIds
export const getMemberNotFoundIds = (e) => (r) => getMembersByRoomIdState(e)(r).notFoundMemberIds
export const getRemovedMemberIds = (e) => (r) => getMembersByRoomIdState(e)(r).removedMemberIds
export const getIsMemberRemoved = (e, o) => r(getRemovedMemberIds(e), (e) => -1 !== e.indexOf(o))
export const getMemberConfig = (e) => getMembersState(e).config
export const getCanMyMemberManageRoles = (e) => (r) => {
  const o = getMyMemberCapabilities(e)(r)
  return o > 0 && (b(o) || d(o))
}
export const isAddMemberUnknownSwarmId =
  ({ roomId: e }) =>
  (r) =>
    addMemberUnknownSwarmId.match(r) && r?.payload?.roomId === e
export const isSetMembersBySwarmId =
  ({ roomId: e }) =>
  (r) =>
    setMemberBySwarmId.match(r) && r?.payload?.roomId === e
export const isMemberProfileChanged = (e) => !(!setMemberProfile.match(e) || !e.payload.prevProfile)
export const isSetMemberProfile = (e) => (r) =>
  setMemberProfile.match(r) && r.payload.profile.memberId === e
export const isMemberCapabilityChanged = (e) =>
  !(!setMemberProfile.match(e) || !n(e.payload.prevProfile, e.payload.profile))
export const memberRemoveCmd = e("member/remove-cmd")
export const memberRemoveSuccess = e("member/remove-success-cmd")
export const memberChangeRoleSubmit = e("member/change-role-submit")
export const memberMuteToggleCmd = e("member/mute-toggle-cmd")
export const memberMuteToggleSuccess = e("member/mute-toggle-success")
export const memberDeviceOwnerChangeEvt = e("member/device-owner-change-evt")
export const memberChangeOtherMemberRoleSuccess = e("member/change-other-member-role-success")
export const memberSubscribeToManagedMember = e("member/subscribe-to-managed-member")
export const memberCancelSubscribeToManagedMember = e("member/cancel-subscribe-to-managed-member")
export const myMemberMuted = e("member/myMemberMuted")
export const myMemberRemoved = e("member/myMemberRemoved")