import useSWR from "swr"; import { useContext } from "react"; import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FiCpu, FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; import UsageBar from "../resources/usage-bar"; import Error from "../widget/error"; import SingleResource from "../widget/single_resource"; import WidgetIcon from "../widget/widget_icon"; import ResourceValue from "../widget/resource_value"; import ResourceLabel from "../widget/resource_label"; import Resources from "../widget/resources"; import WidgetLabel from "../widget/widget_label"; import { SettingsContext } from "utils/contexts/settings"; const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl"]; function convertToFahrenheit(t) { return t * 9/5 + 32 } export default function Widget({ options }) { const { t, i18n } = useTranslation(); const { settings } = useContext(SettingsContext); const { data, error } = useSWR( `/api/widgets/glances?${new URLSearchParams({ lang: i18n.language, ...options }).toString()}`, { refreshInterval: 1500, } ); if (error || data?.error) { return } if (!data) { return {t("glances.wait")} {t("glances.wait")} {options.cputemp && {t("glances.wait")} } {options.uptime && {t("glances.wait")} } {options.label && } ; } const unit = options.units === "imperial" ? "fahrenheit" : "celsius"; let mainTemp = 0; let maxTemp = 80; const cpuSensors = data.sensors?.filter(s => cpuSensorLabels.some(label => s.label.startsWith(label)) && s.type === "temperature_core"); if (options.cputemp && cpuSensors) { try { mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length; maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + s.warning, 0) / cpuSensors.length, maxTemp); if (unit === "fahrenheit") { mainTemp = convertToFahrenheit(mainTemp); maxTemp = convertToFahrenheit(maxTemp); } } catch (e) { // cpu sensor retrieval failed } } const tempPercent = Math.round((mainTemp / maxTemp) * 100); let disks = []; if (options.disk) { disks = Array.isArray(options.disk) ? options.disk.map((disk) => data.fs.find((d) => d.mnt_point === disk)).filter((d) => d) : [data.fs.find((d) => d.mnt_point === options.disk)].filter((d) => d); } return ( {t("common.number", { value: data.cpu.total, style: "unit", unit: "percent", maximumFractionDigits: 0, })} {t("glances.cpu")} {t("common.number", { value: data.load.min15, style: "unit", unit: "percent", maximumFractionDigits: 0, })} {t("glances.load")} {t("common.bytes", { value: data.mem.free, maximumFractionDigits: 1, binary: true, })} {t("glances.free")} {t("common.bytes", { value: data.mem.total, maximumFractionDigits: 1, binary: true, })} {t("glances.total")} {disks.map((disk) => ( {t("common.bytes", { value: disk.free })} {t("glances.free")} {t("common.bytes", { value: disk.size })} {t("glances.total")} ))} {options.cputemp && mainTemp > 0 && {t("common.number", { value: mainTemp, maximumFractionDigits: 1, style: "unit", unit })} {t("glances.temp")} {t("common.number", { value: maxTemp, maximumFractionDigits: 1, style: "unit", unit })} {t("glances.warn")} } {options.uptime && data.uptime && {data.uptime.replace(" days,", t("glances.days")).replace(/:\d\d:\d\d$/g, t("glances.hours"))} {t("glances.uptime")} } {options.label && } ); }