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 && } ); }