import { createSlice as t, createAction as e } from "@reduxjs/toolkit"
import {
getCallIsOngoing as p,
getCallPeersCount as a,
getCallStatus as o,
isCallJoinedMode as s,
} from "../call/call.reducer"
import { EMPTY_ROOM_ID as i } from "../room/room.constant"
import { getRoomItemById as n } from "../room/room.selector"
import {
getPreferencesPrivateMode as r,
NOTIFICATIONS_ALERT_TYPES as l,
NOTIFICATIONS_TYPES as c,
} from "../preferences"
import { PLATFORM_UPDATE_STATUS as d } from "../platform/platform.constants"
import {
APP_STATE_KEY as u,
APP_STATUS as A,
APP_UPDATE_REASONS as S,
APP_DELAY_BEFORE_UPDATE as g,
} from "./app.constants"
export const APP_INITIAL_STATE = {
appStatus: A.LOADING,
appVersion: 0,
updateRequired: !1,
forceUpdateRequired: !1,
applicationKey: "",
linkData: "",
currentRoomId: i,
currentCallRoomId: i,
locale: "",
localeIsUpdating: !1,
notificationsType: c.ALL,
notificationsAlerts: Object.values(l),
updateReason: void 0,
updateCountdownEnd: void 0,
updateStatus: d.UPDATED,
systemUpdateRemaining: 0,
systemUpdating: !1,
lastToastNotificationSeen: 0,
isClearingOldFiles: !1,
}
export const appSlice = t({
name: u,
initialState: APP_INITIAL_STATE,
reducers: {
initApplication: (t, { payload: e }) => {
const { applicationKey: p, linkData: a, lastToastNotificationSeen: o } = e
;((t.applicationKey = p), (t.linkData = a), (t.lastToastNotificationSeen = o))
},
appRoomInvitationLinkServed: (t) => {
t.linkData = ""
},
setAppCurrentRoomId: (t, e) => {
t.currentRoomId = e.payload.roomId
},
setAppCurrentCallRoomId: (t, e) => {
t.currentCallRoomId = e.payload
},
initAppLocale: (t, e) => {
t.locale = e.payload
},
setAppLocale: (t, e) => {
;((t.locale = e.payload), (t.localeIsUpdating = !0))
},
setAppLocaleSuccess: (t) => {
t.localeIsUpdating = !1
},
setAppNotificationsType: (t, e) => {
t.notificationsType = e.payload
},
setAppNotificationsAlerts: (t, e) => {
t.notificationsAlerts = e.payload
},
toggleAppNotificationsAlert: (t, e) => {
const p = t.notificationsAlerts.includes(e.payload)
t.notificationsAlerts = p
? t.notificationsAlerts.filter((t) => t !== e.payload)
: (t.notificationsAlerts = [...t.notificationsAlerts, e.payload])
},
setAppInitialStatus: (t, { payload: { status: e, appVersion: p } }) => {
;((t.appStatus = e), (t.appVersion = p))
},
setAppStatus: (t, { payload: e }) => {
const { appStatus: p } = t
p !== e &&
p !== A.TEARDOWN &&
((t.appStatus = e),
e === A.IDENTITY_SETUP && ((t.currentRoomId = i), (t.currentCallRoomId = i)))
},
setUpdateRequired: (t, { payload: { timestamp: e, reason: p } }) => {
;((t.updateRequired = !0),
(t.updateReason = p || S.APP_UPGRADE),
(t.updateCountdownEnd = e + g))
},
setForceUpdateRequired: (t) => {
t.forceUpdateRequired = !0
},
setUpdateStatus: (t, { payload: e }) => {
t.updateStatus !== e && (t.updateStatus = e)
},
setSystemUpdate: (t, { payload: { remaining: e } }) => {
;((t.systemUpdateRemaining = e || 0), (t.systemUpdating = t.systemUpdateRemaining > 0))
},
setLastToastNotificationSeen: (t, { payload: e }) => {
t.lastToastNotificationSeen = e
},
setIsClearingOldFiles: (t, { payload: e }) => {
t.isClearingOldFiles = e
},
},
})
export const getAppState = (t) => t[u]
export const getApplicationKey = (t) => getAppState(t).applicationKey
export const getAppCurrentRoomId = (t) => getAppState(t).currentRoomId
export const getAppCurrentCallRoomId = (t) => getAppState(t).currentCallRoomId
export const hasAppCurrentRoomCallMatch = (t) => {
const { currentCallRoomId: e, currentRoomId: p } = getAppState(t)
return e === p
}
export const getAppLocale = (t) => getAppState(t).locale
export const getAppNotificationsAlerts = (t) => getAppState(t).notificationsAlerts
export const getAppLocaleIsUpdating = (t) => getAppState(t).localeIsUpdating
export const getAppStatus = (t) => getAppState(t).appStatus
export const getUpdateRequired = (t) => getAppState(t).updateRequired
export const getForceUpdateRequired = (t) => getAppState(t).forceUpdateRequired
export const getUpdateCountdownEnd = (t) => getAppState(t).updateCountdownEnd
export const getUpdateReason = (t) => getAppState(t).updateReason
export const getUpdateStatus = (t) => getAppState(t).updateStatus
export const getAppStatusLoading = (t) => getAppState(t).appStatus === A.LOADING
export const getAppStatusTeardown = (t) => getAppState(t).appStatus === A.TEARDOWN
export const getAppStatusCriticalError = (t) => getAppState(t).appStatus === A.CRITICAL_ERROR
export const getSystemUpdateRemaining = (t) => getAppState(t).systemUpdateRemaining
export const getIsSystemUpdating = (t) => getAppState(t).systemUpdating
export const getLastToastNotificationSeen = (t) => getAppState(t).lastToastNotificationSeen
export const isOngoingCallByRoomId = (t, e) => {
const { currentCallRoomId: o } = getAppState(t)
return a(t, e) > 0 || !(e !== o || !p(t)) || !!n(e)(t)?.activeCallId
}
export const getRoomBlurred = (t, e) =>
!!r(t) && (!e || !s(o(t)) || e !== getAppCurrentCallRoomId(t))
export const getIsSelfDestructing = (t) => getAppState(t).appStatus === A.DESTRUCTING
export const getIsClearingOldFiles = (t) => getAppState(t).isClearingOldFiles
export const {
setAppInitialStatus: setAppInitialStatus,
setAppStatus: setAppStatus,
setAppCurrentRoomId: setAppCurrentRoomId,
setAppCurrentCallRoomId: setAppCurrentCallRoomId,
initAppLocale: initAppLocale,
setAppLocale: setAppLocale,
setAppNotificationsType: setAppNotificationsType,
setAppNotificationsAlerts: setAppNotificationsAlerts,
toggleAppNotificationsAlert: toggleAppNotificationsAlert,
setAppLocaleSuccess: setAppLocaleSuccess,
initApplication: initApplication,
appRoomInvitationLinkServed: appRoomInvitationLinkServed,
setUpdateRequired: setUpdateRequired,
setForceUpdateRequired: setForceUpdateRequired,
setUpdateStatus: setUpdateStatus,
setSystemUpdate: setSystemUpdate,
setLastToastNotificationSeen: setLastToastNotificationSeen,
setIsClearingOldFiles: setIsClearingOldFiles,
} = appSlice.actions
export const appTeardownEvent = () => setAppStatus(A.TEARDOWN)
export const appIdentitySetupStart = e("app/identity-setup-start")
export const appIdentitySetupCancel = e("app/identity-setup-cancel")
export const runAppModeIdentitySetupCmd = e("app/mode-identity-setup")
export const runAppModeNormalCmd = e("app/mode-normal")
export const selfDestruct = e("app/self-destruct")
export const isSetAppStatusRunning = (t) =>
(setAppStatus.match(t) && t.payload === A.RUNNING) ||
(setAppInitialStatus.match(t) && t.payload.status === A.RUNNING)
export const getAppInitialState = appSlice.getInitialState
export const appReducer = appSlice.reducer