StateBar.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import React from 'react';
  2. import { Space, Tooltip } from 'antd';
  3. import {
  4. HddOutlined,
  5. WifiOutlined,
  6. FireOutlined,
  7. BarChartOutlined,
  8. } from '@ant-design/icons';
  9. // 定义状态类型
  10. interface StatusBarProps {
  11. diskStatus: 'available' | 'warning' | 'unavailable'; // 磁盘状态
  12. batteryLevel: number; // 电量(0-100)
  13. wifiStrength: 0 | 1 | 2 | 3 | 4; // WiFi 信号强度
  14. heatCapacity: number; // 热容(0-100)
  15. }
  16. // 磁盘状态组件
  17. const DiskStatus: React.FC<{ status: StatusBarProps['diskStatus'] }> = ({
  18. status,
  19. }) => {
  20. let color: string;
  21. let title: string;
  22. switch (status) {
  23. case 'available':
  24. color = 'text-green-500'; // Tailwind 绿色
  25. title = '磁盘空间充足';
  26. break;
  27. case 'warning':
  28. color = 'text-yellow-500'; // Tailwind 黄色
  29. title = '磁盘空间警告';
  30. break;
  31. case 'unavailable':
  32. color = 'text-red-500'; // Tailwind 红色
  33. title = '磁盘不可用';
  34. break;
  35. default:
  36. color = 'text-gray-400';
  37. title = '未知状态';
  38. }
  39. return (
  40. <Tooltip title={title}>
  41. <HddOutlined className={`${color} text-[1em]`} />
  42. </Tooltip>
  43. );
  44. };
  45. // 电量组件
  46. const BatteryStatus: React.FC<{ level: number }> = ({ level }) => {
  47. const color =
  48. level <= 20
  49. ? 'text-red-500'
  50. : level <= 50
  51. ? 'text-yellow-500'
  52. : 'text-green-500';
  53. return (
  54. <Tooltip title={`电量: ${level}%`}>
  55. <BarChartOutlined className={`${color} h-full`} />
  56. <span className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-xs text-white">
  57. {level}
  58. </span>
  59. </Tooltip>
  60. );
  61. };
  62. // WiFi 信号组件
  63. const WifiStatus: React.FC<{ strength: StatusBarProps['wifiStrength'] }> = ({
  64. strength,
  65. }) => {
  66. const colors = [
  67. 'text-gray-400', // 0格
  68. 'text-red-500', // 1格
  69. 'text-orange-500', // 2格
  70. 'text-yellow-500', // 3格
  71. 'text-green-500', // 4格
  72. ];
  73. const title = `WiFi 信号: ${strength} 格`;
  74. return (
  75. <Tooltip title={title}>
  76. <WifiOutlined
  77. className={`${colors[strength]} ${strength === 0 ? 'scale-75' : 'scale-100'} h-full`}
  78. />
  79. </Tooltip>
  80. );
  81. };
  82. // 热容组件
  83. const HeatCapacityStatus: React.FC<{ capacity: number }> = ({ capacity }) => {
  84. const color =
  85. capacity <= 30
  86. ? 'text-red-500 border-red-500'
  87. : capacity <= 60
  88. ? 'text-yellow-500 border-yellow-500'
  89. : 'text-green-500 border-green-500';
  90. return (
  91. <Tooltip title={`热容: ${capacity}%`}>
  92. {/* 火焰 */}
  93. <FireOutlined className={`${color}`} />
  94. </Tooltip>
  95. );
  96. };
  97. // 主状态栏组件
  98. const StatusBar: React.FC<StatusBarProps> = ({
  99. diskStatus,
  100. batteryLevel,
  101. wifiStrength,
  102. heatCapacity,
  103. }) => {
  104. return (
  105. // <div className="flex justify-end p-2">
  106. <Space className="h-full">
  107. <DiskStatus status={diskStatus} />
  108. <BatteryStatus level={batteryLevel} />
  109. <WifiStatus strength={wifiStrength} />
  110. <HeatCapacityStatus capacity={heatCapacity} />
  111. </Space>
  112. // </div>
  113. );
  114. };
  115. export default StatusBar;
  116. export type { StatusBarProps };
  117. export { DiskStatus, BatteryStatus, WifiStatus, HeatCapacityStatus };
  118. export type DiskStatusType = 'available' | 'warning' | 'unavailable';