production-taskbar-client / src / renderer / features / info / infoSlice.js
infoSlice.js
Raw
import { createSlice } from "@reduxjs/toolkit";

const getIpaddrs = () => {
  const ipaddrList = [];
  const interfaces = window.networkInterfaces();
  Object.entries(interfaces).forEach((obj) => {
    Object.values(obj[1]).forEach((i) => {
      if (i.family === "IPv4" && !i.internal) {
        ipaddrList.push({
          ip: i.address,
          mac: i.mac,
          name: obj[0],
          sortNbr: Number(i.address.split(".")[0]),
        });
      }
    });
  });
  ipaddrList.sort((i1, i2) => {
    if (i1.sortNbr < i2.sortNbr) return -1;
    if (i1.sortNbr > i2.sortNbr) return 1;
    return 0;
  });
  return ipaddrList;
};

export const infoSlice = createSlice({
  name: "info",
  initialState: {
    ipaddrs: getIpaddrs(),
    appVersion: undefined,
    selectedIpId: 0,
  },
  reducers: {
    updateIpaddrs: (state) => {
      state.ipaddrs = getIpaddrs();
      if (state.selectedIpId > state.ipaddrs.length - 1) state.selectedIpId = 0;
    },
    setNextIpId: (state) => {
      let next = state.selectedIpId + 1;
      if (next >= state.ipaddrs.length) next = 0;

      state.selectedIpId = next;
    },
    setAppVersion: (state, action) => {
      state.appVersion = action.payload;
    },
  },
});

export const { updateIpaddrs, setNextIpId, setAppVersion } = infoSlice.actions;

export default infoSlice.reducer;