mirror of
				https://github.com/owncast/owncast.git
				synced 2025-10-31 18:18:06 +08:00 
			
		
		
		
	 1cf923a5af
			
		
	
	1cf923a5af
	
	
	
		
			
			* Initial plan * Add localization support to NameChangeModal component Co-authored-by: gabek <414923+gabek@users.noreply.github.com> * Add NameChangeModal translations to English language file Co-authored-by: gabek <414923+gabek@users.noreply.github.com> * fix(i18n): fix localization keys * chore(test): add i18n test * chore(i18n): update translation script * chore(i18n): reorgnize translation keys and update components * chore: fix linting warnings * chore(i18n): update all the language files * feat(i18n): add last live ago i18n key --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: gabek <414923+gabek@users.noreply.github.com> Co-authored-by: Gabe Kangas <gabek@real-ity.com>
		
			
				
	
	
		
			150 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Row, Col, Typography, Alert, Spin } from 'antd';
 | |
| import React, { ReactElement, useEffect, useState } from 'react';
 | |
| import dynamic from 'next/dynamic';
 | |
| import { useTranslation } from 'next-export-i18n';
 | |
| import { fetchData, FETCH_INTERVAL, HARDWARE_STATS } from '../../utils/apis';
 | |
| import { Chart } from '../../components/admin/Chart';
 | |
| import { StatisticItem } from '../../components/admin/StatisticItem';
 | |
| import { Localization } from '../../types/localization';
 | |
| 
 | |
| import { AdminLayout } from '../../components/layouts/AdminLayout';
 | |
| 
 | |
| // Lazy loaded components
 | |
| 
 | |
| const BulbOutlined = dynamic(() => import('@ant-design/icons/BulbOutlined'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| const LaptopOutlined = dynamic(() => import('@ant-design/icons/LaptopOutlined'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| const SaveOutlined = dynamic(() => import('@ant-design/icons/SaveOutlined'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| export default function HardwareInfo() {
 | |
|   const { t } = useTranslation();
 | |
|   const [hardwareStatus, setHardwareStatus] = useState({
 | |
|     cpu: [], // Array<TimedValue>(),
 | |
|     memory: [], // Array<TimedValue>(),
 | |
|     disk: [], // Array<TimedValue>(),
 | |
|     message: '',
 | |
|   });
 | |
| 
 | |
|   const getHardwareStatus = async () => {
 | |
|     try {
 | |
|       const result = await fetchData(HARDWARE_STATS);
 | |
|       setHardwareStatus({ ...result });
 | |
|     } catch (error) {
 | |
|       setHardwareStatus({ ...hardwareStatus, message: error.message });
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   useEffect(() => {
 | |
|     let getStatusIntervalId = null;
 | |
| 
 | |
|     getHardwareStatus();
 | |
|     getStatusIntervalId = setInterval(getHardwareStatus, FETCH_INTERVAL); // runs every 1 min.
 | |
| 
 | |
|     // returned function will be called on component unmount
 | |
|     return () => {
 | |
|       clearInterval(getStatusIntervalId);
 | |
|     };
 | |
|   }, []);
 | |
| 
 | |
|   if (!hardwareStatus.cpu) {
 | |
|     return (
 | |
|       <div>
 | |
|         <Typography.Title>{t(Localization.Admin.HardwareInfo.title)}</Typography.Title>
 | |
| 
 | |
|         <Alert
 | |
|           style={{ marginTop: '10px' }}
 | |
|           banner
 | |
|           message={t(Localization.Admin.HardwareInfo.pleaseWait)}
 | |
|           description={t(Localization.Admin.HardwareInfo.noDetails)}
 | |
|           type="info"
 | |
|         />
 | |
|         <Spin spinning style={{ width: '100%', margin: '10px' }} />
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   const currentCPUUsage = hardwareStatus.cpu[hardwareStatus.cpu.length - 1]?.value;
 | |
|   const currentRamUsage = hardwareStatus.memory[hardwareStatus.memory.length - 1]?.value;
 | |
|   const currentDiskUsage = hardwareStatus.disk[hardwareStatus.disk.length - 1]?.value;
 | |
| 
 | |
|   const series = [
 | |
|     {
 | |
|       name: t(Localization.Admin.HardwareInfo.cpu),
 | |
|       color: '#B63FFF',
 | |
|       data: hardwareStatus.cpu,
 | |
|       pointStyle: 'rect',
 | |
|     },
 | |
|     {
 | |
|       name: t(Localization.Admin.HardwareInfo.memory),
 | |
|       color: '#2087E2',
 | |
|       data: hardwareStatus.memory,
 | |
|       pointStyle: 'circle',
 | |
|     },
 | |
|     {
 | |
|       name: t(Localization.Admin.HardwareInfo.disk),
 | |
|       color: '#FF7700',
 | |
|       data: hardwareStatus.disk,
 | |
|       pointStyle: 'rectRounded',
 | |
|     },
 | |
|   ];
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       <Typography.Title>{t(Localization.Admin.HardwareInfo.title)}</Typography.Title>
 | |
|       <br />
 | |
|       <div>
 | |
|         <Row gutter={[16, 16]} justify="space-around">
 | |
|           <Col>
 | |
|             <StatisticItem
 | |
|               title={series[0].name}
 | |
|               value={Math.round(currentCPUUsage) || 0}
 | |
|               prefix={<LaptopOutlined style={{ color: series[0].color }} />}
 | |
|               color={series[0].color}
 | |
|               progress
 | |
|               centered
 | |
|             />
 | |
|           </Col>
 | |
|           <Col>
 | |
|             <StatisticItem
 | |
|               title={series[1].name}
 | |
|               value={Math.round(currentRamUsage) || 0}
 | |
|               prefix={<BulbOutlined style={{ color: series[1].color }} />}
 | |
|               color={series[1].color}
 | |
|               progress
 | |
|               centered
 | |
|             />
 | |
|           </Col>
 | |
|           <Col>
 | |
|             <StatisticItem
 | |
|               title={series[2].name}
 | |
|               value={Math.round(currentDiskUsage) || 0}
 | |
|               prefix={<SaveOutlined style={{ color: series[2].color }} />}
 | |
|               color={series[2].color}
 | |
|               progress
 | |
|               centered
 | |
|             />
 | |
|           </Col>
 | |
|         </Row>
 | |
| 
 | |
|         <Chart
 | |
|           title={`% ${t(Localization.Admin.HardwareInfo.used)}`}
 | |
|           dataCollections={series}
 | |
|           color="#FF7700"
 | |
|           unit="%"
 | |
|         />
 | |
|       </div>
 | |
|     </>
 | |
|   );
 | |
| }
 | |
| 
 | |
| HardwareInfo.getLayout = function getLayout(page: ReactElement) {
 | |
|   return <AdminLayout page={page} />;
 | |
| };
 |