import { createSlice as r, createAction as e, createSelector as o } from "@reduxjs/toolkit"
import { userErrorNotification as t } from "../notification/notification.reducer"
import { ERROR_TYPES as s, ERROR_STATE_KEY as a, ERROR_FILTER as l } from "./error.constants"
import { setLogEntry as i } from "./error.model"
export const ERROR_FILTER_INITIAL_STATE = { key: l.EMPTY, value: "" }
const n = { errors: [], filter: ERROR_FILTER_INITIAL_STATE }
export const errorSlice = r({
name: a,
initialState: n,
reducers: {
setInfo: (r, { payload: e }) => {
i(r, e, s.INFO)
},
setWarning: (r, { payload: e }) => {
i(r, e, s.WARNING)
},
setError: (r, { payload: e }) => {
i(r, e, s.ERROR)
},
clearErrors: () => n,
resetErrorFilter: (r) => {
r.filter = ERROR_FILTER_INITIAL_STATE
},
setErrorFilter: (r, { payload: e }) => {
r.filter = { key: e.key, value: e.value }
},
},
})
export const getErrorState = (r) => r[a]
export const getLastError = (r) => getErrorState(r).errors[0] || null
export const getErrors = o(
[(r) => getErrorState(r).errors, (r) => getErrorState(r).filter],
(r, e) => (e.key && e.value ? r.filter((r) => r[e.key] === e.value) : r),
)
export const getErrorFilter = (r) => getErrorState(r).filter
export const getLastErrorByRoomId = (r) => (e) =>
getErrorState(e).errors.find((e) => e.roomId === r) || null
export const {
setInfo: setInfo,
setWarning: setWarning,
setError: setError,
clearErrors: clearErrors,
setErrorFilter: setErrorFilter,
resetErrorFilter: resetErrorFilter,
} = errorSlice.actions
export const logInfo = e("error/log-info")
export const logError = e("error/log-error", (r, e) => ({
payload: {
errorCode: r.code,
message: r.message,
stack: r.stack,
notifyAll: e?.notifyAll,
roomId: e?.roomId,
},
}))
export const logWarning = e("error/log-warning", (r, e) => ({
payload: {
errorCode: r.code,
message: r.message,
stack: r.stack,
notifyAll: e?.notifyAll,
roomId: e?.roomId,
},
}))
export const taskError = (r, e) => {
const { message: o, stack: t, code: s } = e || {}
return logError({
message: o ? `Failed to execute "${r}" task: ${o}` : `Failed to execute "${r}"`,
stack: t,
code: s,
})
}
export const taskErrorNotification = (r, e, o) =>
t({ title: `Failed to execute "${r}" task`, message: e, stack: o })
export const getErrorInitialState = errorSlice.getInitialState
export const errorReducer = errorSlice.reducer