import { Accordion, AccordionDetails, AccordionSummary, Checkbox, Grid, IconButton, Typography, } from "@material-ui/core"; import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; import RefreshIcon from "@material-ui/icons/Refresh"; import { useCallback, useEffect, useState } from "react"; import DataTable from "react-data-table-component"; import { useParams } from "react-router-dom"; import API from "utils/API"; import { parseValue, replaceValue, setValue } from "utils/ChangeHelper"; import { formatDistance } from "date-fns"; import AddMember from "./components/AddMember"; import DeleteMember from "./components/DeleteMember"; import ManagedIP from "./components/ManagedIP"; import MemberName from "./components/MemberName"; import MemberSettings from "./components/MemberSettings"; import { useTranslation } from "react-i18next"; function NetworkMembers({ network }) { const { nwid } = useParams(); const [members, setMembers] = useState([]); const fetchData = useCallback(async () => { try { const members = await API.get("network/" + nwid + "/member"); setMembers(members.data); console.log("Members:", members.data); } catch (err) { console.error(err); } }, [nwid]); useEffect(() => { fetchData(); const timer = setInterval(() => fetchData(), 30000); return () => clearInterval(timer); }, [nwid, fetchData]); const sendReq = async (mid, data) => { const req = await API.post("/network/" + nwid + "/member/" + mid, data); console.log("Action:", req); }; const { t, i18n } = useTranslation(); const handleChange = (member, key1, key2 = null, mode = "text", id = null) => (event) => { const value = parseValue(event, mode, member, key1, key2, id); const updatedMember = replaceValue({ ...member }, key1, key2, value); const index = members.findIndex((item) => { return item["config"]["id"] === member["config"]["id"]; }); let mutableMembers = [...members]; mutableMembers[index] = updatedMember; setMembers(mutableMembers); const data = setValue({}, key1, key2, value); sendReq(member["config"]["id"], data); }; const columns = [ { id: "auth", name: t("authorized"), minWidth: "80px", cell: (row) => ( ), }, { id: "address", name: t("address"), minWidth: "150px", cell: (row) => ( {row.config.address} ), }, { id: "name", name: t("name") + "/" + t("description"), minWidth: "250px", cell: (row) => , }, { id: "ips", name: t("managedIPs"), minWidth: "220px", cell: (row) => , }, { id: "lastSeen", name: t("lastSeen"), minWidth: "100px", cell: (row) => row.online === 1 ? ( {"ONLINE"} ) : row.controllerId === row.config.address ? ( {"CONTROLLER"} ) : row.online === 0 ? ( {row.lastOnline !== 0 ? formatDistance(row.lastOnline, row.clock, { includeSeconds: false, addSuffix: true, }) : "OFFLINE"} ) : ( {"RELAYED"} ), }, { id: "physicalip", name: t("version") + " / " + t("physIp") + " / " + t("latency"), minWidth: "220px", cell: (row) => row.online === 1 ? (

{"v" + row.config.vMajor + "." + row.config.vMinor + "." + row.config.vRev}
{row.physicalAddress + "/" + row.physicalPort}
{"(" + row.latency + " ms)"}

) : ( "" ), }, { id: "delete", name: t("settings"), minWidth: "50px", right: true, cell: (row) => ( <> ), }, ]; return ( }> {t("member", { count: members.length })} {members.length ? ( ) : ( {t("noDevices")} {nwid}. )} ); } export default NetworkMembers;