import { createAction as e, createSlice as t, createSelector as s } from "@reduxjs/toolkit"
import { getMyMember as r } from "../member/member.reducer"
export const MEMBER_LIST_STATE_KEY = "member-list"
const i = {
admins: [],
moderators: [],
peers: [],
lastPeer: null,
searchPeers: [],
memberById: {},
isAdminsModeratorsLoading: !1,
subscribeToPeers: !1,
subscribeToAdminsAndModerators: !1,
isLoading: !0,
isError: !1,
isSearching: !1,
searchText: "",
peersLimit: null,
inView: { top: 0, bottom: 0 },
isFetching: !1,
}
export const memberListSlice = t({
name: "member-list",
initialState: i,
reducers: {
setAdmins: (e, { payload: t }) => {
;((e.admins = t), (e.isAdminsModeratorsLoading = !1), e.isSearching && (e.isSearching = !1))
},
setModerators: (e, { payload: t }) => {
;((e.moderators = t),
(e.isAdminsModeratorsLoading = !1),
e.isSearching && (e.isSearching = !1))
},
setAdminsModeratorsIsLoading: (e, { payload: t }) => {
e.isAdminsModeratorsLoading = t
},
setPeers: (e, { payload: t }) => {
;((e.peers = t), (e.isLoading = !1), e.isSearching && (e.isSearching = !1))
},
searchMembers: (e, { payload: t }) => {
;("" === t && (e.searchPeers = []), (e.searchText = t), (e.isSearching = !!t))
},
setSearchPeers: (e, { payload: t }) => {
;(Array.isArray(t) ? (e.searchPeers = t) : (e.searchPeers = []), (e.isSearching = !1))
},
initializeMemberListSubscriptionCmd: (e, { payload: t }) => {
const {
limit: s,
subscribeToAdminsAndModerators: r = !0,
subscribeToPeers: o = !0,
searchText: m,
} = t
return {
...i,
peersLimit: s,
subscribeToPeers: o,
subscribeToAdminsAndModerators: r,
searchText: m,
isLoading: !m,
}
},
setItemsInView: (e, { payload: t }) => {
const { top: s, bottom: r } = t
;((e.inView.top = s), (e.inView.bottom = r))
},
setMemberById: (e, { payload: t }) => {
const { memberId: s = null, memberData: r, data: i } = t
s
? (e.memberById[s] = { ...e.memberById[s], ...r })
: (e.memberById = { ...e.memberById, ...i })
},
resetMemberList: () => ({ ...i }),
onScrollEnd: (e) => {
const { peers: t } = e,
[s] = t.slice(-1)
e.lastPeer = s
},
},
})
export const getMemberListState = (e) => e["member-list"]
export const getMemberListSearch = (e) => getMemberListState(e).searchText
export const getMemberListAdmins = (e) => getMemberListState(e).admins
export const getMemberListModerators = (e) => getMemberListState(e).moderators
export const getMemberListPeers = (e) => getMemberListState(e).peers
export const getMemberListLastPeer = (e) => getMemberListState(e).lastPeer
export const getMembersListSearchPeers = (e) => getMemberListState(e).searchPeers
export const getIsPeerListLoading = (e) => getMemberListState(e).isLoading
export const getIsMemberListSearching = (e) => getMemberListState(e).isSearching
export const getIsModeratorsAndAdminsListLoading = (e) =>
getMemberListState(e).isAdminsModeratorsLoading
export const getMemberListIsFetching = (e) => getMemberListState(e).isFetching
export const getMemberListIsError = (e) => getMemberListState(e).isError
export const getMemberById = (e) => getMemberListState(e).memberById
export const getMemberItemById = (e) => (t) => getMemberById(t)[e]
export const makeGetIsMeLastAdmin = ({ roomId: e, memberId: t }) =>
s([r(e), getMemberListAdmins], (e, s) => 1 === s.length && s[0] === t && e?.memberId === t)
export const getMemberListAdminsAndModerators = s(
[getMemberListAdmins, getMemberListModerators],
(e, t) => [...e, ...t],
)
export const getMemberListData = s(
[
getMemberListAdmins,
getMemberListModerators,
getMemberListPeers,
getMemberListSearch,
getMembersListSearchPeers,
],
(e, t, s, r, i) => {
if (r) return i
const o = [...e, ...t],
m = s.filter((e) => !o.includes(e))
return o.concat(m)
},
)
export const getMembersData = ({ length: e, compact: t }) =>
s([getMemberListData], (s) => (t ? s.slice(0, e) : s))
export const getMemberListPeersLimit = (e) => getMemberListState(e).peersLimit
export const getMemberListSubscribeToMemberTypes = s([getMemberListState], (e) => ({
subscribeToPeers: e.subscribeToPeers,
subscribeToAdminsAndModerators: e.subscribeToAdminsAndModerators,
}))
export const getMemberListIsLoading = s(
[getMemberListSubscribeToMemberTypes, getIsPeerListLoading, getIsModeratorsAndAdminsListLoading],
({ subscribeToPeers: e, subscribeToAdminsAndModerators: t }, s, r) =>
t && e ? r || s : t ? r : !!e && s,
)
export const {
setAdmins: setAdmins,
setModerators: setModerators,
setAdminsModeratorsIsLoading: setAdminsModeratorsIsLoading,
setPeers: setPeers,
searchMembers: searchMembers,
resetMemberList: resetMemberList,
setSearchPeers: setSearchPeers,
setItemsInView: setItemsInView,
setMemberById: setMemberById,
initializeMemberListSubscriptionCmd: initializeMemberListSubscriptionCmd,
} = memberListSlice.actions
export const memberListInViewIdsChangeEvt = e("member-list/in-view-ids-change-evt")
export const onScrollEnd = e("member-list/onScrollEnd")