OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-store / store / room / main / room-main.reducer.js

196 lines · javascript ref:
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")