import { createSlice as t, createSelector as e, createAction as o } from "@reduxjs/toolkit"
import { NETWORK_CONFIG as n } from "./network.constants"
import { calcNetworkStatus as s } from "./network.model"
export const NETWORK_STATE_KEY = "network"
export const NETWORK_INITIAL_STATE = {
config: n,
status: { host: "", port: -1, online: !1, degraded: !1, connections: 0, peers: [], loaded: !1 },
settings: {
default: { concurrency: 0, maxWindow: 0, randomPunchInterval: 0, connectionKeepAlive: 0 },
values: { concurrency: 0, maxWindow: 0, randomPunchInterval: 0, connectionKeepAlive: 0 },
isCustom: !1,
isLoaded: !1,
},
}
export const networkSlice = t({
name: "network",
initialState: NETWORK_INITIAL_STATE,
reducers: {
setNetworkData: (
t,
{
payload: {
host: e,
port: o,
online: n,
degraded: s,
connections: r,
peers: a = [],
loaded: i = !0,
},
},
) => {
;((t.status.host = e),
(t.status.port = o),
(t.status.online = n),
(t.status.degraded = s),
(t.status.connections = r),
(t.status.peers = a),
(t.status.loaded = i))
},
setNetworkSettingsDefault: (
t,
{ payload: { concurrency: e, maxWindow: o, randomPunchInterval: n, connectionKeepAlive: s } },
) => {
;((t.settings.default.concurrency = e),
(t.settings.default.maxWindow = o),
(t.settings.default.randomPunchInterval = n),
(t.settings.default.connectionKeepAlive = s))
},
setNetworkSettings: (
t,
{
payload: {
concurrency: e,
maxWindow: o,
randomPunchInterval: n,
connectionKeepAlive: s,
isLoaded: r = !0,
},
},
) => {
;((t.settings.values.concurrency = e),
(t.settings.values.maxWindow = o),
(t.settings.values.randomPunchInterval = n),
(t.settings.values.connectionKeepAlive = s),
(t.settings.isCustom = !1),
(t.settings.isLoaded = r))
},
setNetworkSettingsIsCustom: (t, { payload: e }) => {
t.settings.isCustom = e
},
resetNetworkSettings: (t) => {
;((t.settings.values.concurrency = t.settings.default.concurrency),
(t.settings.values.maxWindow = t.settings.default.maxWindow),
(t.settings.values.randomPunchInterval = t.settings.default.randomPunchInterval),
(t.settings.values.connectionKeepAlive = t.settings.default.connectionKeepAlive),
(t.settings.isCustom = !1))
},
},
})
export const getNetworkState = (t) => t.network
export const getNetworkConfig = (t) => getNetworkState(t).config
export const getNetworkStatusState = (t) => getNetworkState(t).status
export const getNetworkIp = (t) => getNetworkStatusState(t).host
export const getNetworkPort = (t) => getNetworkStatusState(t).port
export const getNetworkLoaded = (t) => getNetworkStatusState(t).loaded
export const getNetworkOnline = (t) => getNetworkStatusState(t).online
export const getNetworkDegraded = (t) => getNetworkStatusState(t).degraded
export const getNetworkPeerCount = (t) => getNetworkStatusState(t).connections
export const getNetworkPeers = (t) => getNetworkStatusState(t).peers
export const getNetworkSettings = (t) => getNetworkState(t).settings
export const getNetworkSettingsDefault = (t) => getNetworkSettings(t).default
export const getNetworkSettingsValues = (t) => getNetworkSettings(t).values
export const getNetworkSettingsLoading = (t) => !getNetworkSettings(t).isLoaded
export const getNetworkSettingsIsCustom = e(
getNetworkSettings,
(t) =>
t.isCustom ||
t.values.concurrency !== t.default.concurrency ||
t.values.maxWindow !== t.default.maxWindow ||
t.values.randomPunchInterval !== t.default.randomPunchInterval ||
t.values.connectionKeepAlive !== t.default.connectionKeepAlive,
)
export const getNetworkStatus = (t) => s(getNetworkStatusState(t))
export const {
setNetworkData: setNetworkData,
setNetworkSettings: setNetworkSettings,
setNetworkSettingsDefault: setNetworkSettingsDefault,
setNetworkSettingsIsCustom: setNetworkSettingsIsCustom,
resetNetworkSettings: resetNetworkSettings,
} = networkSlice.actions
export const getAppInitialState = networkSlice.getInitialState
export const appReducer = networkSlice.reducer
export const loadNetworkSettings = o("network/load-settings")
export const updateNetworkSettings = o("network/update-settings")