import { createSlice as o, createAction as e, createSelector as t } from "@reduxjs/toolkit"
import { EMPTY_ARRAY as n, isEmpty as i } from "../../lib/array"
import { mergeRoomInfoFiles as s, removeFileEntries as a } from "../../media/file"
import {
ROOM_STATE_KEY as m,
EMPTY_ROOM_ID as r,
ROOM_INFO_FILES_PER_ROW as I,
UNINDEXED_ROOM_MODERATE_COUNT as l,
UNINDEXED_ROOM_LOW_COUNT as R,
UNINDEXED_ROOM_TYPE as f,
} from "../room.constant"
import { setFirstTimeRoomModal as p, closeFirstTimeRoomModal as d } from "../room.action"
import {
ROOM_INFO_FILES_TAB as g,
ROOM_INFO_FILES_LOADING_STATUS as c,
ROOM_INFO_STATE_KEY_BY_TAB as T,
ROOM_INFO_MEDIA_TABS as u,
} from "./room-main.constant"
export const ROOM_MAIN_STATE_KEY = "main"
const F = {
filesCurrentTab: g.IMAGE,
[T[g.IMAGE]]: [],
[T[g.VIDEO]]: [],
[T[g.AUDIO]]: [],
[T[g.OTHER]]: [],
filesInViewRange: { top: 0, bottom: 0 },
loadingStatusByTab: {
[g.IMAGE]: c.INITIAL,
[g.VIDEO]: c.INITIAL,
[g.AUDIO]: c.INITIAL,
[g.OTHER]: c.INITIAL,
},
lteByTab: { [g.IMAGE]: -1, [g.VIDEO]: -1, [g.AUDIO]: -1, [g.OTHER]: -1 },
}
export const ROOM_MAIN_INITIAL_STATE = {
roomId: r,
tipSize: 0,
isEditingTitle: !1,
isNotSupported: !1,
roomInfo: F,
firstTimeRoomModal: { roomId: "", isOpen: !1 },
}
export const roomMainSlice = o({
name: "main",
initialState: ROOM_MAIN_INITIAL_STATE,
reducers: {
setMainRoomTipSize: (o, e) => {
const t = e.payload
o.tipSize = t
},
setRoomNotSupported: (o) => {
o.isNotSupported = !0
},
setRoomIsEditingTitle: (o, e) => {
o.isEditingTitle = e.payload
},
setRoomInfoFilesLoadingStatus: (o, { payload: e }) => {
o.roomInfo.loadingStatusByTab[e.tab] = e.status
},
setRoomInfoFilesLteByTab: (o, { payload: e }) => {
o.roomInfo.lteByTab[e.tab] = e.lte
},
setRoomInfoFiles: (o, e) => {
const { tab: t, files: n, nextLoadingStatus: i, nextLte: a } = e.payload
a && (o.roomInfo.lteByTab[t] = a)
const m = o.roomInfo[T[t]]
;((o.roomInfo.loadingStatusByTab[t] = i), (o.roomInfo[T[t]] = s(m, n)))
},
setRoomInfoFilesInViewRange: (o, e) => {
const { top: t, bottom: n } = e.payload
;((o.roomInfo.filesInViewRange.top = t), (o.roomInfo.filesInViewRange.bottom = n))
},
setRoomInfoFilesTab: (o, e) => {
o.roomInfo.filesCurrentTab = e.payload
},
resetRoomInfoFiles: (o, { payload: e }) => {
const { tab: t } = e || {}
o.roomInfo = { ...F, filesCurrentTab: t || F.filesCurrentTab }
},
},
extraReducers: (o) => {
o.addCase(a, (o, { payload: { fileIds: e } }) => {
const t = T[o.roomInfo.filesCurrentTab]
e.forEach((e) => {
o.roomInfo[t] = o.roomInfo[t].filter((o) => o.id !== e)
})
})
.addCase(p, (o, { payload: { roomId: e, isOpen: t } }) => {
o.firstTimeRoomModal = { roomId: e, isOpen: t }
})
.addCase(d, (o) => {
o.firstTimeRoomModal = { roomId: "", isOpen: !1 }
})
},
})
export const getRoomMainState = (o) => o[m].main
export const getRoomMainId = (o) => getRoomMainState(o).roomId
export const getRoomNotSupported = (o) => getRoomMainState(o).isNotSupported
export const getRoomTipSize = (o) => getRoomMainState(o).tipSize || 0
export const getRoomIndexingStatus = (o) => {
const { tipSize: e } = getRoomMainState(o)
return e > R ? f.LOW : e > l ? f.MODERATE : f.NORMAL
}
export const getRoomIsEditingTitle = (o) => getRoomMainState(o).isEditingTitle
export const getRoomInfoState = (o) => getRoomMainState(o).roomInfo
export const getFirstTimeRoomModal = (o) => getRoomMainState(o).firstTimeRoomModal
export const getRoomInfoFilesTab = (o) => getRoomInfoState(o).filesCurrentTab
export const getRoomInfoFilesImage = (o) => getRoomInfoState(o).filesImage
export const getRoomInfoFilesVideo = (o) => getRoomInfoState(o).filesVideo
export const getRoomInfoFilesAudio = (o) => getRoomInfoState(o).filesAudio
export const getRoomInfoFilesOther = (o) => getRoomInfoState(o).filesOther
export const getRoomInfoFilesLoadingStatusByTab = (o) => (e) =>
getRoomInfoState(e).loadingStatusByTab[o]
export const getRoomInfoFilesLteByTab = (o) => (e) => getRoomInfoState(e).lteByTab[o]
export const getRoomInfoFiles = t(
getRoomInfoFilesTab,
getRoomInfoFilesImage,
getRoomInfoFilesVideo,
getRoomInfoFilesAudio,
getRoomInfoFilesOther,
(o, e, t, i, s) => {
switch (o) {
case g.IMAGE:
return e
case g.VIDEO:
return t
case g.AUDIO:
return i
case g.OTHER:
return s
default:
return n
}
},
)
export const getRoomInfoFileIds = t(
getRoomInfoFilesTab,
getRoomInfoFilesImage,
getRoomInfoFilesVideo,
getRoomInfoFilesAudio,
getRoomInfoFilesOther,
(o, e, t, s, a) => {
let m
switch (o) {
case g.IMAGE:
m = e
break
case g.VIDEO:
m = t
break
case g.AUDIO:
m = s
break
case g.OTHER:
m = a
break
default:
m = []
}
return i(m) ? n : m.map((o) => o.id)
},
)
export const getRoomInfoFilesInViewRange = (o) => getRoomInfoState(o).filesInViewRange
export const getRoomInfoFilesInView = t(
getRoomInfoFilesTab,
getRoomInfoFilesInViewRange,
getRoomInfoFiles,
(o, e, t) => {
const { top: n, bottom: i } = e
if (!n && !i) return []
const s = o === g.IMAGE || o === g.VIDEO ? I.MEDIA : 1
return t.slice(n, i + s)
},
)
export const getIsRoomInfoMediaTab = t(getRoomInfoFilesTab, (o) => u.includes(o))
export const makeGetRoomInfoFileById = (o) => t(getRoomInfoFiles, (e) => e.find((e) => e.id === o))
export const {
setMainRoomTipSize: setMainRoomTipSize,
setRoomIsEditingTitle: setRoomIsEditingTitle,
setRoomInfoFilesTab: setRoomInfoFilesTab,
setRoomInfoFiles: setRoomInfoFiles,
resetRoomInfoFiles: resetRoomInfoFiles,
setRoomInfoFilesInViewRange: setRoomInfoFilesInViewRange,
setRoomNotSupported: setRoomNotSupported,
setRoomInfoFilesLoadingStatus: setRoomInfoFilesLoadingStatus,
setRoomInfoFilesLteByTab: setRoomInfoFilesLteByTab,
} = roomMainSlice.actions
export const updateRoomAvatar = e("room/update-room-avatar")
export const removeRoomAvatar = e("room/remove-room-avatar")
export const loadMoreFiles = e("room/load-more-files")
export const updateRoomDescription = e("room/update-room-description")
export const updateRoomTitle = e("room/update-room-title")
export const updateRoomCanCall = e("room/update-room-canCall")
export const updateRoomSetting = e("room/update-room-setting")
export const deleteRoomFile = e("room/deleteRoomFile")