import { Fragment, useEffect, useState } from 'react' import { Progress } from '@janhq/uikit' import { useAtom, useAtomValue } from 'jotai' import { MonitorIcon, XIcon, ChevronDown, ChevronUp } from 'lucide-react' import { twMerge } from 'tailwind-merge' import { useClickOutside } from '@/hooks/useClickOutside' import useGetSystemResources from '@/hooks/useGetSystemResources' import { toGibibytes } from '@/utils/converter' import TableActiveModel from './TableActiveModel' import { cpuUsageAtom, gpusAtom, ramUtilitizedAtom, systemMonitorCollapseAtom, totalRamAtom, usedRamAtom, } from '@/helpers/atoms/SystemBar.atom' const SystemMonitor = () => { const totalRam = useAtomValue(totalRamAtom) const usedRam = useAtomValue(usedRamAtom) const cpuUsage = useAtomValue(cpuUsageAtom) const gpus = useAtomValue(gpusAtom) const [showFullScreen, setShowFullScreen] = useState(false) const ramUtilitized = useAtomValue(ramUtilitizedAtom) const [systemMonitorCollapse, setSystemMonitorCollapse] = useAtom( systemMonitorCollapseAtom ) const [control, setControl] = useState(null) const [elementExpand, setElementExpand] = useState( null ) const { watch, stopWatching } = useGetSystemResources() useClickOutside( () => { setSystemMonitorCollapse(false) setShowFullScreen(false) }, null, [control, elementExpand] ) useEffect(() => { // Watch for resource update watch() return () => { stopWatching() } // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const calculateUtilization = () => { let sum = 0 const util = gpus.map((x) => { return Number(x['utilization']) }) util.forEach((num) => { sum += num }) return sum } return (
{ setSystemMonitorCollapse(!systemMonitorCollapse) setShowFullScreen(false) }} > System Monitor
{systemMonitorCollapse && (
Running Models
{showFullScreen ? ( setShowFullScreen(!showFullScreen)} /> ) : ( setShowFullScreen(!showFullScreen)} /> )} { setSystemMonitorCollapse(false) setShowFullScreen(false) }} />
CPU
{cpuUsage}%
Memory
{toGibibytes(usedRam)} of {toGibibytes(totalRam)} used
{ramUtilitized}%
{gpus.length > 0 && (
GPU
{calculateUtilization()}%
{gpus.map((gpu, index) => (
{gpu.name}
{gpu.utilization}%
{gpu.vram} MB VRAM
))}
)}
)}
) } export default SystemMonitor