NetStatus.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { Button } from "antd";
  2. import { CloudOutlined } from "@ant-design/icons";
  3. import { useEffect, useState } from "react";
  4. import { useAppSelector } from "../../hooks";
  5. import { netStatus } from "../../reducers/net-status";
  6. interface IWidget {
  7. style?: React.CSSProperties;
  8. }
  9. const NetStatusWidget = ({ style }: IWidget) => {
  10. const [loading, setLoading] = useState(false);
  11. const [label, setLabel] = useState("online");
  12. const _netStatus = useAppSelector(netStatus);
  13. useEffect(() => {
  14. // 监听网络连接状态变化
  15. const onOnline = () => console.info("网络连接已恢复");
  16. const onOffline = () => console.info("网络连接已中断");
  17. window.addEventListener("online", onOnline);
  18. window.addEventListener("offline", onOffline);
  19. return () => {
  20. window.removeEventListener("online", onOnline);
  21. window.removeEventListener("offline", onOffline);
  22. };
  23. }, []);
  24. useEffect(() => {
  25. console.log("net status", _netStatus);
  26. switch (_netStatus?.status) {
  27. case "loading":
  28. setLoading(true);
  29. break;
  30. case "success":
  31. setLoading(false);
  32. break;
  33. case "fail":
  34. setLoading(false);
  35. break;
  36. default:
  37. break;
  38. }
  39. if (_netStatus?.message) {
  40. setLabel(_netStatus?.message);
  41. }
  42. }, [_netStatus]);
  43. return (
  44. <>
  45. <Button
  46. style={style}
  47. type="text"
  48. loading={loading}
  49. icon={<CloudOutlined />}
  50. >
  51. {label}
  52. </Button>
  53. </>
  54. );
  55. };
  56. export default NetStatusWidget;