import { resetModuleStateCmd as o } from "../lib/rootAction"
import { getObjChange as r } from "../lib/object"
import {
EMPTY_ROOM_ID as t,
ROOM_CLICKS_TO_UNLOCK_DEBUG as e,
RECENT_ROOM_UPDATE as s,
} from "./room.constant"
import {
ROOM_MAIN_STATE_KEY as m,
roomMainSlice as d,
ROOM_MAIN_INITIAL_STATE as i,
} from "./main/room-main.reducer"
import {
ROOM_JOINT_STATE_KEY as a,
roomJointSlice as l,
ROOM_JOINT_INITIAL_STATE as n,
} from "./joint/room-joint.reducer"
import { ROOM_FILTER as y, ROOM_LIST_STATE_KEY as I } from "./list/room-list.constant"
import {
ROOM_LIST_INITIAL_STATE as c,
roomListSlice as p,
searchAllRooms as u,
setRoomFilterMap as B,
setSearchRoomIds as f,
} from "./list/room-list.reducer"
import { ROOM_DM_INITIAL_STATE as R, roomDmSlice as g } from "./dm/room-dm.reducer"
import { ROOM_DM_STATE_KEY as h } from "./dm/room-dm.constant"
import {
setAllRooms as v,
setMainRoom as b,
setRoomMyCapabilities as A,
setRoomVersion as D,
setRoomInfo as T,
setNotifications as w,
setRoomStats as M,
unlockDebug as E,
setCreatedRoomMeta as C,
roomSetRepairingStatus as L,
roomSetMoveIndexerStatus as S,
updateRecentRooms as j,
addOrRemoveRecentRoom as k,
setRoomDiscoveryKey as x,
setRoomShowWarning as F,
setFavoriteRooms as O,
addOrRemoveFavoriteRoom as N,
} from "./room.action"
import { getRecentRoomItemChanged as _, isDmPeerHasLeft as K } from "./room.model"
import { arrayEqual as V, getChanged as W } from "../lib/array"
import { myMemberRemoved as q } from "../member"
import {
FORWARD_MESSAGE_INITIAL_STATE as z,
FORWARD_MESSAGE_STATE_KEY as G,
forwardMessageReducer as H,
} from "./forward-message"
import {
SHARE_MESSAGE_IN_MESSAGE_INITIAL_STATE as J,
SHARE_MESSAGE_IN_STATE_KEY as P,
shareMessageInReducer as Q,
} from "./share-message"
import { updateRoomFilterMap as U } from "./list/room-list.model"
const X = (o) =>
Object.values(o)
.sort((o, r) => r.timestamp - o.timestamp)
.map((o) => o.roomId),
Y = { isDebugging: !1, debugClicks: e, showWarning: !1 }
export const INITIAL_STATE = {
stats: {},
favoriteByRoomId: {},
roomById: {},
roomDiscoveryKeyById: {},
notificationsById: {},
[m]: i,
[a]: n,
[I]: c,
[h]: R,
[G]: z,
[P]: J,
}
export const roomCommonReducer = (r = INITIAL_STATE, m) => {
switch (m.type) {
case M.type: {
const { roomId: o, stats: t } = m.payload
return { ...r, stats: { ...t, roomId: o } }
}
case b.type: {
const { roomId: o } = m.payload
let { joint: e } = r
return (
o && (e = { ...e, pairing: { ...e.pairing, activeSeedId: t } }),
{ ...r, main: { ...i, roomId: o }, joint: e }
)
}
case f.type: {
const { payload: o } = m
return { ...r, list: { ...r.list, isSearching: !1, searchRoomIds: o } }
}
case v.type: {
const { total: o, rooms: t } = m.payload
let e = r
if (
((r.list.isLoading || r.list.total !== o) &&
(e = { ...r, list: { ...r.list, isLoading: !1, total: o } }),
0 === t.length && 0 === r.list.allRoomIds.length)
)
return e
const s = W(
r.list.allRoomIds,
t.map((o) => o.roomId),
),
d = t.reduce((o, r) => {
const { roomId: t } = r,
s = _(e.roomById[t], r)
if (s) {
const r = o || {}
return ((r[s.roomId] = { ...(e.roomById[t] || Y), ...s }), r)
}
return o
}, null)
return (
d && (e = { ...e, roomById: { ...r.roomById, ...d } }),
s && (e = { ...e, list: { ...e.list, allRoomIds: s } }),
e
)
}
case O.type: {
const o = {}
for (const { roomId: r } of m.payload.rooms) o[r] = !0
return { ...r, favoriteByRoomId: o, list: { ...r.list, isRoomFavoriteLoading: !1 } }
}
case N.type: {
const o = { ...r.favoriteByRoomId },
{ type: t, roomId: e } = m.payload
return (
t === s.ADDED ? (o[e] = !0) : t === s.REMOVED && delete o[e],
{ ...r, favoriteByRoomId: o, list: { ...r.list, isRoomFavoriteLoading: !1 } }
)
}
case k.type: {
const { type: o, roomId: t, timestamp: e } = m.payload
switch (o) {
case s.ADDED: {
if (r.roomById[t] && r.list.allRoomIds.includes(t)) return r
const o = { ...r.roomById, [t]: { ...Y, ...r.roomById[t], roomId: t, timestamp: e } },
s = X(o)
return { ...r, roomById: o, list: { ...r.list, allRoomIds: s } }
}
case s.REMOVED: {
if (!r.roomById[t]) return r
const o = { ...r.roomById }
return (
delete o[t],
{
...r,
roomById: o,
list: {
...r.list,
allRoomIds: r.list.allRoomIds.filter((o) => o !== t),
searchRoomIds: r.list.searchRoomIds.filter((o) => o !== t),
},
forwardMessage: {
...r.forwardMessage,
searchRoomIds: r.forwardMessage.searchRoomIds.filter((o) => o !== t),
},
}
)
}
default:
return r
}
}
case q.type: {
const { roomId: o } = m.payload
if (!r.roomById[o]) return r
const t = { ...r.roomById }
return (
delete t[o],
{
...r,
roomById: t,
list: {
...r.list,
allRoomIds: r.list.allRoomIds.filter((r) => r !== o),
searchRoomIds: r.list.searchRoomIds.filter((r) => r !== o),
},
forwardMessage: {
...r.forwardMessage,
searchRoomIds: r.forwardMessage.searchRoomIds.filter((r) => r !== o),
},
}
)
}
case j.type: {
const o = m.payload
if (!Array.isArray(o) || !o.length) return r
const t = {}
let e = !1
for (let s = 0; s < o.length; s += 1) {
const { roomId: m, timestamp: d } = o[s]
if (t[m]) continue
const i = r.roomById[m]
i && d && i.timestamp !== d && ((t[m] = { ...i, timestamp: d }), (e = !0))
}
if (!e) return r
let s = !1
if (1 === o.length) {
const { roomId: t, timestamp: e } = o[0]
e > r.roomById[t].timestamp && r.list.allRoomIds[0] === t && (s = !0)
}
const d = { ...r.roomById, ...t }
if (s) return { ...r, roomById: d }
const i = X(d)
return { ...r, roomById: d, list: { ...r.list, allRoomIds: i } }
}
case T.type: {
const o = m.payload,
t = { ...(r.roomById[o.roomId] || Y), ...o, isLoaded: !0 }
t.isReadOnly = t.isReadOnly || K(t)
let e = r.list
return (
t.discoveryId &&
!r.list.discoveryIds.includes(t.discoveryId) &&
(e = { ...r.list, discoveryIds: [...r.list.discoveryIds, t.discoveryId] }),
{ ...r, roomById: { ...r.roomById, [o.roomId]: t }, list: e }
)
}
case F.type: {
const { roomId: o, showWarning: t } = m.payload,
e = r.roomById[o]
return e ? { ...r, roomById: { ...r.roomById, [o]: { ...e, showWarning: t } } } : r
}
case A.type: {
const { roomId: o, myCapabilites: t } = m.payload
return { ...r, roomById: { ...r.roomById, [o]: { ...r.roomById[o], myCapabilites: t } } }
}
case D.type: {
const { roomId: o, ...t } = m.payload || {}
return o ? { ...r, roomById: { ...r.roomById, [o]: { ...r.roomById[o], ...t } } } : r
}
case w.type: {
const o = m.payload
return { ...r, notificationsById: { ...r.notificationsById, ...o } }
}
case E.type: {
const o = m.payload,
t = r.roomById[o]
if (!t || t.isDebugging || "number" != typeof t.debugClicks) return r
const s = t.debugClicks ?? e
return s > 1
? { ...r, roomById: { ...r.roomById, [o]: { ...t, debugClicks: s - 1 } } }
: { ...r, roomById: { ...r.roomById, [o]: { ...t, debugClicks: 0, isDebugging: !0 } } }
}
case C.type: {
const { roomId: o, title: t } = m.payload
return o && t ? { ...r, roomById: { ...r.roomById, [o]: { ...r.roomById[o], title: t } } } : r
}
case L.type: {
const { roomId: o, status: t } = m.payload
return { ...r, roomById: { ...r.roomById, [o]: { ...r.roomById[o], isRepairing: t } } }
}
case S.type: {
const { roomId: o, status: t } = m.payload
return { ...r, roomById: { ...r.roomById, [o]: { ...r.roomById[o], isMovingIndexer: t } } }
}
case o.type:
return INITIAL_STATE
case x.type: {
const { roomId: o, key: t } = m.payload
return { ...r, roomDiscoveryKeyById: { ...r.roomDiscoveryKeyById, [o]: t } }
}
case B.type: {
const { payload: o } = m,
t = U(r.list.roomFilterMap, o)
return { ...r, list: { ...r.list, roomFilterMap: t } }
}
default:
return r
}
}
const Z = new Set([j.type, k.type, v.type, O.type, N.type, u.type, f.type, B.type])
export const actualRoomIdsReducer = (o, r) => {
if (!Z.has(r.type)) return o
const {
list: { searchText: t, searchRoomIds: e, allRoomIds: s, roomFilterMap: m },
favoriteByRoomId: d,
} = o
let i = t ? e : s
return (
m[y.FAVORITES] && (i = i.filter((o) => d[o])),
V(o.list.actualRoomIds, i) ? o : { ...o, list: { ...o.list, actualRoomIds: i } }
)
}
export const roomReducer = (o = INITIAL_STATE, t) => {
const e = {
[m]: d.reducer(o[m], t),
[a]: l.reducer(o[a], t),
[I]: p.reducer(o[I], t),
[h]: g.reducer(o[h], t),
[G]: H(o[G], t),
[P]: Q(o[P], t),
}
let s = r(o, e) ? { ...o, ...e } : o
return ((s = roomCommonReducer(s, t)), (s = actualRoomIdsReducer(s, t)), s)
}