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 classNames from "classnames"; import Error from "../widget/error"; import Resource from "../widget/resource"; 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 ( {options.cpu !== false && } {options.mem !== false && } {options.cputemp && } {options.disk && !Array.isArray(options.disk) && ( )} {options.disk && Array.isArray(options.disk) && options.disk.map((disk) => ( ))} {options.uptime && } {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 ? s.warning : 0), 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); } const addedClasses = classNames("information-widget-glances", { expanded: options.expanded }); return ( {options.cpu !== false && ( )} {options.mem !== false && ( )} {disks.map((disk) => ( ))} {options.cputemp && mainTemp > 0 && ( )} {options.uptime && data.uptime && ( )} {options.label && } ); }