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")