import { createSlice as e, createAction as t, createSelector as s } from "@reduxjs/toolkit"
import { ROOM_STATE_KEY as r } from "../room.constant"
import {
ROOM_DM_STATE_KEY as o,
ROOM_DM_EMPTY_ID as n,
ROOM_DM_REPLY as m,
} from "./room-dm.constant"
export const ROOM_DM_INITIAL_STATE = {
requestByStatus: {},
received: { requests: [], byRequestId: {}, bySenderId: {}, activeRequestId: n },
contact: { byMemberId: {}, byRoomId: {} },
reply: { sending: !1, success: !1, errorMsg: "", type: null },
request: { sending: !1, success: !1, errorMsg: "" },
pairing: { bySeedId: {}, byRequestId: {} },
}
export const roomDmSlice = e({
name: o,
initialState: ROOM_DM_INITIAL_STATE,
reducers: {
setDmContact: (e, { payload: t }) => {
;((e.contact.byMemberId[t.memberId] = { ...e.contact.byMemberId[t.memberId], ...t }),
(e.contact.byRoomId[t.roomId] = t.memberId))
},
setDmRequests: (e, { payload: { requests: t, status: s } }) => {
e.requestByStatus[s] = t
const r = Object.values(e.requestByStatus).flat()
;((e.received.requests = r), (e.received.byRequestId = {}), (e.received.bySenderId = {}))
for (const t of r)
((e.received.byRequestId[t.id] = t), (e.received.bySenderId[t.senderId] = t.id))
},
setDmActiveId: (e, { payload: t }) => {
e.received.activeRequestId = t || n
},
setDmRequestSuccess: (e) => {
;((e.request.sending = !1), (e.request.success = !0))
},
setDmRequestError: (e, { payload: t }) => {
;((e.request.errorMsg = t), (e.request.sending = !1))
},
setDmRequestSending: (e) => {
;((e.request.errorMsg = ""), (e.request.sending = !0))
},
setDmReplySuccess: (e, { payload: t }) => {
;((e.reply.sending = !1), (e.reply.success = !0))
},
setDmReplyError: (e, { payload: t }) => {
;((e.reply.errorMsg = t), (e.reply.sending = !1))
},
setDmReplySending: (e, { payload: t }) => {
;((e.reply.errorMsg = ""), (e.reply.sending = !0), (e.reply.type = t || null))
},
resetAfterReply: (e) => {
;((e.reply = ROOM_DM_INITIAL_STATE.reply),
(e.received.activeRequestId = ROOM_DM_INITIAL_STATE.received.activeRequestId))
},
resetDmContact: (e, { payload: { memberId: t, roomId: s } }) => {
;(delete e.contact.byMemberId[t], delete e.contact.byRoomId[s])
},
},
})
export const getDmState = (e) => e[r][o]
export const getDmAllRequests = (e) => getDmState(e).received.requests
export const getDmRequestsById = (e) => getDmState(e).received.byRequestId
export const getDmRequestsBySenders = (e) => getDmState(e).received.bySenderId
export const getDmPairingBySeeds = (e) => getDmState(e).pairing.bySeedId
export const getDmPairingByRequests = (e) => getDmState(e).pairing.byRequestId
export const getDmContactByMembers = (e) => getDmState(e).contact.byMemberId
export const getDmMemberByRooms = (e) => getDmState(e).contact.byRoomId
export const getDmActiveId = (e) => getDmState(e).received.activeRequestId
export const getDmRequestSending = (e) => getDmState(e).request.sending
export const getDmRequestSuccess = (e) => getDmState(e).request.success
export const getDmRequestErrorMsg = (e) => getDmState(e).request.errorMsg
export const getDmReplySending = (e) => getDmState(e).reply.sending
export const getDmReplySuccess = (e) => getDmState(e).reply.success
export const getDmReplyErrorMsg = (e) => getDmState(e).reply.errorMsg
export const getDmReplyType = (e) => getDmState(e).reply.type
export const getDmReplySendingType = s([getDmState], (e) => {
const { reply: t } = e
return {
acceptInProgress: t.sending && t.type === m.ACCEPT,
rejectInProgress: t.sending && t.type === m.REJECT,
}
})
export const getDmRequestById = (e) => (t) => getDmRequestsById(t)[e]
export const getDmRequestBySenderId = (e) => (t) => {
const s = getDmRequestsBySenders(t)[e]
return getDmRequestsById(t)[s]
}
export const getDmRequestByPairingId = (e) => (t) => {
const s = getDmPairingBySeeds(t)[e]
return s?.requestId ? getDmRequestsById(t)[s.requestId] : null
}
export const getDmRequests = s([getDmAllRequests], (e) => e.filter((e) => e.status.isPending))
export const getUnseenDmRequestCount = s([getDmRequests], (e) =>
Array.isArray(e) ? e.filter((e) => !e.status.isSeen).length : 0,
)
export const getDmActiveRequest = (e) => {
const t = getDmActiveId(e)
return getDmRequestById(t)(e)
}
export const getDmContactInfo = (e) => (t) => getDmContactByMembers(t)[e]
export const getDmMemberByRoomId = (e) => (t) => getDmMemberByRooms(t)[e]
export const {
setDmRequests: setDmRequests,
setDmContact: setDmContact,
resetDmContact: resetDmContact,
setDmActiveId: setDmActiveId,
setDmRequestSending: setDmRequestSending,
setDmRequestSuccess: setDmRequestSuccess,
setDmRequestError: setDmRequestError,
setDmReplySending: setDmReplySending,
setDmReplySuccess: setDmReplySuccess,
setDmReplyError: setDmReplyError,
resetAfterReply: resetAfterReply,
} = roomDmSlice.actions
export const dmReducer = roomDmSlice.reducer
export const dmRequestSubmit = t("dm/request-submit")
export const dmReplySubmit = t("dm/reply-submit", (e, t) => ({
payload: { replyType: e, requestId: t },
}))
export const fetchDmContactInfoCmd = t("dm/fetch-contact-info-cmd")